我通过指定每个结点的父结点来动态生成一颗自顶向下的树,当结点的编号是从0 开始然后按添加顺序递增时,可以通过运行,可删除某一结点,使原来的递增序列出现断点,从而出现错误,老是提示 Invalid index ,希望各位高手们帮帮忙!我的代码:
procedure TForm1.PopulateTreeView;
var
parentnode,sonnode,treenode:TTreenode;
i:Integer;
begin
tvwFolders.Items.Add(self.tvwFolders.TopItem,'人员权限总栏:');
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('Select * from T_树结点表 ');
ADOQuery1.Prepared:=True;
ADOQuery1.Open;
ADOQuery1.First;
while not ADOQuery1.Eof do //如果未到达最后一项,执行循环
begin
i := ADOQuery1.FieldByName('父结点编号').AsInteger; tvwFolders.Items[i].Selected:=True; ------->提示这行有问题!!! tvwFolders.Items.AddChild(tvwFolders.Selected, ADOQuery1.fieldbyname('基本权限').AsString) ; ADOQuery1.Next;
end;end;谢谢了! 希望得到你的可行的方法,先行谢过! 在线等.....
procedure TForm1.PopulateTreeView;
var
parentnode,sonnode,treenode:TTreenode;
i:Integer;
begin
tvwFolders.Items.Add(self.tvwFolders.TopItem,'人员权限总栏:');
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('Select * from T_树结点表 ');
ADOQuery1.Prepared:=True;
ADOQuery1.Open;
ADOQuery1.First;
while not ADOQuery1.Eof do //如果未到达最后一项,执行循环
begin
i := ADOQuery1.FieldByName('父结点编号').AsInteger; tvwFolders.Items[i].Selected:=True; ------->提示这行有问题!!! tvwFolders.Items.AddChild(tvwFolders.Selected, ADOQuery1.fieldbyname('基本权限').AsString) ; ADOQuery1.Next;
end;end;谢谢了! 希望得到你的可行的方法,先行谢过! 在线等.....
盗用 QSmile(RedFox)兄的代码!
谢谢了二位
procedure TfrmDepartEmp.BuildTree;
var
tNode :TTreeNode;
begin
if dsDept.Active then dsDept.Close;
dsDept.CommandText := 'select * from Departments';
dsDept.Open;
tNode := treeDept.Items.AddChild(nil,'公司人员权限');
tNode.Data := Pointer(0);
tNode.ImageIndex := 0;
tNode.SelectedIndex := 1;
TreeMe(tNode);
end;
procedure TfrmDepartEmp.TreeMe(tNode: TTreeNode);
var
ParentID : Longint;
childNode : TTreeNode;
begin
ParentID := Integer(tNode.Data );
dsDept.First;
while not dsDept.Eof do
begin
if dsDept.FieldByName('父结点编号').AsInteger = ParentID then
begin
childNode := TreeDept.Items.AddChild(tNode,
dsDept.FieldByName('基本权限').AsString);
childNode.Data := Pointer(dsDept.FieldByName('树结点编号').AsInteger);
childNode.ImageIndex := 0;
childNode.SelectedIndex := 1;
//TreeMe(childNode);
end;
dsDept.Next;
end;
childNode := tNode.getFirstChild;
while childNode <> nil do
begin
TreeMe(childNode);
childNode := childNode.getNextSibling;
end;
end;