This site is moving to The Zen Source Library
Please Update your bookmarks

ItemID - Finding Nodes

A common problem encountered when using TreeViews is finding a node.... Say you want to keep a list of the last few nodes the user clicked, how would you do that?

Actually its relatively simple. Each node is uniquely identified by a ItemID property. The ItemID property is declared as a HTreeItem. HTreeItem is defined in CommCtrl.pas you must include this unit if you want to use HTreeItem.

There are two steps here.

Step 1: Get the Node's ItemID

   iValue := integer(Node.ItemID);
Here I get the node's ItemID and save it as an integer (type-cast is needed).

Step 2: Get a Node from the ItemID

   Node := TreeView.Items.GetNode(  HTreeItem(iValue)  );
Again a type-cast is necessary, this time from an integer to a HTreeItem.

Example App.

Control Caption Name
TButton Add but_Add
TButton Remove but_Remove
TTreeView   tv_eg1
TButton Go but_Go
TEdit   ed_GoTo
TLabel Go To Node Label1

This application is rather pointless, it has no real purpose. It should however show quite clearly how to use ItemIDs.A more practical use of ItemIDs will be demonstrated in the "Linking a TreeView and a ListView".

This example is based on example 1.

   procedure TForm1.tv_eg1Click(Sender: TObject);
         {If there is no selection then exit}
      if(  tv_eg1.Selected = nil  ) then

         {Get the node's ItemID,
            type-cast it to an integer,
            then convert to a string
            and add it to the TMemo}
      mem_LastNodes.Lines.Add(   IntToStr(  integer(tv_eg1.Selected.ItemID)  )    );

When a node is selected, first check that there is really a selection. Then get the selected Node's ItemID and display it in the TMemo.

   procedure TForm1.but_GoClick(Sender: TObject);
      iNodeID : integer;
      FoundNode : TTreeNode;
         {Is there text available?}
      if(  ed_GoTo.Text = ''  ) then

         {Get the ItemID the user entered (as an integer)}
      iNodeID := StrToIntDef(  ed_GoTo.Text,  0  );
      if(  iNodeID = 0  ) then
         {Now find the node.
            Type cast the integer to a HTreeItem.  To do this you
               must include  Commctrl.pas!
            Call GetNode}
      FoundNode := tv_eg1.Items.GetNode(  HTreeItem(iNodeID)  );

          {If a node was found,  select it}
      if(  FoundNode <> nil  ) then
         FoundNode.Selected := true;

A ItemID has been entered in the TEdit. Convert the string to a number, the number to a ItemID and then find the node and select it.

All information on these www pages is copyright (©) 1997 Andre .v.d. Merwe And may not be copied or mirrored without my permission.