A very common requirement for trees, is that all node names belonging to a parent
have unique names. This is similar to the restriction on file names, all file names
in a directory must be unique. However there is no built into restriction in TTreeViews,
so this checking must be done manually.
Here is a function to check if an name is already in use
function IsDuplicateName( Node : TTreeNode;
sNewName : string;
bInclusive : boolean
) : boolean;
var
TestNode : TTreeNode;
begin
if( Node = nil ) then
begin
Result := false;
Exit;
end;
{Include this Node?}
if( bInclusive ) then
if( CompareText( Node.Text, sNewName ) = 0 ) then
begin
Result := true;
Exit;
end;
{Test all previous siblings}
TestNode := Node;
repeat
{Get next}
TestNode := TestNode.GetPrevSibling;
if( TestNode <> nil ) then
{Is this a duplicate}
if( CompareText( TestNode.Text, sNewName ) = 0 ) then
begin
Result := true;
Exit;
end;
until (TestNode = nil);
{Test all next siblings}
TestNode := Node;
repeat
{Get next}
TestNode := TestNode.GetNextSibling;
if( TestNode <> nil ) then
{Is this a duplicate}
if( CompareText( TestNode.Text, sNewName ) = 0 ) then
begin
Result := true;
Exit;
end;
until (TestNode = nil);
Result := false;
end;
This function checks for duplicate nodes using the following alorighm
Here is the updated source for but_Add's onClick event
procedure TForm1.but_AddClick(Sender: TObject);
var
sText : string;
begin
{If nothing is selected}
if( tv_eg1.Selected = nil ) then
begin
{Does a root node already exist?}
if( tv_eg1.Items.Count = 0 ) then
begin
{Add the root node}
with tv_eg1.Items.AddFirst( nil, 'Root' ) do
begin
Selected := true;
{Set the roots image index}
ImageIndex := IMG_NODE_ROOT;
{Set the roots selected index. The same image is uses
as for the ImageIndex}
SelectedIndex := IMG_NODE_ROOT;
end;
end
else begin
{There is a root, so user must first select a node}
MessageBeep( -1 );
ShowMessage( 'Select a parent node' );
Exit;
end;
end
else begin
{Get a name for the new node}
InputQuery( 'New Node', 'Caption ?', sText );
{Check if this name is already in use}
if( IsDuplicateName( tv_eg1.Selected.GetFirstChild,
sText,
true
)
) then
begin
MessageBeep( -1 );
ShowMessage( 'A node with this name already exists' );
Exit;
end;
{Add the node as a child of the selected node}
with tv_eg1.Items.AddChildFirst( tv_eg1.Selected, sText ) do
begin
{Set the image used when the node is not selected}
ImageIndex := IMG_NODE_CLOSED;
{Image used when the node is selected}
SelectedIndex := IMG_NODE_OPEN;
MakeVisible;
end;
end;
end;
All information on these www pages is copyright (©) 1997 Andre .v.d. Merwe And may not be copied or mirrored without my permission.