Delphi-PRAXiS

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 Listview.Clear dauert zu lange. Gibt es eine schnellere Methode? (https://www.delphipraxis.net/161413-listview-clear-dauert-zu-lange-gibt-es-eine-schnellere-methode.html)

juergen 2. Jul 2011 17:16


Listview.Clear dauert zu lange. Gibt es eine schnellere Methode?
 
Hallo zusammen,

ich verwende eine Listview welche schon mal einige tausend Datensätze enthalten kann. Die Datensätze werden beim wechseln von TabPage1 auf TabPage2 generiert und die Listview zeígt diese dann an.
Wenn ich wieder auf Tab1 wechsel wird der Inhalt der Listview mit Clear gelöscht.
Das dauert schon mal einige Sekunden...
Gibt es hierfür eine schnellere Methoden?


Danke schon mal vorab!

mkinzler 2. Jul 2011 17:24

AW: Listview.Clear dauert zu lange. Gibt es eine schnellere Methode?
 
Hast du die Anpassung der Anzeige währrend des Löschvorgangs abgeschaltet?

juergen 2. Jul 2011 17:32

AW: Listview.Clear dauert zu lange. Gibt es eine schnellere Methode?
 
ich habe in ComCtrls.pas gesehen, dass beim Clear schon ein BeginUpdate/EndUpdate ausgeführt wird.
Oder meinst du was ganz anderes?

mkinzler 2. Jul 2011 17:33

AW: Listview.Clear dauert zu lange. Gibt es eine schnellere Methode?
 
Nein, das habe ich gemeint.

Keldorn 2. Jul 2011 18:05

AW: Listview.Clear dauert zu lange. Gibt es eine schnellere Methode?
 
Hallo

wenn das löschen schon so lange dauert, was meinst Du, wielange dann das Erstellen dauert ;-).
wenn Du wirklich tausende anzeigst, wird das ganz schnell ganz langsam.

Hast Du Dir schonmal den virtuellen Modus des Listviews angeschaut? Damit wird beides um Einiges schneller.

Gruß Frank

juergen 2. Jul 2011 18:19

AW: Listview.Clear dauert zu lange. Gibt es eine schnellere Methode?
 
Hallo Frank,

ich habe mich damals für die Listview entschieden, weil ich schnell zum Ergebnis kam (benötigt wurden Chekcboxen und mehrere Spalten). Im Moment scheue ich mich auch mich in Virtual Treeview einzuarbeiten. :oops:

Das man eine Listview in den virtuellen Modus setzen kann ist mir neu.
Wie geht das?
Bei einer Listbox z.B. kenne ich das über die Eigenschaft Style. Aber bei einer Listview?

Edit: Habe es gerade gefunden... Virtueller Modus wird über OwnerData aktiviert. Ich teste das ganze mal.

Schon mal Danke an Euch beiden für die Antworten!

FredlFesl 2. Jul 2011 18:48

AW: Listview.Clear dauert zu lange. Gibt es eine schnellere Methode?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Nimm doch einfach den VirtualMode (OwnerData=True), dann kannst Du 100.000.000.000 Einträge haben und sowohl der Aufbau als auch das Clear geht in 0.01ns (geschätzt)

jaenicke 2. Jul 2011 19:05

AW: Listview.Clear dauert zu lange. Gibt es eine schnellere Methode?
 
Wobei ich da eine VirtualStringTree besser finde, die kann viel mehr. Und ist auch nicht schwerer zu benutzen.
Delphi-Quellcode:
type
  // Die Datenklasse
  TMyData = class
  private
  public
    property FirstColumnData: string ...
  end;

  // Die Liste der Daten
  TMyDataList = class(TObjectList<TMyData>);

// initialisieren
vstListDisplay.NodeDataSize := SizeOf(TMyData);
MyDataList := TMyDataList.Create(True);

// Neuen Knoten erzeugen
MyData := TMyData.Create;
MyData.FirstColumnData := ...;
MyDataList.Add(MyData);
vstListDisplay.AddChild(nil, MyData);

// vstListDisplay.OnGetText implementieren
case Column of
  0:
    CellText := TMyData(vstListDisplay.GetNodeData(Node)^).FirstColumnData;
...
Das sollte alles gewesen sein, so aus dem Kopf geschrieben...

FredlFesl 2. Jul 2011 19:19

AW: Listview.Clear dauert zu lange. Gibt es eine schnellere Methode?
 
Stümmt, ich sehe in deinem Code aber nicht, wo auf die Liste verwiesen wird, oder wie ich auf den x.ten Eintrag komme.
Außerdem dachte ich immer, die Virtual TreeList arbeitet mit Records.

Bernhard Geyer 2. Jul 2011 20:10

AW: Listview.Clear dauert zu lange. Gibt es eine schnellere Methode?
 
Zitat:

Zitat von juergen (Beitrag 1109667)
Im Moment scheue ich mich auch mich in Virtual Treeview einzuarbeiten. :oops:

Falls du nicht viel Umstellen willst wäre das TElTreeStringgrid vom Elpack (LMD) zu empfehlen. Kann im "normalen" Modus arbeiten und ist dort um welchen schneller als die WinAPI

Luckie 2. Jul 2011 20:30

AW: Listview.Clear dauert zu lange. Gibt es eine schnellere Methode?
 
Es wäre auch zu überlegen, ob man die Datenmenge nicht reduziert. Was will der Benutzer mit einigen tausend Einträgen?

juergen 2. Jul 2011 21:15

AW: Listview.Clear dauert zu lange. Gibt es eine schnellere Methode?
 
Hallo zusammen,

vielen Dank erst einmal für Eure netten Antworten! :thumb:
Das "Problem": ich benötige Checkboxen...und diese stehen in der Listview im virtuellen Modus leider nicht zur Verfügung (laut Hilfe).
Und damit scheint wohl nur noch der VirtualStringTree übrig zu bleiben.
Mit den Delphi Standard Komponeten komme ich so halbwegs zurecht. Ich hatte mir schon einige Male Source vom VirtualStringTree angeschaut, aber nie so richtig verstanden. Ich tue mich da etwas schwer etwas zu kopieren und einzusetzen, wenn ich es nicht verstehe. :stupid:

Ich werde mal schauen ob ich mit der Listview so "durchkomme", ansonsten muss ich mich wohl doch etwas mit dem VirtualStringTree beschäftigen.

Einen schönen Abend noch!

Edit[roter Kasten]:
@Luckie,
Reduzierung der Datenmengen ist leider nicht möglich. Die Datenmengen sind nicht konstant, sondern sehr unterschiedlich. Ich gehe aber vom Worst Case aus und das sind lt. Kundenmkomentar bis zu 20.000 Datensätze. Wobei ich hier bei mir mit knapp 7000 Datensätze teste.

himitsu 2. Jul 2011 21:21

AW: Listview.Clear dauert zu lange. Gibt es eine schnellere Methode?
 
Wenn du die Checkboxen selber zeichnest und die Klicks entsprechend auswertest, dann kannst du auch die Listview im virtuellen Modus verwenden.

PS: VST macht das auch nicht anders.

Das Zeichnen kannste ganz einfach über den ThemeService vom Delphi machen
oder du wendest dich direkt an die WinAPI, um dir die Checkboxen zeichnen zu lassen.

jaenicke 2. Jul 2011 23:11

AW: Listview.Clear dauert zu lange. Gibt es eine schnellere Methode?
 
Zitat:

Zitat von FredlFesl (Beitrag 1109681)
Stümmt, ich sehe in deinem Code aber nicht, wo auf die Liste verwiesen wird, oder wie ich auf den x.ten Eintrag komme.

Der Punkt ist ja, dass du bei der VrtualStringTree nur auf die Objekte in deiner Datenstruktur im Hintergrund verweist (bei meinem Beispiel eine Liste).

Wenn du an einen bestimmten Knoten zu bestimmten Daten heran willst (und nicht nur umgekehrt von einem selektierten Node auf die Daten zugreifen willst), kannst du z.B. einen Pointer auf den Node mit in dein Objekt packen oder ein TDictionary von deinen Objekten auf den Node benutzen.

Zitat:

Zitat von FredlFesl (Beitrag 1109681)
Außerdem dachte ich immer, die Virtual TreeList arbeitet mit Records.

Welche Daten du da reinpackst, ist egal. In meinem Fall sind es die 4 Byte eines 32-Bit Pointers auf ein Objekt. Stattdessen kann man eben auch einen Record hineinpacken, aber das finde ich unpraktisch...

Matze 2. Jul 2011 23:18

AW: Listview.Clear dauert zu lange. Gibt es eine schnellere Methode?
 
Zitat:

Zitat von juergen (Beitrag 1109694)
Ich werde mal schauen ob ich mit der Listview so "durchkomme", ansonsten muss ich mich wohl doch etwas mit dem VirtualStringTree beschäftigen.

Etwas schneller als "Clear" ist bei mir der folgende Code. Da kannst du mal schauen, wie sich das bei dir verhält:
Delphi-Quellcode:
uses
  CommCtrl;

// ...

  ListView1.Items.BeginUpdate;
  ListView1.Perform(LVM_DELETEALLITEMS, 0, 0);
  ListView1.Items.EndUpdate;


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