Delphi-PRAXiS
Seite 1 von 2  1 2      

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 VirtualTreeView: Bestimmten Knoten finden (https://www.delphipraxis.net/71984-virtualtreeview-bestimmten-knoten-finden.html)

JPSelter 23. Jun 2006 09:19


VirtualTreeView: Bestimmten Knoten finden
 
Beim Einfügen eines neuen Knotens kann es vorkommen, dass der neue Knoten alle Inhalte eines anderen Knotens übernehmen soll. Bloss dieser alte Knoten kann irgendwo im Baum sein (aber immer nur auf der obersten Ebene), wie finde ich den? Wie durchlaufe ich einen VirtualTreeView? Gibts einen Index, den ich ansprechen kann?

pszopp 23. Jun 2006 09:29

Re: VirtualTreeView: Bestimmten Knoten finden
 
Hallo,

kannst du den Quellknoten nicht in einer Variablen zwischenspeichern?

Ansonsten kannst du mit
Delphi-Quellcode:
Node := vst.GetFirst;

while (Assigned(Node)) do begin
  // Kontrolle, ob der Knoten der gesuchte ist
  ...

  // nächsten Knoten holen.
  Node := vst.GetNext(Node);
end;
alle Knoten des Trees durchlaufen.

Mit
Delphi-Quellcode:
Node := IrgendeinKnoten;

while (Assigned(Node)) do begin
  // Kontrolle, ob der Knoten der gesuchte ist
  ...

  // nächsten Knoten holen.
  Node := vst.GetNextSibling(Node);
end;
durchläufst du alle Knoten, die in der Ebene von IrgendeinKnoten liegen.



Viele Grüße,
pszopp

Gollum 23. Jun 2006 09:36

Re: VirtualTreeView: Bestimmten Knoten finden
 
Hallo,

den Knoten findest Du, indem Du alle Elemente der obersten Ebene durchläufts:
Delphi-Quellcode:
type
  PMyNodeData=^TMyNodeData;
  TMyNodeData=record
    NodeName:WideString;
    ...
  end; // TMyNodeData

function TForm1.FindeNode(const aName:String):PVirtualNode;
var n:PVirtualNode;
    d:PMyNodeData;
begin
  Result:=nil;
  n:=VirtualStringTree1.GetFirst;
  while (n<>nil) do
  begin
    d:=VirtualStringTree1.GetNodeData(n);
    if SameText(d^.NodeName, aName) then
    begin
      Result:=n;
      Break;
    end; // if
    n:=n^.NextSibling;
  end; // while
end; // TForm1.FindeNode
Aufgerufen wird das ganze dann in etwa so:
Delphi-Quellcode:
  ...
  with VirtualStringTree1 do
  begin
    FocusedNode:=FindeNode('huhu, wo bist Du?');
    if (FocusedNode<>nil) then Selected[FocusedNode]:=True;
  end; // with
  ...

JPSelter 23. Jun 2006 09:41

Re: VirtualTreeView: Bestimmten Knoten finden
 
Danke Euch beiden, werde beides mal probieren. Noch ne Frage zu GetNext: Durchläuft es einfach alle Indizes des Baums oder geht es nur vom Root zu einem Child?

Achja, es wird etwas komplizierter: Kann man sich den Baum vorher sortieren lassen? Alle meine Knoten haben ein Datum und ich suche den Knoten mit dem Ziel-Inhalt des jüngsten Datums. Ich schätze aber, die Indizes sind so wie sie erstellt wurden. Also werd ich da wohl alle Knoten durchlaufen müssen, das Datum vergleichen und den jüngsten Knoten merken. Dürfte ja auch nicht so schwer sein.

Dale 23. Jun 2006 09:51

Re: VirtualTreeView: Bestimmten Knoten finden
 
Zitat:

Achja, es wird etwas komplizierter: Kann man sich den Baum vorher sortieren lassen? Alle meine Knoten haben ein Datum und ich suche den Knoten mit dem Ziel-Inhalt des jüngsten Datums. Ich schätze aber, die Indizes sind so wie sie erstellt wurden. Also werd ich da wohl alle Knoten durchlaufen müssen, das Datum vergleichen und den jüngsten Knoten merken. Dürfte ja auch nicht so schwer sein.
Das Sortieren im VirtualTreeView kann man mit dem Event "OnCompareNodes" umsetzen:

Delphi-Quellcode:
PROCEDURE TForm.VirtualTreeViewCompareNodes(
            Sender: TBaseVirtualTree;
            Node1, Node2: PVirtualNode;
            Column: TColumnIndex;
            VAR Result: Integer
          );

  VAR lData1, lData2  : PNodeData;

BEGIN

  // Knotendaten beider Knoten ermitteln
  lData1 := Sender.GetNodeData(Node1);
  lData2 := Sender.GetNodeData(Node2);

  // falls die Daten gültig sind ...
  IF (Assigned(lData1) AND Assigned(lData2)) THEN
     Result := lData1.Datum - lData2.Datum;

END;
wobei ich deine Datenstruktur für das Datum natürlich nicht kenne.
Wenn "Result" < 0 ist, dann kommt Knoten1 zuerst, wenn "Result" > 0 ist, dann kommt Knoten2 zuerst.

Gruß Dale

JPSelter 23. Jun 2006 09:58

Re: VirtualTreeView: Bestimmten Knoten finden
 
Diese Routine habe ich bereits. Die Darstellung ist sortiert. Frage ist, ob die Indizes mit durchsortiert werden, oder ob die in der Reihenfolge bleiben wie sie erstellt wurden.

Gollum 23. Jun 2006 09:59

Re: VirtualTreeView: Bestimmten Knoten finden
 
Hallo,

vielleicht hilft Dir folgendes Tutorial weiter: VirtualTreeView

Dale 23. Jun 2006 10:16

Re: VirtualTreeView: Bestimmten Knoten finden
 
Je nach dem ob du auf- oder absteigend sortiert hast, ist der erste oder der letzte Knoten der Knoten mit dem jüngsten Datum, also "GetFirst" bzw. "GetLast" müsste dir direkt den gesuchten Knoten liefern.

Gruß Dale

generic 23. Jun 2006 10:34

Re: VirtualTreeView: Bestimmten Knoten finden
 
die schnellste methode sollte mit "iteratesubtree" sein.

Hawkeye219 23. Jun 2006 10:49

Re: VirtualTreeView: Bestimmten Knoten finden
 
Zitat:

Zitat von generic
die schnellste methode sollte mit "iteratesubtree" sein.

In diesem speziellen Fall wahrscheinlich nicht:

Zitat:

Zitat von JPSelter
Bloss dieser alte Knoten kann irgendwo im Baum sein (aber immer nur auf der obersten Ebene).

IterateSubTree durchläuft alle Knoten im angegebenen (Teil-)baum.

Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:02 Uhr.
Seite 1 von 2  1 2      

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