1

私のコードは以下のとおりですが、正しく機能していますが、プログラムをコンパイルした後、すべてのフルネームと国が縦にリストされているのがわかります。

_________________________________
フルネーム
1カントリー
1フルネーム2カントリー2
フルネーム3
カントリー
3
など..

SQLQuery1.SQL.Text := 'SELECT * FROM users where user_age="'+age+'"';
SQLQuery1.Open;
rec := SQLQuery1.RecordCount;

SQLQuery1.First; // move to the first record
ListView1.Visible := false;
if rec>0 then
begin
while(not SQLQuery1.EOF)do begin
ListView1.Visible := true;
        // do something with the current item
ListView1.AddItem('Full name: '+SQLQuery1['fullname'], Self);
ListView1.AddItem('Country: '+SQLQuery1['cntry'], Self);

    // move to the next record

SQLQuery1.Next;

end;

しかし、私は次のようなものが欲しいです:

ここに画像の説明を入力してください

4

5 に答える 5

20

最初に:列ヘッダーを追加します:

var
  Col: TListColumn;
begin
  Col := ListView1.Columns.Add;
  Col.Caption := 'Name';
  Col.Alignment := taLeftJustify;
  Col.Width := 140;

  Col := ListView1.Columns.Add;
  Col.Caption := 'Country';
  Col.Alignment := taLeftJustify;
  Col.Width := 140;
end;

次に、次のようにレコードを追加します。

var
  Itm: TListItem;
begin
    // start of your query loop
    Itm := ListView1.Items.Add;
    Itm.Caption := SQLQuery1['fullname'];
    Itm.SubItems.Add(SQLQuery1['cntry']);
    // end of your query loop
end;

アップデート:

もちろん、スクリーンショットのようにリストを取得するには、ListViewのViewStyleプロパティを次のように設定する必要があります。vsReport

于 2011-12-23T11:46:00.293 に答える
4

コードは次のようになります。

var
  ListItem: TListItem;

  ...

  ListView.Items.BeginUpdate;
  try
    while(not SQLQuery1.EOF)do begin
      ListItem:= ListView.Items.Add;
      ListItem.Caption:= 'Full name: '+SQLQuery1['fullname'];
      with ListItem.SubItems do begin
        Add('Country: '+SQLQuery1['cntry']);
// if you need more columns, add here
      end;
      SQLQuery1.Next;
    end;
  finally
    ListView.Items.EndUpdate;
  end;

リストビューをグリッドとして表示するように設定ListView.Styleする必要もあります。vsReport

于 2011-12-23T11:46:23.187 に答える
3

リストビューを複数行にする方法はわかりませんが、クエリを正しく使用していないことはわかっています。現状では、コードにはSQLインジェクションの穴があり、ループ内の「fieldbyname」への暗黙の参照により、コードが遅くなります。

var
  FullName: TField;
  Country: TField;
  ListItem: TListItem;
begin
  //Use Params or suffer SQL-injections
  SQLQuery1.SQL.Text := 'SELECT * FROM users where user_age= :age';
  SQLQuery1.ParamByName('age').AsInteger:= age;
  SQLQuery1.Open;
  if SQLQuery1.RecordCount = 0 then Exit;
  //Never use `FieldByName` inside a loop, it's slow.
  FullName:= SQLQuery1.FieldByName('fullname');
  Country:= SQLQuery1.FieldByName('cntry');
  ListView1.Style:= vsReport;

  SQLQuery1.First; // move to the first record
  SQLQuery1.DisableControls; //Disable UI updating until where done.
  try
    ListView1.Items.BeginUpdate;
    //ListView1.Visible := false;
    while (not SQLQuery1.EOF) do begin
      //Code borrowed from @Serg
      ListItem:= ListView.Items.Add;
      ListItem.Caption:= 'Full name: '+Fullname.AsString;
      ListItem.SubItems.Add('Country: '+Country.AsString);
      SQLQuery1.Next;  
    end; {while}
  finally
    SQLQuery1.EnableControls;
    ListView1.Items.EndUpdate;
  end;
end;
于 2011-12-23T11:47:34.883 に答える
2

Delphiのドキュメントには、まさにあなたが望むことを行うこの例が含まれています。

procedure TForm1.FormCreate(Sender: TObject);
const
  Names: array[0..5, 0..1] of string = (
    ('Rubble', 'Barney'),
    ('Michael', 'Johnson'),
    ('Bunny', 'Bugs'),
    ('Silver', 'HiHo'),
    ('Simpson', 'Bart'),
    ('Squirrel', 'Rocky')
    );

var
  I: Integer;
  NewColumn: TListColumn;
  ListItem: TListItem;
  ListView: TListView;
begin
  ListView := TListView.Create(Self);
  with ListView do
  begin
    Parent := Self;
    Align := alClient;
    ViewStyle := vsReport;

    NewColumn := Columns.Add;
    NewColumn.Caption := 'Last';
    NewColumn := Columns.Add;
    NewColumn.Caption := 'First';

    for I := Low(Names) to High(Names) do
    begin
      ListItem := Items.Add;
      ListItem.Caption := Names[I][0];
      ListItem.SubItems.Add(Names[I][2]);
    end;
  end;
end;

Delphiのドキュメントは非常に悪意のあるものですが、多くの場合、このような非常に便利な例があります。例へのゲートウェイページはここにあり、例はsourceforgeでも利用できるため、お気に入りのsvnクライアントを使用して確認できます。

于 2011-12-23T12:26:19.767 に答える
0
Procedure TForm1.GetUsers;
var
  ListItem: TListItem;
begin
  try
    ListView1.Items.BeginUpdate;
    try
      ListView1.Clear;
      MySQLQuery.SQL.Clear;
      MySQLQuery.SQL.Add('select * from users;');
      MySQLQuery.Open;
      while (not MySQLQuery.EOF) do
      begin
        ListItem := ListView1.Items.Add;
        ListItem.Caption:= VarToSTr(MySQLQuery['username']);
        with ListItem.SubItems do
          begin
            Add(VarToSTr(MySQLQuery['password']));
            Add(VarToSTr(MySQLQuery['maxscore']));
          end;
        MySQLQuery.Next;
      end;
      MySQLQuery.Close;
    finally
      ListView1.Items.EndUpdate;
    end;
  except
    on E: Exception do
        MessageDlg(PWideChar(E.Message), TMsgDlgType.mtError, [TMsgDlgBtn.mbOK], 0);
  end;
end;
于 2013-07-29T16:32:20.770 に答える