procedure TForm_Add_Part4XPartner.btnSearchClick(Sender: TObject);
var
Node: TTreeNode;
begin
// 清空所有节点的状态
ClearTreeViewSelection(TreeView1);
// 搜索匹配的节点,并展开
Node := SearchNodes(TreeView1.Selected, EditKey.Text);
if Assigned(Node) then
begin
Node.MakeVisible;
Node.Selected := True;
Node.Expand(False); // 展开匹配项对应的分支
end;
end;
procedure TForm_Add_Part4XPartner.ClearTreeViewSelection(TreeView: TTreeView);
var
I: Integer;
begin
TreeView.Items.BeginUpdate;
try
for I := 0 to TreeView.Items.Count - 1 do
begin
TreeView.Items[I].Selected := False;
end;
TreeView.FullCollapse;
finally
TreeView.Items.EndUpdate;
end;
end;
function TForm_Add_Part4XPartner.SearchNodes(Parent: TTreeNode; const Keyword: string): TTreeNode;
var
Child: TTreeNode;
Node : TTreeNode;
begin
if not Assigned(Parent) then
begin
Parent := TreeView1.Items.GetFirstNode;
Parent.Expand(False);
end;
Result := nil;
Parent.Expand(False);
// 遍历子节点查找匹配项
Child := Parent.GetFirstChild;
while Assigned(Child) do
begin
if SameText(Child.Text, Keyword) then
begin
Result := Child;
Node := Child;
Node.Expand(False);
Exit;
end
else
begin
Result := SearchNodes(Child, Keyword);
if Assigned(Result) then
begin
Node := Result;
Node.Expand(False);
Exit;
end;
end;
// 在一个 begin - end 块中对 Child 进行赋值和处理,防止编译器优化导致的问题
begin
Child := Child.GetNextSibling;
end;
end;
end;
看你上面的代码,我发现在 SearchNodes 函数中,Node.Expand(False) 被调用了多次。实际上,你应该只在找到匹配项之后才展开对应的节点。要解决这个问题,你可以在 btnSearchClick 方法中将 Node.Expand(False) 放到匹配项找到之后:
同时,将 SearchNodes 函数中的多余 Node.Expand(False) 删除:
这样,当你找到匹配项后,代码将逐级展开找到的节点的所有父节点,从而展示整个分支。这应该解决了你的问题。