![]() |
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:
aber beides ist nicht wirklich schnell, gibt es noch andere möglichkeiten schneller an die objekte zu kommen?
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; ... danke schon mal grüße |
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?
|
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... |
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)
|
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.
|
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 |
Re: TreeView möglichst schnell durchlaufen
Delphi-Quellcode:
war da nicht was mit BeginUpdate/EndUpdate?
list.add
Ich hab mal eben getestet: 10000 Nodes werden in 1000ms durchiteriert... Wesentlich langsamer sollte das mit list.add nicht werden (ca 2000ms). |
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.
|
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! |
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
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz