如何在delphi中正确使用Listview?

时间:2011-12-23 11:26:24

标签: delphi delphi-2010 tlistview

我的代码如下,它工作正常但是,但在编译程序后,我看到所有的全名和国家/地区垂直列出如下:

_________________________________
  Fullname1
  国家1
  Fullname2
  COUNTRY2
  Fullname3
  COUNTRY3
  等...

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;

但我想要的东西像:

enter image description here

5 个答案:

答案 0 :(得分:18)

首先:添加列标题:

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

答案 1 :(得分: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,以便将列表视图显示为网格。

答案 2 :(得分:3)

我不确定如何将listview变为多行,但我知道你没有正确使用Query。 现在你的代码有一个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;

答案 3 :(得分:2)

Delphi文档包含这个example,它完全符合您的要求。

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文档受到很多诽谤,但它通常都有非常有用的例子。示例的网关页面是here,示例甚至可以在sourceforge上找到,因此您可以使用自己喜欢的svn客户端查看它们。

答案 4 :(得分: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;