Ez az eljárás lesz a DBGridToListView, melynél első lépésünk az, hogy letiltjuk a tartalmának újrarajzolását a BeginUpdate eljárás hívásával. Így tetszőleges számú elemet hozzáadhatunk anélkül, hogy az megjelenne. Ezáltal a feltöltés gyorsabb lesz és ráérünk majd csak ennek végeztével újrarajzoltatni a komponens területét.
Beállítjuk a ListView-et vsReport nézetre, hogy több oszlop is megadható legyen, mint ami a DBGrid-ben van, majd töröljük az esetleges tartalmat és meglévő oszlopokat.
procedure DBGridToListView(DBGrid: TDBGrid; ListView: TListView);
begin
ListView.Items.BeginUpdate;
ListView.ViewStyle:=vsReport;
ListView.Items.Clear;
ListView.Columns.Clear;
Egy ciklus segítségével létrehozzuk a ListView új oszlopait, melyeknek száma, felirata és igazítása egyezni fog a DBGrid-ben lévő oszlopokkal.
for i:=0 to DBGrid.Columns.Count-1 do begin
with ListView.Columns.Add do begin
Caption:=DBGrid.Columns[i].Title.Caption;
Width:=DBGrid.Columns[i].Width+10;
Alignment:=DBGrid.Columns[i].Alignment;
end;
end;
Amint adottak az oszlopok, következhetnek a sorok. Ehhez el kell érnünk a DBGrid-hez kötött TTable komponenst. Fontos tudnivaló, hogy jelen megoldásunk csak TTable-val működik, mivel csak erre lett felkészítve az eljárásunk, így ne használjunk olyan DBGrid-et, melyhez egy TQuery kapcsolódik.
Mivel végig kell mennünk az adattábla összes során, így letiltjuk a táblához tartozó megjelenítő kontrolokat a DisableControls eljárással. Ekkor, ahogy lépkedünk az egyes sorokon, a DBGrid aktuális sora nem változik, ezáltal gyorsabb lesz az adatátvitel.
Mielőtt ennek nekilátnánk, egy könyvjelzőt is elhelyezünk az aktuális sorra, hogy az adatátvitel után visszaállhassunk az eredeti pontra.
t:=DBGrid.DataSource.DataSet as TTable;
t.DisableControls;
bo:=t.GetBookmark;
Az adatátvitelhez a tábla első sorára ugrunk majd egy while ciklussal végigmegyünk az összes soron.
t.First;
while not t.Eof do begin
ListView-hez hozzáadunk egy-egy sort, ahol az első oszlop adatát annak Caption property-jén keresztül állítjuk be, majd a többi oszlop adatát a SubItems property-n keresztül adjuk hozzá egyesével egy for ciklus segítségével.
with ListView.Items.Add do begin
Caption:=VarAsType(t.FieldValues[DBGrid.Columns[0].Field.FieldName], varString);
for i:=1 to DBGrid.Columns.Count-1 do begin
SubItems.Add(VarAsType(t.FieldValues[DBGrid.Columns[i].Field.FieldName], varString));
end;
end;
t.Next;
end;
Végül visszaállítunk mindent az eredeti állapotba és engedélyezzük a ListView újrarajzolását, mely most már tartalmazza a DBGrid minden adatát.
t.GotoBookmark(bo);
t.FreeBookmark(bo);
t.EnableControls;
ListView.Items.EndUpdate;
end;