我用的指针和treeview: procedure tmain.RootTree(treeview1:ttreeview); var query:TADOQuery; nodetemp:TTreenode; pstr:^string; str:string; begin; 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;
unit Unt_FrmManager; ... type PID = ^CurID; CurID = record ID: Integer; end; TFrmManager = class(TForm) ... private { Private declarations } procedure InitTrvManager; //初始化树 procedure DisposeTrv; ////销毁指针 ... var TrvArr: array of PID; //数组 MaxR: Integer; //MaxR 指针数组数
... procedure TFrmManager.InitTrvManager; var TempNode, NodeApp: TTreeNode; TempID, pp: integer; begin TrvMod.Items.BeginUpdate; TrvMod.Items.Clear; DisposeTrv; pp := 0; InitCliDS; //刷新数据集 SetLength(TrvArr, MaxR); with TrvMod.Items do begin TempNode := Add(nil, '[应用]'); with CliDSApp do begin First; while not Eof do begin TempID := FieldByName('ID').AsInteger; NodeApp := AddChild(TempNode, FieldByName('AppName').AsString); New(TrvArr[pp]); TrvArr[pp]^.ID := TempID; NodeApp.Data := TrvArr[pp]; Inc(pp); Next; end; end; end; TrvMod.Items.EndUpdate; end; ...procedure TFrmManager.DisposeTrv; //销毁指针 var i: Integer; begin try for i := 0 to MaxR - 1 do Dispose(TrvArr[i]); except end; end; ...使用: CurAppID := PID(TrvMod.Selected.Data)^.ID; //获得当前选中节点对应的数据(ID)
具体指哪方面的?TreeNode.Data?
这里NULL可以换成一个TreeNode做为父节点
TreeView.Selected.Delete(); 删除你选定的那条TreeView.Items.Item[0.Focused := true 选定第一个节点
http://expert.csdn.net/Expert/topic/1335/1335256.xml?temp=.3093531
看看这两个问题吧,答对了重重有分啊
procedure tmain.RootTree(treeview1:ttreeview);
var
query:TADOQuery;
nodetemp:TTreenode;
pstr:^string;
str:string;
begin;
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;
...
type
PID = ^CurID;
CurID = record
ID: Integer;
end; TFrmManager = class(TForm)
...
private
{ Private declarations }
procedure InitTrvManager; //初始化树
procedure DisposeTrv; ////销毁指针
...
var
TrvArr: array of PID; //数组
MaxR: Integer; //MaxR 指针数组数
...
procedure TFrmManager.InitTrvManager;
var
TempNode, NodeApp: TTreeNode;
TempID, pp: integer;
begin
TrvMod.Items.BeginUpdate;
TrvMod.Items.Clear;
DisposeTrv;
pp := 0; InitCliDS; //刷新数据集 SetLength(TrvArr, MaxR);
with TrvMod.Items do
begin
TempNode := Add(nil, '[应用]');
with CliDSApp do
begin
First;
while not Eof do
begin
TempID := FieldByName('ID').AsInteger;
NodeApp := AddChild(TempNode, FieldByName('AppName').AsString);
New(TrvArr[pp]);
TrvArr[pp]^.ID := TempID;
NodeApp.Data := TrvArr[pp];
Inc(pp);
Next;
end;
end;
end;
TrvMod.Items.EndUpdate;
end;
...procedure TFrmManager.DisposeTrv; //销毁指针
var
i: Integer;
begin
try
for i := 0 to MaxR - 1 do
Dispose(TrvArr[i]);
except
end;
end;
...使用:
CurAppID := PID(TrvMod.Selected.Data)^.ID;
//获得当前选中节点对应的数据(ID)