我试图分别用stringgrid1stringgrid2替换listbox1listbox2。他们有什么办法可以做到吗?如果不能使用listbox来显示信息,那么有人建议我使用什么而不是使用stringgrid吗?我是Delphi的新手。

这是我的代码:

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;

最佳答案

使用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[]fat[]显示,例如:

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;
  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';
  //

  ListView1.Items.Count := 50;
  ListView2.Items.Count := 50;
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 TForm2.ListView1Data(Sender: TObject; Item: TListItem);
begin
  Item.Caption := IntToStr(Item.Index);
  Item.SubItems.Add(TABLE[Item.Index].name);
  Item.SubItems.Add(TABLE[Item.Index].format);
  if TABLE[i].tip then
    Item.SubItems.Add('folder')
  else
    Item.SubItems.Add('file');
  Item.SubItems.Add(IntToStr(TABLE[i].nach));
  Item.SubItems.Add(IntToStr(TABLE[i].razmer))
end;

procedure TForm2.ListView2Data(Sender: TObject; Item: TListItem);
begin
  Item.Caption := IntToStr(Item.Index);
  Item.SubItems.Add(IntToStr(fat[i]));
end;

10-05 22:15