AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Wie Listview schnell füllen (1500 DS aus Query) ?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie Listview schnell füllen (1500 DS aus Query) ?

Ein Thema von sirtoby73 · begonnen am 4. Apr 2004 · letzter Beitrag vom 7. Apr 2004
Antwort Antwort
Seite 1 von 2  1 2      
sirtoby73

Registriert seit: 17. Sep 2003
19 Beiträge
 
Delphi 7 Professional
 
#1

Wie Listview schnell füllen (1500 DS aus Query) ?

  Alt 4. Apr 2004, 12:04
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

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

  Alt 4. Apr 2004, 12:12
Schau mal nach BeginUpdate und EndUpdate (Als Member von items oder so). Das verhindert das ständige neuzeichnen beim anlegen eines jeden items
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Mirilin
Mirilin

Registriert seit: 21. Dez 2002
Ort: Lenzburg
861 Beiträge
 
Delphi 6 Professional
 
#3

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

  Alt 4. Apr 2004, 12:15

hat er doch
Tobias
Die Physik ist für die Physiker eigentlich viel zu schwer.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

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

  Alt 4. Apr 2004, 12:17
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
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#5

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

  Alt 4. Apr 2004, 12:19
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.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
sirtoby73

Registriert seit: 17. Sep 2003
19 Beiträge
 
Delphi 7 Professional
 
#6

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

  Alt 4. Apr 2004, 12:37
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.
  Mit Zitat antworten Zitat
sirtoby73

Registriert seit: 17. Sep 2003
19 Beiträge
 
Delphi 7 Professional
 
#7

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

  Alt 4. Apr 2004, 13:17
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...
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#8

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

  Alt 4. Apr 2004, 13:28
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?
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
sirtoby73

Registriert seit: 17. Sep 2003
19 Beiträge
 
Delphi 7 Professional
 
#9

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

  Alt 4. Apr 2004, 16:15
@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
  Mit Zitat antworten Zitat
andy09071978

Registriert seit: 7. Apr 2004
1 Beiträge
 
#10

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

  Alt 7. Apr 2004, 18:21
hallo,

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

Benütze gezielt

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:

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ß
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:11 Uhr.
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