Replacing stringgrid with listbox in Delphi

I am trying to replace stringgrid1 and stringgrid2 with listbox1 and listbox2 respectively. Is there any way I can do this? If listbox can't do it, can anyone suggest what should I use instead of stringgrid to display information? I am new to Delphi.

This is my code:

 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; 

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; 
+6
source share
5 answers

Use TListView instead of TStringGrid . Replace TStringGrid components with TListView components, set their ViewStyle to vsReport , configure their Columns collections if necessary, and then update your code as follows:

 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; 

With that said, depending on how and when TABLE[] and fat[] are actually populated, you can take it one step further by setting the TListView.OwnerData properties to True to put the ListViews in virtual mode, and then use the TListView.OnData event TListView.OnData to dynamically display your data. Thus, you can completely get rid of your HD() procedure, since your data no longer needs to be copied to TListView , it can be displayed directly from TABLE[] and fat[] , for example:

 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; 
+4
source

If you don't like StringGrid, you can use a TListView with a report type and multiple columns.

+3
source

In fact, you can display grid data in a list, but this is not an exercise for beginners. This technique is based on LB_SETTABSTOPS message LB_SETTABSTOPS and is described in Ray Konopka’s book . Using ListView is a lot easier.

+1
source

The list should contain one vertical list of enumerated values ​​(provinces, types of credit cards or gender groups), and not a multi-column display with headers.

If you need something better, you should use a more powerful grid component, not a list.

You can also use TListView, but I do not recommend this approach for a new person. I just spent a lot of time working with TListView in the "vsReport" view style mode, and I believe that it is even more limited than TStringGrid, for example, it does not support in-place editing support.

Instead, for a new person, I recommend that you stay with TStringGrid until you need something (which you did not specify!) That cannot be done with TStringGrid, since for the trivial code you have shown, it seems that TStringGrid does exactly what you want and therefore it sounds as if you are doing work without any benefit here.

What are you trying to do this? What is the problem with your TStringGrid code that you want to do something to change for management?

+1
source

over time - you probably would like to add additional features. VirtualTreeView would be best

0
source

Source: https://habr.com/ru/post/905113/


All Articles