Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Wie Listview schnell füllen (1500 DS aus Query) ? (https://www.delphipraxis.net/19483-wie-listview-schnell-fuellen-1500-ds-aus-query.html)

sirtoby73 4. Apr 2004 11:04


Wie Listview schnell füllen (1500 DS aus Query) ?
 
Ich habe 4 ADOQuerys, deren Inhalt ich nacheinander in ein Listview fülle. Das sieht dann beispielhaft so aus:


Delphi-Quellcode:
mylistview.items.beginupdate;
while not ADOQuery_1.eof do begin
  NewItem := Self.mylistview.Items.Add;
  NewItem.Caption := ADOQuery_1['Name'];
  NewItem.ImageIndex := 1; //Symbol für alle DS aus ADOQuery_1
  next;
end;
.
. (Durchlaufen der Querys 2 und 3)
.
while not ADOQuery_4.eof do begin
  NewItem := Self.mylistview.Items.Add;
  NewItem.Caption := ADOQuery_4['Name'];
  NewItem.ImageIndex := 4 //Symbol für alle DS aus ADOQuery_4
  next;
end;
mylistview.items.endupdate;
Die Anzahl der Datensätze über alle 4 Querys ist etwa 1500.
Das Füllen dauert bei mir ca. 2 Sek.

Geht das nicht irgendwie schneller ? :gruebel:

SirThornberry 4. Apr 2004 11:12

Re: Wie Listview schnell füllen (1500 DS aus Query) ?
 
Schau mal nach BeginUpdate und EndUpdate (Als Member von items oder so). Das verhindert das ständige neuzeichnen beim anlegen eines jeden items

Mirilin 4. Apr 2004 11:15

Re: Wie Listview schnell füllen (1500 DS aus Query) ?
 
:gruebel:
hat er doch

SirThornberry 4. Apr 2004 11:17

Re: Wie Listview schnell füllen (1500 DS aus Query) ?
 
ups, habsch irgendwie übersehen. Naja - 2 Sekunden für soviele Datensätze ist eigentlich akzeptabel finde ich. Ne Lösung wäre noch das du erstmal nur soviele Datensätze in die Listview lädst wie angezeigt werden können und die restlichen dann später nachlädst

Sharky 4. Apr 2004 11:19

Re: Wie Listview schnell füllen (1500 DS aus Query) ?
 
Hai sirtoby73,

wie lange läuft denn deine Procedure wenn Du keine neuen Items zu der Listview hinzufügst?
Sprich: Wie lange dauert das durchlaufen deiner vier Tabellen? Eventuell liegt dort ja das Problem.

sirtoby73 4. Apr 2004 11:37

Re: Wie Listview schnell füllen (1500 DS aus Query) ?
 
Hallo zusammen, erstmal danke für Eure Antworten !

@Sharky: Auf die Idee bin ich inzwischen auch gekommen. Ich werde wohl mal die Zeiten analysieren, die für das Durchlaufen der Querys und das Füllen des Listview verbraten werden.

@SirThornberry: Zwei Sekunden sind leider zu lang, weil der Benutzer per Drag and Drop Einträge aus dem Listview entfernen kann und deshalb das Listview sehr häufig komplett neu gefüllt werden muss.
Auch der Wechsel des aktuellen Datums, das die Einträge innerhalb des Listview maßgeblich bestimmt, muss ein Neubefüllen des Listview zur Folge haben.
Beides sind Aktionen, die bei der Bedienung sehr häufig vorkommen. Daher sind zwei Sekunden leider nicht akzeptabel.


Gibt es nicht die Möglichkeit, nur einen Ausschnitt der Datenmenge(n) im Listview anzuzeigen ? Wenn ja, wie geht das ?
Ich habe da nur Stichworte wie OwnerData im Kopf. Aber leider noch kein gutes Beispiel gefunden, das mir klar macht, wie man das anwendet.

sirtoby73 4. Apr 2004 12:17

Re: Wie Listview schnell füllen (1500 DS aus Query) ?
 
So, ich habe mal ein paar Timestamps eingebaut und - wie Sharky schon vermutet hatte - dem Listview zu Unrecht die Schuld in die Schuhe geschoben.

Die Fakten:
1500 Datensätze
Zeit für das Durchlaufen der 4 Querys mit Befüllen des Listview: 3,9 Sek.
ohne Befüllen des Listview: 3,5 Sek.

Daraus folgt, dass ich irgendwie schneller an die Daten kommen muss, das Füllen des Listview ist nicht das Problem.
Gibt es eine schnellere Methode, das Ergebnis einer ADOQuery zu durchlaufen ? Der übliche Code ist offensichtlich nicht sehr performant:

Code:
while not ADOquery.eof then
  // ...mache was
  ADOquery.next
end;
Könnte man vielleicht das Ergebnis der Query in eine Art Zwischenspeicher (ClientDataSet oder so was) schieben, der sich schneller durchlaufen lässt ? Wäre für weitere Hinweise dankbar...

Sharky 4. Apr 2004 12:28

Re: Wie Listview schnell füllen (1500 DS aus Query) ?
 
Hai sirtoby73,

ich denke eher das dein Ansatz, die ListView immer neu zu füllen, falsch ist.
Gibt es keine Möglichkeit dies zum umgehen?

sirtoby73 4. Apr 2004 15:15

Re: Wie Listview schnell füllen (1500 DS aus Query) ?
 
@Sharky

Sieht tatsächlich so aus, dass ich das ListView besser nicht jedesmal ganz neu füllen sollte.
Ich muss mir da wohl einen intelligenteren Weg überlegen :warn:

andy09071978 7. Apr 2004 17:21

Re: Wie Listview schnell füllen (1500 DS aus Query) ?
 
hallo,

hm, ich denke auch, der Ansatz ist falsch...

Benütze gezielt

Delphi-Quellcode:
Form1.ListView1.Items.Delete[Index];
um ein Index-tes Element zu löschen. Dies funktioniert natürlich nur, wenn du den Index beim Löschen kennst. Dürfte aber nicht allzu schwer sein, bei ner Datenbank.
Der quasi Umkehrbefehl lautet:

Delphi-Quellcode:
Form1.ListView1.Items.AddItem(TItemList, Index);

Was bei ner reinen Anzeige auf jeden Fall funktioniert: Mit einem extra Thread arbeiten, der im Hintergrund den Rest des ListView-Objektes füllt. Das war aber nicht ganz einfach zu programmieren und macht in Deinem Fall wenig Sinn.

PS: Wie sortierst Du denn die Daten ?

Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:10 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