VirtualStringTree Index eines Nodes
VirtualStringTree Index eines Nodes
Hallo Lazarus Gemeinde
Ich habe diese tolle Komponente mal installiert und bin schon fleissig am testen.
Es gibt den Absolutindex, welchen ich aber nicht meine und der mir auch rein gar nichts nützt.
Bei dem normalen TreeView besitzt jeder Node die Eigenschaft Index.
Ich habe aus diesem Index und dem Level (was ich auch blöd finde, dass man hierzu erst eine Funtion, GetNodeLevel, aurufen muss) eine
INDEXIERUNG generiert, so in der art:
1.1
1.2
1.2.1
1.2.2
1.2.2.1 usw.
Gibt es so einen Index im VST?
(Ich befürchte eher nicht)
Was für Möglickeiten gäbe es noch an diesen Index zu gelangen?
(als spontane Idee: eine Funktion die mit GetPrev bis zum Parent Inc(idx) mitzählt.)
Ich habe diese tolle Komponente mal installiert und bin schon fleissig am testen.
Es gibt den Absolutindex, welchen ich aber nicht meine und der mir auch rein gar nichts nützt.
Bei dem normalen TreeView besitzt jeder Node die Eigenschaft Index.
Ich habe aus diesem Index und dem Level (was ich auch blöd finde, dass man hierzu erst eine Funtion, GetNodeLevel, aurufen muss) eine
INDEXIERUNG generiert, so in der art:
1.1
1.2
1.2.1
1.2.2
1.2.2.1 usw.
Gibt es so einen Index im VST?
(Ich befürchte eher nicht)
Was für Möglickeiten gäbe es noch an diesen Index zu gelangen?
(als spontane Idee: eine Funktion die mit GetPrev bis zum Parent Inc(idx) mitzählt.)
- Dateianhänge
-
VirtualStringTree.7z
- (274.48 KiB) 69-mal heruntergeladen
Zuletzt geändert von hubblec4 am So 3. Jan 2016, 12:34, insgesamt 1-mal geändert.
Re: VirtualStringTree Index eines Nodes
Code: Alles auswählen
function TForm1.GetNodeIndex(ANode: PVirtualNode): String;
begin
Result := '';
while ANode <> VirtualTree.RootNode do begin
Result := IntToStr(ANode^.Index+1) + '.' + Result;
ANode := ANode^.Parent;
end;
if Result <> '' then Delete(Result, Length(Result), 1);
end;
Re: VirtualStringTree Index eines Nodes
erstmal recht vielen dank.
Ist ja schon fast peinlich, das es diesen Index auch so einfach gibt.
Macht es eigentlich einen unterschied ob man
mit Pointer den index aufruft?
oder ohne Pointer
beides kann ich im QuellCodeEditor eingeben.
Das Level eines nodes bekommt man aber nur über diese "GetNodeLevel" Funktion, oder gibt es da auch eine art Variable die man dierekt am Node abrufen kann?
Ist ja schon fast peinlich, das es diesen Index auch so einfach gibt.
Macht es eigentlich einen unterschied ob man
mit Pointer den index aufruft?
Code: Alles auswählen
Anode^.Index
Code: Alles auswählen
Anode.Index
Das Level eines nodes bekommt man aber nur über diese "GetNodeLevel" Funktion, oder gibt es da auch eine art Variable die man dierekt am Node abrufen kann?
Re: VirtualStringTree Index eines Nodes
Das pointer-Häkchen ist klassisches Pascal. Wenn aber oben im Kopf der Unit die Zeile {$mode DELPHI} steht, dann erwartet fpc die Delphi-Syntax, wo das Häkchen nicht nötig ist.hubblec4 hat geschrieben: Macht es eigentlich einen unterschied ob man
mit Pointer den index aufruft?
oder ohne PointerCode: Alles auswählen
Anode^.Index
beides kann ich im QuellCodeEditor eingeben.Code: Alles auswählen
Anode.Index
Mache einen Ctrl-Klick auf PVirtualNode. Da öffnet sich die Unit, in der das definiert ist. PVirtualNode ist ein Zeiger auf TVirtualNode. Mache nochmals einen Ctrl-Klick auf TVirtualNode. Dann wirst du zur Deklaration von TVirtualNode geführt. Wie du leicht siehst, gibt es kein Element, das man als "Level" interpretieren könnte. Weil du die Unit schon offen hast, suche mal die Implementierung von GetNodelLevel. Du siehst dann, dass die Funktion einfach die Parent-Kette bis zum Root hochläuft und die Zahl der Parents ermittelt - ähnlich wie mein oben geposteter Code.hubblec4 hat geschrieben: Das Level eines nodes bekommt man aber nur über diese "GetNodeLevel" Funktion, oder gibt es da auch eine art Variable die man dierekt am Node abrufen kann?
P.S. Mit "Ctrl-Klick" meine ich einen Mausklick mit gedrückter CTRL-Taste - einer der wichtigsten Tricks, wenn man in Lazarus hineinsehen möchte!
Re: VirtualStringTree Index eines Nodes
danke für den Bedienungstipp für Lazarus (ich bin einfach mit der mouse über die entsprechende funtion/procedure gegangen und im "Hint" ist dann ein klickbarer Link zu der funktion/procedure)
Die Funktion GetNodeLevel hatte ich mir bereits in der .pas angeschaut und gesehen was die funktion macht,
da ich oft auf das level zugreifen muss, müsste jedesmal diese Funktion durchrattern, ist das nicht entwas umständlich und Antiperform?
Ich habe es jetzt vorrübergehend so gemacht:
Da man sowieso auf die Daten vom Node zugreift (GetNodeData), habe ich dort einfach einen integer angelegt(im record) welcher das level abbildet.
Und wenn ich dann in diversen Schleifen auf das level zugreifen muss geht das recht fix, als dauernd die funktion aufzurufen.
Oder irre ich mich und es dauert länger?-> erst daten holen und dann das level auslesen.
Die Funktion GetNodeLevel hatte ich mir bereits in der .pas angeschaut und gesehen was die funktion macht,
da ich oft auf das level zugreifen muss, müsste jedesmal diese Funktion durchrattern, ist das nicht entwas umständlich und Antiperform?
Ich habe es jetzt vorrübergehend so gemacht:
Da man sowieso auf die Daten vom Node zugreift (GetNodeData), habe ich dort einfach einen integer angelegt(im record) welcher das level abbildet.
Und wenn ich dann in diversen Schleifen auf das level zugreifen muss geht das recht fix, als dauernd die funktion aufzurufen.
Oder irre ich mich und es dauert länger?-> erst daten holen und dann das level auslesen.
Re: VirtualStringTree Index eines Nodes
Normalerweise überschätzt man das. Was heißt "oft"? Nur wenn du "viele" (Millionen) und tief aufgefächerte Nodes hast, alle Nodes durchläufst und jedesmal die GetNodeLevel-Funktion ausführen musst, kann etwas Zeit zusammenkommen. Aber alle Nodes werden praktisch sowieso nie durchlaufen.hubblec4 hat geschrieben:Die Funktion GetNodeLevel hatte ich mir bereits in der .pas angeschaut und gesehen was die funktion macht,
da ich oft auf das level zugreifen muss, müsste jedesmal diese Funktion durchrattern, ist das nicht entwas umständlich und Antiperform?
Ja, das würde ich auch so machen.hubblec4 hat geschrieben:Ich habe es jetzt vorrübergehend so gemacht:
Da man sowieso auf die Daten vom Node zugreift (GetNodeData), habe ich dort einfach einen integer angelegt(im record) welcher das level abbildet.
Re: VirtualStringTree Index eines Nodes
Ok, "viele" Millionen nodes sind es nicht, aber es kann vorkommen das der gesamte Tree durchgelaufen werden muss, dabei muss ich prüfen welches level der node hat, denn wenn das level sich ändert muss entweder abgebrochen oder andere proceduren ausgeführt werden.wp_xyz hat geschrieben:Normalerweise überschätzt man das. Was heißt "oft"? Nur wenn du "viele" (Millionen) und tief aufgefächerte Nodes hast, alle Nodes durchläufst und jedesmal die GetNodeLevel-Funktion ausführen musst, kann etwas Zeit zusammenkommen. Aber alle Nodes werden praktisch sowieso nie durchlaufen.
Da du das mit dem "level im record" auch so machen würdest, denke ich bleibe ich auch dabei.