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 TreeView möglichst schnell durchlaufen (https://www.delphipraxis.net/55639-treeview-moeglichst-schnell-durchlaufen.html)

ibp 24. Okt 2005 18:43


TreeView möglichst schnell durchlaufen
 
Hallo,

Ich habe ein TreeView welches Informationen in Objekten gespeichert hat. Nun kommt es vor, dass in einigen Ebenen 100..1000 und manchmal mehr Knoten vorhanden sind. Wenn ich nun die Infos aus der Ebene haben will, dann dauert mir das unter Umständen zu langsam.
Wie kann man also möglichst schnell durch eine Ebene laufen?

Bisher habe ich das so realisiert...(schematisch)

Delphi-Quellcode:
parent_node:ttreenode;
...
for idx:=0 to parent_node.count-1 do
begin
  list.add(tmyobject(parent_node.intem[idx].data).keystring);
end;
...
oder
...
parent_node,wnode:ttreenode;
...
wnode:=parent_node.getFirstChild;
while wnode<>nil do
begin
  list.add(tmyobject(parent_node.intem[idx].data).keystring);
  wnode.getNextSibling;
end;
...
aber beides ist nicht wirklich schnell, gibt es noch andere möglichkeiten schneller an die objekte zu kommen?

danke schon mal

grüße

alzaimar 24. Okt 2005 19:39

Re: TreeView möglichst schnell durchlaufen
 
Ich denke, nicht. Was Du aber machen kannst, ist, die Daten separat in einer Liste zu speichern... Sind die TreeNode-Texte eindeutig?

marabu 24. Okt 2005 19:44

Re: TreeView möglichst schnell durchlaufen
 
Du könntest dich nach einem schnelleren Ersatz (VirtualStringTree) für das zu Grunde liegende common control umsehen, aber das kuriert nur das Symptom und nicht die Ursache des Problems. Es ist einfach nicht gut, wenn man seine Daten in eine visuelle Komponente schiebt und sie bei Bedarf dort wieder extrahiert. Speichere deine Daten extern in einem DataTree und das Problem mit der Zugriffsgeschwindigkeit kannst du weitgehend vergessen. Beim VST wirst du zu dieser Vorgehensweise geradezu gezwungen.

Grüße vom marabu

PS: hallo alzaimar, oller Gedankenleser...

alzaimar 24. Okt 2005 19:48

Re: TreeView möglichst schnell durchlaufen
 
@marabu: Zwei Olle, ein Gedanke :mrgreen: . Ich finde das Mitschleppen per 'Data' Property aber eigentlich ganz nett, vor allen Dingen, wenn man mit Drag & Drop arbeitet, aber ich benutze ein TreeView auch nur 1x Jahr (wenn überhaupt)

SirThornberry 24. Okt 2005 19:59

Re: TreeView möglichst schnell durchlaufen
 
ich denke das nicht das durchlaufen langsam ist sondern "list.add". Um dies jedoch mit Sicherheit sagen zu können bzw. es ausschließen zu können müsste man wissen von welchem Typ list ist bzw. ob List wenn es vom Typ TStrings ist ein Unterobject von TListBox etc. ist.

marabu 24. Okt 2005 20:08

Re: TreeView möglichst schnell durchlaufen
 
@alzaimar: ohne TreeNode.Data geht es nicht. Aber wenn der Data-Pointer in Verbindung mit der TreeView-Komponente für die Wiederbeschaffung der Daten herhalten muss, dann wird es halt manchmal eng ...

@Sir Thornberry: habe ich nicht irgendwo benchmarks für VST gesehen, die das common control sowas von deklassieren? Aber du könntest den Finger auf einen wunden Punkt gelegt haben, falls die ListBox.Sorted = true ist. Und wenn sie beim Hinzufügen von Items enabled ist, gleichzeitig in der Füllschleife noch events abgearbeitet werden, bei 1000 Items nicht abwegig, ...

marabu

alzaimar 24. Okt 2005 20:33

Re: TreeView möglichst schnell durchlaufen
 
Delphi-Quellcode:
list.add
war da nicht was mit BeginUpdate/EndUpdate?
Ich hab mal eben getestet: 10000 Nodes werden in 1000ms durchiteriert... Wesentlich langsamer sollte das mit list.add nicht werden (ca 2000ms).

SirThornberry 24. Okt 2005 20:49

Re: TreeView möglichst schnell durchlaufen
 
@alzaimar: Wenn es sich um einen Nachfahren von TStrings handelt sollte es tatsächlich auf BeginUpdate/EndUpdate herauslaufen, deswegen hatte ich auch gefragt. Aber ich bin jetzt auch recht negativ überrascht wie lange das durchlaufen dauert bei so wenig einträgen. Da ich nicht mit dem normalen TreeView arbeite sonder mit einem eigenem das bedeutend schneller ist bin ich solche zeiten nicht gewohnt. Ich weiß nicht um wieviel schneller das VirtualStringTree ist, ich weiß nur das der Programmieraufwand damals doch etwas zu viel war, aber eventuell findet der threadsteller den Aufwand angemessen im vergleich zur neuen Geschwindigkeit.

ibp 24. Okt 2005 21:54

Re: TreeView möglichst schnell durchlaufen
 
das projekt habe ich so übernommen und es ist nicht so einfach alles mal eben umzuschreiben!
um das mal abzukürzen, es geht nicht um die stringlist, das war nur ein beispiel gerade um es hier zu posten. es ging einzig und allein darum, wie könnte man knoten schneller durchlaufen. es geht auch nicht um sinn und zweck von der nutzung der visuellen komponente! das ist so, es ist eine anwendung die sich gerade auf der visuellen baumstruktur stützt!
die bedeutung von begin und endupdate ist mir bekannt auch die option sorted!
zur erklärung: nein die nodetexte sind nicht eindeutig, sondern frei definierbar! eindeutig sind nur die keys die als objekt hinterlegt sind! mit diesen werden gezielt datensätze und tabellen in einer db angesprochen. ja es wird auch hier mit drag&drop gearbeitet!

alzaimar 24. Okt 2005 22:12

Re: TreeView möglichst schnell durchlaufen
 
Gut: Dann würde ich mal annehmen, das das nicht schneller geht. 100.000 (nicht 10.000) in 1000ms. Ich meine, ich hätte bei www.Torry.net mal eine TTreeView-Komponente gesehen, die, bis auf die Messages, 100% kompatibel (Methoden und Eigenschaften) zur TTreeView ist. Mit ein bisserl Glück kannnst Du die dann einfach austauschen...


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