var nodecel : array[0..10] of TtreeNode; sqlstr,s1,s2:string; tempstr :array[0..10] of string; tempBoolean :array[0..10] of Boolean; Nodetitle :TtreeNode; begin if (xlmc.text='') or (wz.text='') then begin exit; end; screen.Cursor:=crHourGlass; if Sender<>cmdok then key.Text:='0'; TreeView1.Items.Clear; TreeView1.Items.BeginUpdate; new(nodeid); dispose(nodeid); nodecel[0] := TreeView1.Items.AddFirst (nil, xlmc.text); nodecel[0].ImageIndex := 0; nodecel[0].SelectedIndex := 3; if wz.text<>'全部' then sqlstr:='select 首桩号,首桩米,尾桩号,尾桩米,id from 绿化档案 where 道路='''+copy(xlmc.text,1,pos(':',xlmc.text)-1)+''' and 位置='''+wz.text+''' order by 首桩号,首桩米,尾桩号,尾桩米' else sqlstr:='select 首桩号,首桩米,尾桩号,尾桩米,绿化档案.位置,id from 绿化档案 INNER JOIN lib_位置 ON 绿化档案.位置 = lib_位置.位置 where 道路='''+copy(xlmc.text,1,pos(':',xlmc.text)-1)+''' order by 首桩号,首桩米,尾桩号,尾桩米,lib_位置.序号'; ADODataSet1.commandtext:=sqlstr; ADODataSet1.open; while not ADODataSet1.eof do begin tempBoolean[1]:=false; s1:=ADODataSet1.FieldByName('首桩号').AsString; s2:=ADODataSet1.FieldByName('首桩米').AsString; if ADODataSet1.FieldByName('首桩米').asinteger=0 then sqlstr:= s1 else if ADODataSet1.FieldByName('首桩米').asinteger>0 then sqlstr:= s1 +'(+'+s2+')' else sqlstr:= s1 +'('+s2+')'; sqlstr:= sqlstr+'--'; s1:=ADODataSet1.FieldByName('尾桩号').AsString; s2:=ADODataSet1.FieldByName('尾桩米').AsString; if ADODataSet1.FieldByName('尾桩米').asinteger=0 then sqlstr:= sqlstr+s1 else if ADODataSet1.FieldByName('尾桩米').asinteger>0 then sqlstr:= sqlstr+s1 +'(+'+s2+')' else sqlstr:= sqlstr+s1 +'('+s2+')'; if wz.text='全部' then begin if (tempstr[1] <>sqlstr) then begin tempstr[1] :=sqlstr; nodecel[1] := TreeView1.Items.AddChild(nodecel[0], tempstr[1]); nodecel[1].ImageIndex := 1; nodecel[1].SelectedIndex := 3; end; new(nodeid); nodeid^:=ADODataSet1.FieldByName('id').asinteger; Nodetitle :=TreeView1.Items.AddChildObject(nodecel[1], ADODataSet1.FieldByName('位置').AsString,nodeid); Nodetitle.ImageIndex := 2; Nodetitle.SelectedIndex := 3; end else begin if (tempstr[1] <>sqlstr) then new(nodeid); nodeid^:=ADODataSet1.FieldByName('id').asinteger; Nodetitle :=TreeView1.Items.AddChildObject(nodecel[0], sqlstr,nodeid); Nodetitle.ImageIndex := 2; Nodetitle.SelectedIndex := 3; end; ADODataSet1.Next; end; nodecel[0].Expanded := True; ADODataSet1.close; ADODataSet1.CursorLocation:=clUseClient; ADODataSet1.CursorType:=ctDynamic; ADODataSet1.LockType:=ltOptimistic; TreeView1.Items.endUpdate; screen.Cursor:=crDefault;
procedure TForm1.Button1Click(Sender: TObject); var Node, ChildNode: TTreeNode; begin Node := TreeView1.Selected; if Node = nil then Exit; with Query do begin Close; Sql.Text := 'select * from tablename where colname='''+Node.Text+''''; Open; while not Eof do begin ChildNode:= TreeView1.Items.AddChild(Node,FieldByName('colname2').AsString); ChildNode.Text := FieldByName('colname2').AsString; Next; end; end; end;
nodecel : array[0..10] of TtreeNode;
sqlstr,s1,s2:string;
tempstr :array[0..10] of string;
tempBoolean :array[0..10] of Boolean;
Nodetitle :TtreeNode;
begin
if (xlmc.text='') or (wz.text='') then begin exit;
end;
screen.Cursor:=crHourGlass;
if Sender<>cmdok then
key.Text:='0';
TreeView1.Items.Clear;
TreeView1.Items.BeginUpdate;
new(nodeid);
dispose(nodeid);
nodecel[0] := TreeView1.Items.AddFirst (nil, xlmc.text);
nodecel[0].ImageIndex := 0;
nodecel[0].SelectedIndex := 3;
if wz.text<>'全部' then
sqlstr:='select 首桩号,首桩米,尾桩号,尾桩米,id from 绿化档案 where 道路='''+copy(xlmc.text,1,pos(':',xlmc.text)-1)+''' and 位置='''+wz.text+''' order by 首桩号,首桩米,尾桩号,尾桩米'
else
sqlstr:='select 首桩号,首桩米,尾桩号,尾桩米,绿化档案.位置,id from 绿化档案 INNER JOIN lib_位置 ON 绿化档案.位置 = lib_位置.位置 where 道路='''+copy(xlmc.text,1,pos(':',xlmc.text)-1)+''' order by 首桩号,首桩米,尾桩号,尾桩米,lib_位置.序号';
ADODataSet1.commandtext:=sqlstr;
ADODataSet1.open;
while not ADODataSet1.eof do
begin
tempBoolean[1]:=false;
s1:=ADODataSet1.FieldByName('首桩号').AsString;
s2:=ADODataSet1.FieldByName('首桩米').AsString;
if ADODataSet1.FieldByName('首桩米').asinteger=0 then
sqlstr:= s1
else
if ADODataSet1.FieldByName('首桩米').asinteger>0 then
sqlstr:= s1 +'(+'+s2+')'
else
sqlstr:= s1 +'('+s2+')';
sqlstr:= sqlstr+'--';
s1:=ADODataSet1.FieldByName('尾桩号').AsString;
s2:=ADODataSet1.FieldByName('尾桩米').AsString;
if ADODataSet1.FieldByName('尾桩米').asinteger=0 then
sqlstr:= sqlstr+s1
else
if ADODataSet1.FieldByName('尾桩米').asinteger>0 then
sqlstr:= sqlstr+s1 +'(+'+s2+')'
else
sqlstr:= sqlstr+s1 +'('+s2+')';
if wz.text='全部' then
begin
if (tempstr[1] <>sqlstr) then
begin
tempstr[1] :=sqlstr;
nodecel[1] := TreeView1.Items.AddChild(nodecel[0], tempstr[1]);
nodecel[1].ImageIndex := 1;
nodecel[1].SelectedIndex := 3;
end;
new(nodeid); nodeid^:=ADODataSet1.FieldByName('id').asinteger;
Nodetitle :=TreeView1.Items.AddChildObject(nodecel[1], ADODataSet1.FieldByName('位置').AsString,nodeid);
Nodetitle.ImageIndex := 2;
Nodetitle.SelectedIndex := 3;
end
else
begin
if (tempstr[1] <>sqlstr) then
new(nodeid); nodeid^:=ADODataSet1.FieldByName('id').asinteger;
Nodetitle :=TreeView1.Items.AddChildObject(nodecel[0], sqlstr,nodeid);
Nodetitle.ImageIndex := 2;
Nodetitle.SelectedIndex := 3;
end;
ADODataSet1.Next;
end;
nodecel[0].Expanded := True;
ADODataSet1.close;
ADODataSet1.CursorLocation:=clUseClient;
ADODataSet1.CursorType:=ctDynamic;
ADODataSet1.LockType:=ltOptimistic;
TreeView1.Items.endUpdate;
screen.Cursor:=crDefault;
var Node, ChildNode: TTreeNode;
begin
Node := TreeView1.Selected;
if Node = nil then Exit;
with Query do
begin
Close;
Sql.Text := 'select * from tablename where colname='''+Node.Text+'''';
Open;
while not Eof do
begin
ChildNode:= TreeView1.Items.AddChild(Node,FieldByName('colname2').AsString);
ChildNode.Text := FieldByName('colname2').AsString;
Next;
end;
end;
end;
TTreeItem有这样一个属性Data,它是一个指针,专门来指向自定义数据的。
比如你定义一个数据类型TDataTest,直接把对象或变量赋值给Data属性就行了;
调用的时候只要将指针强制转换成你定义的类型就可以直接用了。请注意Data只是个指针,TTreeView不提供相应的内存管理,要自己创建和释放!