VirtualStringTree Index eines Nodes

Rund um die LCL und andere Komponenten
Antworten
hubblec4
Beiträge: 347
Registriert: Sa 25. Jan 2014, 17:50

VirtualStringTree Index eines Nodes

Beitrag von hubblec4 »

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.)
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.

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: VirtualStringTree Index eines Nodes

Beitrag von wp_xyz »

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;
 

hubblec4
Beiträge: 347
Registriert: Sa 25. Jan 2014, 17:50

Re: VirtualStringTree Index eines Nodes

Beitrag von hubblec4 »

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?

Code: Alles auswählen

Anode^.Index
oder ohne Pointer

Code: Alles auswählen

Anode.Index
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?

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: VirtualStringTree Index eines Nodes

Beitrag von wp_xyz »

hubblec4 hat geschrieben: Macht es eigentlich einen unterschied ob man
mit Pointer den index aufruft?

Code: Alles auswählen

Anode^.Index
oder ohne Pointer

Code: Alles auswählen

Anode.Index
beides kann ich im QuellCodeEditor eingeben.
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: 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?
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.

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!

hubblec4
Beiträge: 347
Registriert: Sa 25. Jan 2014, 17:50

Re: VirtualStringTree Index eines Nodes

Beitrag von hubblec4 »

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.

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: VirtualStringTree Index eines Nodes

Beitrag von wp_xyz »

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?
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: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.
Ja, das würde ich auch so machen.

hubblec4
Beiträge: 347
Registriert: Sa 25. Jan 2014, 17:50

Re: VirtualStringTree Index eines Nodes

Beitrag von hubblec4 »

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.
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.

Da du das mit dem "level im record" auch so machen würdest, denke ich bleibe ich auch dabei.

Antworten