![]() |
Re: Finden einer Node
Hi,
ich werde mir das gleich mal ansehen. Habe aber den Fehler gefunden: ich habe das ganze auf Druck von F12 ausgelöst, aber gleichzeitig ist F12 ein Hotkey im VST. Jetzt geht es wunderbar. :-) Danke, Chris |
Re: Finden einer Node
Hi Jens,
so geht es natürlich auch. :) Habe es jetzt aber so ähnlich, wie mirage gemacht. Aber jetzt gibt es ein anderes Problem: ich versuche eine Listnode zu finden. Das ist eine Node, die sich eine "Etage" tiefer als das Projekt befindet. Das Problem ist, dass es von diesen Listnodes mehrere gibt. Alle haben eine andere Beschriftung. Ich habe mir dafür folgende Funktion gebastelt:
Delphi-Quellcode:
Das Problem ist nun aber, dass auf die markierte Stelle durch den Compilier nie zugegriffen wird. Wieso? Und ist irgendwo ein Fehler? Denn es öffnet sich zwar nicht das CPU-Fenster, aber dafür scheint der Rückgabewert lt. Delphi nil zu sein. :?
function TfrmMain.GetListNode(Node: PVirtualNode; Caption: String): PVirtualNode;
var pData: PTVData; begin if vstData.GetNodeLevel(Node) = 1 then begin pData := vstData.GetNodeData(Node); if pData.szCaption = Caption then Result := Node // <-- hier else GetListNode(Node.NextSibling, Caption); end else begin if vstData.GetNodeLevel(Node) < 1 then GetListNode(Node.FirstChild, Caption) else GetListNode(Node.Parent, Caption); end; Result := Node; end; Chris |
Re: Finden einer Node
Hallo,
wenn ich Dich richtig verstanden habe, möchtest Du ab einem bestimmten Node im Baum abwärts suchen. Dann probier mal folgendes:
Delphi-Quellcode:
procedure TForm1.SearchLoop(Node: TTreeNode);
{SearchLoop geht von Node aus im Baum abwärts} var TmpNode : TTreeNode; begin If Node<>Nil then {Hier wird dann entschieden, ob der gesuchte Node gefunden wurde} TmpNode:=Node.getFirstChild; While TmpNode<>Nil do begin SearchLoop(TmpNode); TmpNode:=Node.getNextChild(TmpNode); end; end; |
Re: Finden einer Node
Hi,
ich habe das ganze mal auf das VST portiert und versucht das auf meinen Fall zu übertragen. Allerdings scheint das ganze eine endlosschleife zu sein. :(
Delphi-Quellcode:
Chris
function TfrmMain.SearchLoop(Node: PVirtualNode; sCaption: WideString): PVirtualNode;
var TmpNode : PVirtualNode; pData: PTVData; begin If Node<>Nil then begin pData := vstData.GetNodeData(Node); if (pData <> nil) and (pData.szCaption = sCaption) then begin Result := Node; Exit; end; end else Result := nil; TmpNode:=Node.FirstChild; While TmpNode<>Nil do begin SearchLoop(TmpNode, sCaption); TmpNode:=Node.NextSibling; end; end; [edit]:gruebel: Ich weiß, dass ich was falsch gemacht habe. Und ich weiß auch, dass der Fehler darin liegt, dass ich den Rückgabewert von SearchLoop nicht behandel. Aber das Problem ist, dass ich nicht weiß, was ich tun soll. :cry:[/edit] |
Re: Finden einer Node
Hallo Chris,
stimmt, mein vorheriger Source klappert alle Unterknoten ab einem bestimmten Knoten bis zum letzten Unterknoten ab. Der Source hier funktioniert anders. Wähle einen bestimmten Knoten. Von diesem Knoten aus werden alle Unterknoten besucht. Wenn ein Node mit dem gesuchten Text gefunden wurde bricht die Rekursion ab.
Delphi-Quellcode:
Ob das auch mit VirtualTreeView funktioniert kann ich sagen. Weil - habe ich nicht.
function TForm1.SearchForNode(Node : TTreeNode; const NodeText : String) : TTreeNode;
var TmpNode : TTreeNode; begin Result:=Nil; If Node<>Nil then If AnsiUpperCase(Node.Text)=AnsiUpperCase(NodeText) then Result:=Node; TmpNode:=Node.getFirstChild; While (TmpNode<>Nil) and (Result=Nil) do begin Result:=SearchForNode(TmpNode,NodeText); TmpNode:=Node.getNextChild(TmpNode); end; end; |
Re: Finden einer Node
Hi Jens,
vielen Dank! Das funktioniet wunderbar! Und das umschreiben auf VirtualStringTree hat auch wunderbar funktioniert. Für alle interessierten: hier meine Funktion:
Delphi-Quellcode:
Das ist Jens' Code einfach nur auf VirtualStringTree übertragen.
function TfrmMain.GetListNode(Node : PVirtualNode; const NodeText : String) : PVirtualNode;
var TmpNode : PVirtualNode; pData: PTVData; begin Result:=Nil; If Node<>Nil then begin pData := vstData.GetNodeData(Node); If AnsiLowerCase(pData.szCaption)=AnsiLowerCase(NodeText) then Result:=Node; end; TmpNode:=Node.FirstChild; While (TmpNode<>Nil) and (Result=Nil) do begin Result:=GetListNode(TmpNode,NodeText); TmpNode:=Node.NextSibling; end; end; Danke, Chris |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:19 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