用Delphi中的listbox替换stringgrid

时间:2012-01-04 16:46:22

标签: delphi

我正在尝试将stringgrid1stringgrid2分别替换为listbox1listbox2。他们以任何方式我能做到吗?如果listbox无法做,可能有人建议我应该使用而不是stringgrid来显示信息吗?我是德尔福的新手。

这是我的代码:

procedure TForm2.FormCreate(Sender: TObject);
var i:integer;
begin
stringgrid1.ColWidths[0]:=20;
stringgrid2.ColWidths[0]:=20;
for i:=1 to 50 do begin
    stringgrid1.Cells[0,i]:=inttostr(i-1);
    stringgrid2.Cells[0,i]:=inttostr(i-1);
    stringgrid2.Cells[1,i]:='0';
end;
  stringgrid2.Cells[1,0]:='name';
  stringgrid1.Cells[1,0]:='extension';
  stringgrid1.Cells[2,0]:='format';
  stringgrid1.Cells[3,0]:='size';
  stringgrid1.Cells[4,0]:='date';
  stringgrid1.Cells[5,0]:='addres';
end;

procedure TForm2.StringGrid2DblClick(Sender: TObject);
begin
if (stringgrid2.Cells[1,stringgrid2.Row]<>'1024') and (stringgrid2.Cells[1,stringgrid2.Row]<>'0') then
  stringgrid1.Row:=strtoint(stringgrid2.Cells[1,stringgrid2.Row]);

end;

端。

Procedure HD;
var i:integer;
begin
   for i:=0 to 50 do begin
     form2.StringGrid1.Cells[1,i+1]:=TABLE[i].name;
     form2.StringGrid1.Cells[2,i+1]:=TABLE[i].format;
     if TABLE[i].tip then
           form2.StringGrid1.Cells[3,i+1]:='folder'
     else
           form2.StringGrid1.Cells[3,i+1]:='file';
     form2.StringGrid1.Cells[4,i+1]:=inttostr(TABLE[i].nach);
     form2.StringGrid1.Cells[5,i+1]:=inttostr(TABLE[i].razmer);
     form2.StringGrid2.Cells[1,i+1]:=inttostr(fat[i]);;
   end;
end;

5 个答案:

答案 0 :(得分:4)

使用TListView代替TStringGrid。将TStringGrid组件替换为TListView组件,将ViewStyle设置为vsReport,根据需要设置其Columns个收藏集,然后按如下方式更新代码:

procedure TForm2.FormCreate(Sender: TObject); 
var
  i: integer; 
begin 
  // NOTE: this can all be done at design-time so
  // you don't need to do it in code at runtime!
  ListView1.Colums[0].Width := 20; 
  ListView2.Colums[0].Width := 20; 
  for i := 0 to 49 do begin 
    ListView1.Items.Add.Caption := IntToStr(i); 
    with ListView2.Items.Add do begin
      Caption := IntToStr(i); 
      SubItems.Add('0'); 
    end;
  end; 
  ListView2.Columns[1].Caption := 'name'; 
  ListView1.Columns[1].Caption := 'extension'; 
  ListView1.Columns[2].Caption := 'format'; 
  ListView1.Columns[3].Caption := 'size'; 
  ListView1.Columns[4].Caption := 'date'; 
  ListView1.Columns[5].Caption := 'addres'; 
end; 

procedure TForm2.ListView2DblClick(Sender: TObject); 
var
  Item: TListItem;
begin 
  Item := ListView2.Selected;
  if Item = nil then Exit;  
  if (Item.SubItems[0] <> '1024') and (Item.SubItems[0] <> '0') then 
    ListView1.Selected := ListView1.Items[StrToInt(Item.SubItems[0])];
end; 

procedure HD; 
var
  i: integer; 
begin 
  for i := 0 to 49 do begin 
    with form2.ListView1.Items[i] do begin
      SubItems[0] := TABLE[i].name;
      SubItems[1] := TABLE[i].format; 
      if TABLE[i].tip then 
        SubItems[2] := 'folder' 
      else 
        SubItems[2] := 'file'; 
      SubItems[3] := IntToStr(TABLE[i].nach); 
      SubItems[4] := IntToStr(TABLE[i].razmer); 
    end;
    form2.ListView2.Items[i].SubItems[0] := IntToStr(fat[i]);
  end; 
end;

话虽如此,根据实际填写TABLE[]fat[]的方式和时间,您可以通过将TListView.OwnerData属性设置为True来更进一步将ListViews置于虚拟模式,然后使用TListView.OnData事件动态显示数据。这样,您就可以完全摆脱HD()程序,因为您的数据不再需要复制到TListView本身,可以从TABLE[]和{{1直接代替,例如:

fat[]

答案 1 :(得分:3)

如果您不喜欢StringGrid,可以使用带有报告样式和多列的TListView。

答案 2 :(得分:1)

实际上,您可以在列表框中显示网格数据,但这不是新手的练习。该技术基于LB_SETTABSTOPS消息处理,并在Ray Konopka's book中进行了描述。使用ListView是一种更简单的替代方法。

答案 3 :(得分:1)

列表框旨在保存一个列举的值(省,信用卡类型或性别)的垂直列表,而不是带有标题的多列显示。

如果你想要更好的东西,你应该使用更强大的网格组件,而不是列表框。

您也可以使用TListView,但我不建议为新人使用该方法。我花了很多时间在视图样式模式“vsReport”中使用TListView,我发现它比TStringGrid更有限,例如,它没有提供就地编辑支持。

相反,对于一个新人,我建议你继续使用TStringGrid,直到你需要做的事情(你还没有指定!)用TStringGrid做不到,因为你需要做一些简单的代码如图所示,似乎TStringGrid完全符合你的要求,所以它听起来只是你在这里没有任何好处。

你准备做什么?您想要的TStringGrid代码有什么问题可以做些什么来改变控件?

答案 4 :(得分:0)

随着时间的流逝 - 您可能想要添加更多功能。 最好的将是VirtualTreeView