AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TreeView möglichst schnell durchlaufen

Ein Thema von ibp · begonnen am 24. Okt 2005 · letzter Beitrag vom 24. Okt 2005
Antwort Antwort
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#1

TreeView möglichst schnell durchlaufen

  Alt 24. Okt 2005, 19:43
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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: TreeView möglichst schnell durchlaufen

  Alt 24. Okt 2005, 20:39
Ich denke, nicht. Was Du aber machen kannst, ist, die Daten separat in einer Liste zu speichern... Sind die TreeNode-Texte eindeutig?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: TreeView möglichst schnell durchlaufen

  Alt 24. Okt 2005, 20:44
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...
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: TreeView möglichst schnell durchlaufen

  Alt 24. Okt 2005, 20:48
@marabu: Zwei Olle, ein Gedanke . 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)
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: TreeView möglichst schnell durchlaufen

  Alt 24. Okt 2005, 20:59
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: TreeView möglichst schnell durchlaufen

  Alt 24. Okt 2005, 21:08
@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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: TreeView möglichst schnell durchlaufen

  Alt 24. Okt 2005, 21:33
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).
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: TreeView möglichst schnell durchlaufen

  Alt 24. Okt 2005, 21:49
@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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#9

Re: TreeView möglichst schnell durchlaufen

  Alt 24. Okt 2005, 22:54
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!
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: TreeView möglichst schnell durchlaufen

  Alt 24. Okt 2005, 23:12
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...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort


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 16:48 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