procedure TRptForm.Button1Click(Sender: TObject); var s:ttreenode; d:^string; begin new(d); d^:='唯一id'; //你原来增加树几点的代码; s.data:=d; dispose(d); end; 取的时候可以: var s:^string; s:=treenode.data; showmessage(s^);
可以遍历整个treeview然后每个top level都记录下来var NowNode:Ttreenode; result:integer; begin result:=0; NowNode:=TV.Items.GetFirstNode; while not NowNode=(你想要的条件) do begin If NowNode.Level=0 then Result:=NowNode.Index;//取得所属最高节点的index属性,记得第一个是0 NowNode:=NowNode.GetNext;//指向下一节点 end; end;
procedure TForm1.Button5Click(Sender: TObject); var TempNode:TTreeNode; begin TempNode := TreeView1.Selected; while Treeview1.Selected.Parent <> nil do TempNode := TempNode.Parent; Showmessage(TempNode.Text); end;
procedure TForm1.Button5Click(Sender: TObject); var TempNode:TTreeNode; begin TempNode := TreeView1.Selected.Parent; while TempNode<> nil do TempNode := TempNode.Parent; Showmessage(TempNode.Text); end;
建树代码procedure tmain.RootTree(treeview1:ttreeview); var query:TADOQuery; nodetemp:TTreenode; pstr:^string; str:string; begin with data.DmQuery do begin close; sql.Clear; sql.Text:='select * from xzdm'; open; sort:='xcode'; close; end; treeview1.Items.BeginUpdate; query:=TADOquery.Create(self); query.Connection:=data.BgConnection; with query do begin sql.Text:=str; open; if eof then exit; nodetemp:=nil; while not eof do begin new(pstr); pstr^:=fieldbyname('key').AsString; nodetemp:=treeview1.Items.AddObject(nil,fieldbyname('xname').AsString,pstr); next; end; end; while nodetemp<>nil do begin CreateTree(query,nodetemp,treeview1); nodetemp:=nodetemp.getPrevSibling; end; treeview1.Items.EndUpdate; end;procedure tmain.CreateTree(QuerySource:TADOQuery;NodeParent:TTreeNode;treeview1:ttreeview); var pstr1, pstr2 : ^string; i : integer; NodeTemp : TTreeNode; begin QuerySource.close; pstr1 := NodeParent.Data; QuerySource.Sql.Text := 'SELECT key,xcode,xname FROM xzdm WHERE right(xcode,7)='+''''+'0000000'+''''+' and parent = ' + '''' + pstr1^ + ''''; QuerySource.open; QuerySource.First; if QuerySource.RecordCount = 0 then exit; NodeTemp := nil; for i := 0 to QuerySource.RecordCount - 1 do begin new(pstr2); pstr2^ := QuerySource.FieldByName('key').AsString; NodeTemp := TreeView1.Items.AddChildObject(NodeParent, QuerySource.FieldByName('xname').AsString, pstr2); QuerySource.Next; end; while NodeTemp <> nil do begin CreateTree(QuerySource, NodeTemp,treeview1); NodeTemp := Nodetemp.getPrevSibling; end; end;
var s:ttreenode;
d:^string;
begin
new(d);
d^:='唯一id';
//你原来增加树几点的代码;
s.data:=d;
dispose(d);
end;
取的时候可以:
var s:^string;
s:=treenode.data;
showmessage(s^);
NowNode:Ttreenode;
result:integer;
begin
result:=0;
NowNode:=TV.Items.GetFirstNode;
while not NowNode=(你想要的条件) do
begin
If NowNode.Level=0 then
Result:=NowNode.Index;//取得所属最高节点的index属性,记得第一个是0
NowNode:=NowNode.GetNext;//指向下一节点
end;
end;
不过不好,有重复就完蛋了;
还是用node.data吧,每个节点是个treenode对象
都有自己的data属性,一个指向字符串的指针;
字符串中只要存上数据库中的唯一的那个字段的数据就可区分了
var
TempNode:TTreeNode;
begin
TempNode := TreeView1.Selected;
while Treeview1.Selected.Parent <> nil do
TempNode := TempNode.Parent;
Showmessage(TempNode.Text);
end;
我不打算遍历,我是想在建树的时候设置node.data,
不知可以设置成数字不?
首层为0,其次为1,类推。
treeview1.Selected.index 可以得到点击的结点属于当前层的第几个,
首个为0,其次为1,类推。但要得到非首层结点的index就要用到父index和当前index一起判断,如:
i1:=treeview1.Selected.Parent.Index;
i2:=treeview1.Selected.index;
这里i1是父结点的index,i2是当前结点的index。请试试。
var
TempNode:TTreeNode;
begin
TempNode := TreeView1.Selected.Parent;
while TempNode<> nil do
TempNode := TempNode.Parent;
Showmessage(TempNode.Text);
end;
做一循环,依次得到父结点的index,直到level=0,即可,我的思路是这样。
var
query:TADOQuery;
nodetemp:TTreenode;
pstr:^string;
str:string;
begin
with data.DmQuery do
begin
close;
sql.Clear;
sql.Text:='select * from xzdm';
open;
sort:='xcode';
close;
end;
treeview1.Items.BeginUpdate;
query:=TADOquery.Create(self);
query.Connection:=data.BgConnection;
with query do
begin
sql.Text:=str;
open;
if eof then exit;
nodetemp:=nil;
while not eof do
begin
new(pstr);
pstr^:=fieldbyname('key').AsString;
nodetemp:=treeview1.Items.AddObject(nil,fieldbyname('xname').AsString,pstr);
next;
end;
end;
while nodetemp<>nil do
begin
CreateTree(query,nodetemp,treeview1);
nodetemp:=nodetemp.getPrevSibling;
end;
treeview1.Items.EndUpdate;
end;procedure tmain.CreateTree(QuerySource:TADOQuery;NodeParent:TTreeNode;treeview1:ttreeview);
var
pstr1, pstr2 : ^string;
i : integer;
NodeTemp : TTreeNode;
begin
QuerySource.close;
pstr1 := NodeParent.Data;
QuerySource.Sql.Text := 'SELECT key,xcode,xname FROM xzdm WHERE right(xcode,7)='+''''+'0000000'+''''+' and parent = ' + '''' + pstr1^ + '''';
QuerySource.open;
QuerySource.First;
if QuerySource.RecordCount = 0 then exit; NodeTemp := nil;
for i := 0 to QuerySource.RecordCount - 1 do
begin
new(pstr2);
pstr2^ := QuerySource.FieldByName('key').AsString;
NodeTemp := TreeView1.Items.AddChildObject(NodeParent,
QuerySource.FieldByName('xname').AsString, pstr2);
QuerySource.Next;
end; while NodeTemp <> nil do
begin
CreateTree(QuerySource, NodeTemp,treeview1);
NodeTemp := Nodetemp.getPrevSibling;
end;
end;