Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TListView füllen dauert lange - Geht es auch schneller? (https://www.delphipraxis.net/90827-tlistview-fuellen-dauert-lange-geht-es-auch-schneller.html)

Ares 24. Apr 2007 13:54


TListView füllen dauert lange - Geht es auch schneller?
 
Hallo!

Ich habe mir einen Dialog gebastelt, in dem einige Elemente in einer ListView angezeigt werden. Beim Aufruf wird ein Array mit den Elemente an den Dialog übergeben, die ListView gefüllt und der Dialog angezeigt. Bei 70 Elemenenten dauert es schon ca. 2-3 Sekunden bis der Dialog nach dem Aufruf erscheint. Das ist natürlich keine Ewigkeit, stört die flüssige Bedienung aber trotzdem merklich.

Bevor ich die Elemente Einfüge habe ich ListView.Items.BeginUpdate und anschließend EndUpdate ausgeführt, dies ändert jedoch nicht. Gibt es sonst eine möglichkeit das Füllen zu beschleunigen? Es kann ja nicht sein, dass ein moderner PC 3 Sekunden braucht um 70 Elemente in eine Liste zu schreiben...

Ich bin für jeden Tipp dankbar.

Gruß
Ares

matashen 24. Apr 2007 13:56

Re: TListView füllen dauert lange - Geht es auch schneller?
 
Wie übergibst du die Elemente?

zeig mal den Codeschnipsel

CCRDude 24. Apr 2007 13:57

Re: TListView füllen dauert lange - Geht es auch schneller?
 
Tipp: virtuelle Liste :)

Die Daten in dem Array behalten, MeinListView.Items.Count setzen und nur in MeinListView.OnData ans Listview liefern. Damit werden die wirklich erst wenn Sie angezeigt werden müssen in TListItems verpackt.

Schubi 24. Apr 2007 13:58

Re: TListView füllen dauert lange - Geht es auch schneller?
 
Du kannst dir ein TStrings erzeugen, da rein schreiben und das Ganze dann der ListBox mit Items.Assign zuweisen.
Ich hab allerdings keine Ahnung ob das schneller wäre.

matashen 24. Apr 2007 14:09

Re: TListView füllen dauert lange - Geht es auch schneller?
 
Ich häts auch so wie schubi gemacht, deswegen meine Frage.

Schubi 24. Apr 2007 14:25

Re: TListView füllen dauert lange - Geht es auch schneller?
 
Wäre das schneller? bin mir wie erwähnt nicht sicher.
Warum dauert das überhaupt?
Am hinzufügen zu TStrings kanns net liegen, da muss doch die Lisbox noch irgendwie zwischenrein meeren, oder?

Ares 24. Apr 2007 14:53

Re: TListView füllen dauert lange - Geht es auch schneller?
 
Hallo!

Die Daten sehen so aus:

Delphi-Quellcode:
TMyEnum = (mnOne, mnTwo);

TMyInfo = record
  str1: String;
  str2: String;
  num : TMyEnum ;
end;

TMyInfos= array of TMyInfo;
Gefüllt wird die ListView dann so:

Delphi-Quellcode:
procedure TMyDlg.fillListView(Infos: TMyInfos; AListView: TListView);
var i: Integer;
    newListItem: TListItem;
begin
   AListView.Clear;
   AListView.Items.BeginUpdate;

   for i:=0 to length(Infos)-1 do begin
      newListItem := AListView.Items.Add; ;
      newListItem.Caption := Infos[i].str1;
      newListItem.SubItems.Add(Infos[i].str2);
      if (Infos[i].num=mnOne) then begin
         newListItem.SubItems.Add('One');
         newListItem.Checked := true;
      end else begin
         newListItem.SubItems.Add('Two');
         newListItem.Checked := false;
      end;
   end;

   AListView.Items.EndUpdate;
end;
Ist der Code vielleicht zu kompliziert? Mir fällt allerdings nicht ein, was man großartig anders machen könnte...

Gruber_Hans_12345 24. Apr 2007 14:55

Re: TListView füllen dauert lange - Geht es auch schneller?
 
guck dir mal den VirtualStringTree an, der wäre für sowas ideal

CCRDude 24. Apr 2007 14:57

Re: TListView füllen dauert lange - Geht es auch schneller?
 
Infos private in der Form, dann virtuell, wie ich schon sagte:

Delphi-Quellcode:
MyListView.OwnerData := true;
MyListView.Items.Count = Length(Infos);

procedure TMyDlg.MyListViewData(Item: TListItem);
begin
   if Item.Index>=Length(Infos)
    then Exit;
   Item.Caption := Infos[Item.Index].str1;
   Item.SubItems.Add(Infos[Item.Index].str2);
   if (Infos[Item.Index].num=mnOne) then begin
      Item.SubItems.Add('One');
      Item.Checked := true;
   end else begin
      Item.SubItems.Add('Two');
      Item.Checked := false;
    end;
end;
Dadurch wird Infos nur noch dann verarbeitet, wenn die GUI die Anzeige verlangt (bzw. Du Funktionen wie sortieren etc. aufrufen würdest).

(PS: VirtualStringTree ist da doch schon eher Overkill, virtuell können auch normale Listen ;) )

sniper_w 24. Apr 2007 15:05

Re: TListView füllen dauert lange - Geht es auch schneller?
 
Vesuch es damit:
Delphi-Quellcode:
ListView.ViewStyle := vsList;
//
//die ListView mit Daten füllen
//
ListView.ViewStyle := vsReport; // oder was auch immer gebraucht wird


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:59 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz