Delphi-PRAXiS

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 [TreeView] Mit Pfad zu Node springen (https://www.delphipraxis.net/110368-%5Btreeview%5D-mit-pfad-zu-node-springen.html)

Aurelius 17. Mär 2008 08:01


[TreeView] Mit Pfad zu Node springen
 
Hallo DPler :hi:

Wie kann ich, wenn ich den "Pfad" zum Node habe, auch zum entsprechenden Node springen? Der pfad liegt in der Form "Knoten\Unterknoten\..." vor. Überlegt habe ich mir jeweils die Einzelnen Knoten per
Delphi-Quellcode:
Rest := Suchtext;
Knoten[i] := LeftStr(Rest,Pos('\',Suchtext));
Rest := RightStr(Suchtext,Length(Suchtext)-Pos('\',Suchtext));
in einer Schleife zu suchen und dann jeweils zum Subknoten zu springen, was aber bestimmt zu kompliziert gedacht ist :D

Hoffe ihr könnt mir helfen.

bitsetter 17. Mär 2008 09:54

Re: [TreeView] Mit Pfad zu Node springen
 
Hi,

kann ja sein, dass es noch einfacher geht, aber so funktioniert es bei mir.
Delphi-Quellcode:
function function SelectNode(Pfad: AnsiString; Tv: TTreeView): boolean;
var
  Sl: TStrings;
  i: integer;
  Node: TTreeNode;
begin
  Result:= false;
  Pfad:= StringReplace(Pfad,'\', #13#10, [rfReplaceAll]);
  Sl:= TStringList.Create;
  try
    Sl.Text:= Pfad;
    Node:= Tv.TopItem;
    for i:= 0 to sl.Count- 1 do
    begin
      while Assigned(Node) do
      begin
        if node.Text= sl.Strings[i] then
        begin
          if i= sl.Count- 1 then
          begin
            Result:= true;
            Node.Selected:= Result;
          end;
          break;
        end;
        Node:= Node.GetNextSibling;
      end;
      if Assigned(Node) then
        Node:= Node.GetFirstChild;
    end;
  finally
    Sl.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if SelectNode('1\2', TreeView1) then
    beep;
end;

Aurelius 17. Mär 2008 11:26

Re: [TreeView] Mit Pfad zu Node springen
 
Ich werds mir mal anschauen, danke :thumb:

taaktaak 17. Mär 2008 15:20

Re: [TreeView] Mit Pfad zu Node springen
 
Hier noch eine Alternative ohne Verwendung einer StringList. Aufruf erfolgt analog, zusätzlich ist das Trennzeichen anzugeben (könnte natürlich auch fest "verdrahtet" werden):

Delphi-Quellcode:
function SelectNode(Path:String;Delimiter:Char;Tree:TTreeView):Boolean;
var p     : Integer;
    SubStr : String;
    aNode,
    orgSel : TTreeNode;
begin
  orgSel:=Tree.Selected;
  aNode :=Tree.TopItem;

  repeat

    p:=pos(Delimiter,Path);
    if p=0 then SubStr:=Path
           else begin SubStr:=copy(Path,1,pred(p));
                      delete(Path,1,p);
                      end;

    while (aNode.Text<>SubStr) and
          (aNode.GetNextChild(aNode)<>nil) do aNode:=aNode.getNextChild(aNode);

    if aNode<>nil then begin Tree.Selected:=aNode;
                             aNode:=aNode.getFirstChild;
                             end;

    until (p=0) or (aNode=nil);

  Result:=(Tree.Selected.Text=SubStr);
  if not(Result) then Tree.Selected:=orgSel
end;

taaktaak 17. Mär 2008 15:35

Re: [TreeView] Mit Pfad zu Node springen
 
Fairerweise muss allerdings gesagt werden, dass die erste Lösung (wie ich jetzt leider feststellen musste) etwa 20x schneller ist - also klare Entscheidung für die Stringlisten-Version von bitsetter :hi:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:34 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