Get TreeView Node By Text(TreeView上查找)

 How to locate (search and select) a TreeView node given by node text using Delphi. 

Many times while developing Delphi applications using the TreeView component I've bumped into a situation to need to search for a tree node given by only the text of the node.

In this article I'll present you with one quick and easy function to get TreeView node by text.    

A Delphi example

First, we'll build a simple Delphi form containing a TreeView, a Button, CheckBox and an Edit component - leave all the default component names.

 

Delphi : Get TreeView Node by Text

As you might imagine, the code will work something like:
if GetNodeByText given by Edit1.Text returns a node and MakeVisible (CheckBox1) is true then select node.

The most important part is the GetNodeByText function:

This function simply iterates through all the nodes inside the ATree TreeView starting from the first node (ATree.Items[0]). The iteration uses the GetNext method of the TTreeView class to look for the next node in the ATree (looks inside all nodes of all child nodes). If the Node with text (label) given by AValue is found (case insensitive) the function returns the node. The boolean variable AVisible is used to make the node visible (if hidden).

 

function GetNodeByText
(ATree : TTreeView; AValue:String; 
 AVisible: Boolean): TTreeNode;
var
    Node: TTreeNode;
begin
  Result := nil;
  if ATree.Items.Count = 0 then Exit;
  Node := ATree.Items[0];
  while Node <> nil do
  begin
    if UpperCase(Node.Text) = UpperCase(AValue) then
    begin
      Result := Node;
      if AVisible then
        Result.MakeVisible;
      Break;
    end;
    Node := Node.GetNext;
  end;
end;

 

 

This is the code that runs the 'Find Node' button OnClick event:

 

procedure TForm1.Button1Click(Sender: TObject);
var
  tn : TTreeNode;
begin
   tn:=GetNodeByText(TreeView1,Edit1.Text,CheckBox1.Checked);
   if tn = nil then
    ShowMessage('Not found!')
   else
    begin
      TreeView1.SetFocus;
      tn.Selected := True;
    end;
end;
 

 

Note: If the node is located the code selects the node, if not a message is displayed.

That's it! As simple as only Delphi can be. However, if you look twice, you'll see something is missing: the code will find the FIRST node given by AText! What if you want to search for a node at the same level as the calling node - where this calling node is also provided to the function!
Intro...If you look twice, you'll see something is missing: the code will find the FIRST node given by AText! What if you want to search for a node at the same level as the calling node - where this calling node is also provided to the function!...

The above text issued a challenge to enhance the TreeView search algorithm introduced in the part 1 of this article: Get TreeView Node By Text.

Remember, we had a treeview component "filled" with nodes. The problem was to search (locate and make visible) the treeview node in a function that receives the node text as the parameter.

Look the picture below, we have a node with the caption "Button" under the "Standard" node. If we are to have the "Button" node below (as a child node) the "Additional" node, the function will find the first "Button" - the one under "Standard".

What we now want, is to tell the function to search for "Button" under "Additional"...

 

Delphi : Get TreeView Node by Text

We enhance the GetNodeByText function by adding one more parameter - the "InNode" node.

 

function GetNodeByText
  (ATree : TTreeView; InNode : TTreeNode; 
   AValue:String; AVisible:boolean) : TTreeNode;
var
  NodeText : String;
  NextNode : TTreeNode;
begin
  Result := nil;
  NextNode := InNode.GetFirstChild;
  while NextNode <> nil do
  begin
    NodeText := NextNode.Text;
    if UpperCase(NodeText) = UpperCase(AValue) then
    begin
       NextNode.Selected := AVisible;
       Break;
    end
    else
      NextNode := NextNode.getNextSibling;
  end; //while
  Result := NextNode;
end;

 

 

The function simply iterates through all the first level child nodes of the provided "InNode" node and looks for a node labeled AValue.

 

The code that runs the 'Find Node' button OnClick event is slightly modified. The second parameter is the "root" node for the search - for example the selected node.

 

procedure TForm1.Button1Click(Sender: TObject);
var
  tn : TTreeNode;
begin
   tn:=GetNodeByText(TreeView1, TreeView1.Selected,
                     Edit1.Text,CheckBox1.Checked);
   if tn = nil then
     ShowMessage('Not found!')
   else
     TreeView1.SetFocus;
end;

 

That's it. If you have any questions please use the Delphi Programming Forum

 



上一篇: Delphi获取网卡MAC地址的两种方法
下一篇: Delphi Class of 类引用
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: TreeView Node Text
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 邮件地址支持Gravatar头像,邮箱地址不会公开.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭