{************************************************************************* 查找节点的下一个可以编辑的节点*************************************************************************}
Function FindNextNode(Node : PVirtualNode;Var VST : TVirtualStringTree) : PVirtualNode;
{********************************************* 找到某一节点下第一个可以编辑的节点 **********************************************}
Procedure FindFirstNode(Node:PVirtualNode;VST:TVirtualStringTree;Var Result : PVirtualNode);
Var
TNode : PVirtualNode;
Data : PNodeData;
begin
If Node = Nil then
Exit;
Data := VST.GetNodeData(Node);
If (Trim(Data.EditS) = 'Y') and (Node.ChildCount <= 0) then
begin
Result := Node; //>在这里我找到了第一我要的节点为为什么我的函数不 //返回?
Exit;
end;
If Node.ChildCount > 0 then
begin
TNode := Node.NextSibling;
While TNode <> Nil Do
begin
FindFirstNode(TNode,VST,Result);
TNode := TNode.NextSibling;
end;
end else
begin
TNode := Node.NextSibling;
FindFirstNode(TNode,VST,Result);
end;
end;
begin
Result := Nil;
If Node = Node.Parent.LastChild then
FindNextNode(Node.Parent,VST)
else
FindFirstNode(Node.NextSibling,VST,Result);
If Result <> Nil then
Exit;
end;
Function FindNextNode(Node : PVirtualNode;Var VST : TVirtualStringTree) : PVirtualNode;
{********************************************* 找到某一节点下第一个可以编辑的节点 **********************************************}
Procedure FindFirstNode(Node:PVirtualNode;VST:TVirtualStringTree;Var Result : PVirtualNode);
Var
TNode : PVirtualNode;
Data : PNodeData;
begin
If Node = Nil then
Exit;
Data := VST.GetNodeData(Node);
If (Trim(Data.EditS) = 'Y') and (Node.ChildCount <= 0) then
begin
Result := Node; //>在这里我找到了第一我要的节点为为什么我的函数不 //返回?
Exit;
end;
If Node.ChildCount > 0 then
begin
TNode := Node.NextSibling;
While TNode <> Nil Do
begin
FindFirstNode(TNode,VST,Result);
TNode := TNode.NextSibling;
end;
end else
begin
TNode := Node.NextSibling;
FindFirstNode(TNode,VST,Result);
end;
end;
begin
Result := Nil;
If Node = Node.Parent.LastChild then
FindNextNode(Node.Parent,VST)
else
FindFirstNode(Node.NextSibling,VST,Result);
If Result <> Nil then
Exit;
end;
Function FindNextNode(Node : PVirtualNode;Var VST : TVirtualStringTree) : PVirtualNode;
{********************************************* 找到某一节点下第一个可以编辑的节点 **********************************************}
Procedure FindFirstNode(Node:PVirtualNode;VST:TVirtualStringTree;Var Result : PVirtualNode);
Var
TNode : PVirtualNode;
Data : PNodeData;
begin
If Node = Nil then
Exit;
Data := VST.GetNodeData(Node);
If (Trim(Data.EditS) = 'Y') and (Node.ChildCount <= 0) then
begin
Result := Node; //----->在这里我找到了第一我要的节点为为什么我的函数不返回?
Exit; //----->我想如果找到合适节点在这里就应该跳出Procedure但是....
end;
If Node.ChildCount > 0 then
begin
TNode := Node.FirstChild; //--> 上面这里有点问题
While TNode <> Nil Do
begin
FindFirstNode(TNode,VST,Result);
TNode := TNode.NextSibling;
end;
end else
begin
TNode := Node.NextSibling;
FindFirstNode(TNode,VST,Result);
end;
end;
begin
Result := Nil;
If Node = Node.Parent.LastChild then
FindNextNode(Node.Parent,VST)
else
FindFirstNode(Node.NextSibling,VST,Result);
If Result <> Nil then
Exit;
end;
begin
TNode := Node.FirstChild; //--> 上面这里有点问题
While TNode <> Nil Do
begin
FindFirstNode(TNode,VST,Result);//问题出在这里
//此时不管这一步找到没有都会执行下面的语句,实际的到的应该是(最后一个根节点上的)(层数最少的节点)
TNode := TNode.NextSibling;
end;
end else
begin
TNode := Node.NextSibling;
FindFirstNode(TNode,VST,Result);
end;
a
|-aa
| |-bb
|- bb
b
|-ad
| |-bb
|bb//如果找bb,找到的应该会是这个
c
cc
//规律:根节点从后往前找,c上没有,b上有,然后看b上的第一层,也是从后往前找,得到结果
If (Trim(Data.EditS) = 'Y') and (Node.ChildCount <= 0) then
begin
Result := Node;
//这里设置函数的返回值为找到了
Exit;
end;
If Node.ChildCount > 0 then
begin
TNode := Node.FirstChild;
While TNode <> Nil Do
begin
FindFirstNode(TNode,VST,Result);
//这里判断这一个递规调用是否找到,如果找到就exit
TNode := TNode.NextSibling;
end;
end else
begin
TNode := Node.NextSibling;
FindFirstNode(TNode,VST,Result);
//这里判断这一个递规调用是否找到,如果找到就exit
end;
function FindFirstNode(Node: PVirtualNode; VST: TVirtualStringTree; var ResultNode: PVirtualNode): Boolean;
var
TNode: PVirtualNode;
Data: PNodeData;
begin
if Node = Nil then
Exit;
Data := VST.GetNodeData(Node);
if (Trim(Data.EditS) = 'Y') and (Node.ChildCount <= 0) then
begin
ResultNode := Node;
Result := True;
Exit;
end;
if Node.ChildCount > 0 then
begin
TNode := Node.FirstChild;
while TNode <> Nil do
begin
if not FindFirstNode(TNode,VST,ResultNode) then
TNode := TNode.NextSibling
else
begin
Result := True;
exit;
end;
end;
end
else
begin
TNode := Node.NextSibling;
if FindFirstNode(TNode,VST,ResultNode) then
begin
Result := True;
exit;
end;
end;
Result := False;
end;
Var
Node : PVirtualNode;
Data : PNodeData;
begin
Result:= Nil;
IF PNode=Nil THen Exit;
Node := PNode;
Data := VST.GetNodeData(Node);
While (Trim(Data.EditS) <> 'Y')Or(Node=PNode) Do
begin
If Node.FirstChild<>Nil Then
Begin
Node := Node.FirstChild;
Data := VST.GetNodeData(Node);
Continue;
End; While Node.NextSibling = nil Do
Begin
If Node.Parent=Nil Then
Begin
Node:= Nil;
Break;
End;
Node := Node.Parent;
End;
Node:= Node.NextSibling;
Data := VST.GetNodeData(Node);
If (Data=Nil) Then Exit;
end;
Result:= Node;
end;我要分!!!!!!!!
Function FindFirstNode(Node:PVirtualNode;VST:TVirtualStringTree; Var ResultNode:PVirtualNode ):Boolean;
Var
TNode : PVirtualNode;
Data : PNodeData;
begin
If Node = Nil then
Exit;
Data := VST.GetNodeData(Node);
If (Trim(Data.EditS) = 'Y') and (Node.ChildCount <= 0) then
begin
ResultNode := Node;
Result := True;
Exit;
end;
If Node.ChildCount > 0 then
begin
TNode := Node.FirstChild;
While TNode <> Nil Do
begin
If not FindFirstNode(TNode,VST,ResultNode) then
TNode := TNode.NextSibling
else
begin
Result := True;
Exit;
end;
end; //EndWhile
end else
begin
TNode := Node.NextSibling;
If FindFirstNode(TNode,VST,ResultNode) then
Begin
Result := True;
Exit;
end;
end;
end;
Function FindNextNode(Node : PVirtualNode;Var VST : TVirtualStringTree; Var ResultNode:PVirtualNode ):Boolean;
begin
Result := False;
If Node = Node.Parent.LastChild then
FindNextNode(Node.Parent,VST,ResultNode)
else
If FindFirstNode(Node.NextSibling,VST,ResultNode) then
begin
Result := True;
Exit;
end;
end;
{********************************************* 找到某一节点下第一个可以编辑的节点 **********************************************}
Function FindFirstNode(Node:PVirtualNode;VST:TVirtualStringTree; Var ResultNode:PVirtualNode ):Boolean;
Var
TNode : PVirtualNode;
Data : PNodeData;
begin
If Node = Nil then
Exit;
Data := VST.GetNodeData(Node);
If (Trim(Data.EditS) = 'Y') and (Node.ChildCount <= 0) then
begin
ResultNode := Node;
Result := True;
Exit;
end;
If Node.ChildCount > 0 then
begin
TNode := Node.FirstChild;
While TNode <> Nil Do
begin
If not FindFirstNode(TNode,VST,ResultNode) then
TNode := TNode.NextSibling
else
begin
Result := True;
Exit;
end;
end; //EndWhile
end else
begin
TNode := Node.NextSibling;
If FindFirstNode(TNode,VST,ResultNode) then
Begin
Result := True;
Exit;
end;
end;
end;
...
if Node.ChildCount > 0 then
begin
TNode := Node.FirstChild;
while TNode <> Nil do
begin
FindFirstNode(TNode,VST,Result)
if Result <> nil then
exit;
TNode := TNode.NextSibling;
end;
end
else
begin
TNode := Node.NextSibling;
FindFirstNode(TNode,VST,ResultNode);
if Result <> nil then
exit;
end;
谢谢 dulei115() 和 hero_yin(阿鬼)