现成的代码,参考一下吧,改一下表名和字段名即可 var List:TStringList; Node:TTreeNode; Index:Integer; begin with Querydo begin Close; SQL.Clear; SQL.Text:='SELECT * FROM '+TableName+' ORDER BY PID,ID'; Open; end; TreeView.Items.BeginUpdate; try TreeView.Items.Clear; List:= TStringList.Create; try List.Sorted:= True; while not Query.Eof do begin if Query.FieldByName('PID').AsInteger= 0 then Node:= TreeView.Items.AddChild(nil, Query.FieldByName(mName).AsString) else begin Index:= List.IndexOf(Query.FieldByName('PID').AsString); Node:= TreeView.Items.AddChildFirst(TTreeNode(List.Objects[index]), Query.FieldByName(mName).AsString); end; List.AddObject(Query.FieldByName('ID').AsString, Node); Query.Next; end; finally List.Free; end; finally TreeView.Items.EndUpdate; end;
ID parentid name sort 1 0 工程文件夹 1 1.1 1 XX工程 0 1.1.1 1.1 OO段 0 1.2 1 YY工程 0就是这样啊,不会发图..
DATA是指针类型的吧?我要怎么才能取到他的值呢?
添加同级文件夹//添加同级文件夹 procedure TForm1.Button5Click(Sender: TObject); var node,node1:Ttreenode; begin node:=self.TreeView1.Selected.Parent; node1:=self.TreeView1.Items.AddChild(node,'fdfd') ; node1.ImageIndex:=0; if node=nil then begin m:=0; i:=self.TreeView1.Items.Count; for j:=0 to i-1 do begin if self.TreeView1.Items[j].Parent=nil then m:=m+1; end; self.adoquery1.close; self.adoquery1.connection:=self.adoconnection1; self.adoquery1.sql.clear; self.adoquery1.sql.add('insert into tablename (id,parent,name,sort) values(:s1,:s2,:s3,1)'); self.ADOQuery1.Parameters.ParamByName('s1').Value:=inttostr(m+1); self.ADOQuery1.Parameters.ParamByName('s2').Value:=0; self.ADOQuery1.Parameters.ParamByName('s3').Value:='fdfd'; self.adoquery1.ExecSQL end else begin i:=node.GetLastChild.Index+1; s:=node.text; self.adoquery1.close; self.adoquery1.connection:=self.adoconnection1; self.adoquery1.sql.clear; self.adoquery1.sql.add(select * from tablename where name=:s1'); self.ADOQuery1.Parameters.ParamByName('s1').Value:=s; self.adoquery1.Open; bh:=self.adoquery1.fieldbyname('id').asstring; self.adoquery1.close; self.adoquery1.connection:=self.adoconnection1; self.adoquery1.sql.clear; self.adoquery1.sql.add('insert into tablename (id,parent,name,sort) values(:s1,:s2,:s3,1)'); self.ADOQuery1.Parameters.ParamByName('s1').Value:=bh+'.'+inttostr(i); self.ADOQuery1.Parameters.ParamByName('s2').Value:=bh; self.ADOQuery1.Parameters.ParamByName('s3').Value:='fdfd'; self.adoquery1.ExecSQL end; end;
哎,空写代码太麻烦了添加下一级的数据库保存与添加同级的差不多//添加下级文件夹 procedure TForm1.Button5Click(Sender: TObject); var node,node1:Ttreenode; begin node:=self.TreeView1.Selected; node1:=self.TreeView1.Items.AddChild(node,'fdfd') ; node1.ImageIndex:=0; i:=node.GetLastChild.Index+1; s:=node.text; self.adoquery1.close; self.adoquery1.connection:=self.adoconnection1; self.adoquery1.sql.clear; self.adoquery1.sql.add(select * from tablename where name=:s1'); self.ADOQuery1.Parameters.ParamByName('s1').Value:=s; self.adoquery1.Open; bh:=self.adoquery1.fieldbyname('id').asstring; self.adoquery1.close; self.adoquery1.connection:=self.adoconnection1; self.adoquery1.sql.clear; self.adoquery1.sql.add('insert into tablename (id,parent,name,sort) values(:s1,:s2,:s3,1)'); self.ADOQuery1.Parameters.ParamByName('s1').Value:=bh+'.'+inttostr(i); self.ADOQuery1.Parameters.ParamByName('s2').Value:=bh; self.ADOQuery1.Parameters.ParamByName('s3').Value:='fdfd'; self.adoquery1.ExecSQL end;
删除//添加下级文件夹 procedure TForm1.Button5Click(Sender: TObject); var node,node1:Ttreenode; begin node1:=self.TreeView1.Selected; s:=node1.text; node:=node1.parent; if node=nil then begin i:=node1.index+1; self.adoquery1.close; self.adoquery1.connection:=self.adoconnection1; self.adoquery1.sql.clear; self.adoquery1.sql.add(delete from tablename where name=:s1 and id=:s2'); self.ADOQuery1.Parameters.ParamByName('s1').Value:=s; self.ADOQuery1.Parameters.ParamByName('s2').Value:=inttostr(i); self.adoquery1.ExecSQL; end else begin s1:=node.text; self.adoquery1.close; self.adoquery1.connection:=self.adoconnection1; self.adoquery1.sql.clear; self.adoquery1.sql.add(select * from tablename where name=:s1 and parent=''0'''); self.ADOQuery1.Parameters.ParamByName('s1').Value:=s1; self.adoquery1.Open; bh:=self.adoquery1.fieldbyname('id').asstring; self.adoquery1.close; self.adoquery1.connection:=self.adoconnection1; self.adoquery1.sql.clear; self.adoquery1.sql.add(delete from tablename where name=:s1 and parent=:s2'); self.ADOQuery1.Parameters.ParamByName('s1').Value:=s; self.ADOQuery1.Parameters.ParamByName('s2').Value:=bh; self.adoquery1.ExecSQL; end; end;
如果text不是唯一的,就要在生成树的时候为每个节点创建一个data,里面包含此节点的id,在操作时,不取其text,而是取其data中的id值 给数节点添加data和读取data内容的参考代码如下,剩下的就简单了,你自己搞定吧unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls, Buttons, ComCtrls; //定义一个树结构 type tmx=packed record bh:array[0..100] of string;//这个可以作为存放ID的字符串数组 end; pmx=^tmx; //********************** type TForm1 = class(TForm) StringGrid1: TStringGrid; TreeView1: TTreeView; BitBtn1: TBitBtn; BitBtn2: TBitBtn; Label1: TLabel; Label2: TLabel; procedure FormShow(Sender: TObject); procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); procedure StringGrid1KeyPress(Sender: TObject; var Key: Char); procedure BitBtn1Click(Sender: TObject); procedure TreeView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}//添加节点,并为每个节点创建一个data procedure TForm1.BitBtn1Click(Sender: TObject); var p:pmx; tn:TTreeNode; begin new(p); p.bh[0]:='010001'; p.bh[1]:='010002'; self.TreeView1.Items.Clear; tn:=self.TreeView1.Items.Add(nil,'1');//创建父节点 //创建子节点,并为其关联一个结构体,123和234是节点的text self.TreeView1.Items.AddChildObject(tn,'123',p); self.TreeView1.Items.AddChildObject(tn,'234',p); end; //读取节点的data内容 procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var tn:TTreeNode; s1,s2:string; i:Integer; begin tn:=self.TreeView1.GetNodeAt(x,y); if tn=nil then Exit; if tn.Parent=nil then Exit; i:=tn.Index; s1:=pmx(tn.Data).bh[i]; self.Label1.Caption:=s1; self.Label2.Caption:=s2; end;
lovelymelon,能帮我改下吗/?我现在建树的过程是这样的!procedure TfrmManage.UpdateTreeView; var List:TStringList; Node:TTreeNode; Index:Integer; begin with DM.aqryManage do begin Close; SQL.Clear; SQL.Text:='SELECT * FROM List ORDER BY ParentID,ID'; Open; end; tvGCList.Items.BeginUpdate; try tvGCList.Items.Clear; List:= TStringList.Create; try List.Sorted:= True; while not DM.aqryManage.Eof do begin if DM.aqryManage.FieldByName('ParentID').AsString= '0' then begin Node:= tvGCList.Items.AddChild(nil, DM.aqryManage.FieldByName('mc').AsString); Node.ImageIndex:=0 end else begin Index:= List.IndexOf(DM.aqryManage.FieldByName('ParentID').AsString); Node:= tvGCList.Items.AddChildFirst(TTreeNode(List.Objects[index]), DM.aqryManage.FieldByName('mc').AsString); Node.ImageIndex:=0 end; List.AddObject(DM.aqryManage.FieldByName('ID').AsString, Node); DM.aqryManage.Next; end; finally List.Free; end; finally tvGCList.Items.EndUpdate; end; end;
procedure TfrmManage.UpdateTreeView; var List:TStringList; Node:TTreeNode; Index:Integer; begin with DM.aqryManage do begin Close; SQL.Clear; SQL.Text:='SELECT * FROM List ORDER BY ParentID,ID'; Open; end; tvGCList.Items.BeginUpdate; try tvGCList.Items.Clear; List:= TStringList.Create; try List.Sorted:= True; while not DM.aqryManage.Eof do begin if DM.aqryManage.FieldByName('ParentID').AsString= '0' then begin Node:= tvGCList.Items.AddChild(nil, DM.aqryManage.FieldByName('mc').AsString); Node.ImageIndex:=0 end else begin Index:= List.IndexOf(DM.aqryManage.FieldByName('ParentID').AsString); Node:= tvGCList.Items.AddChildFirst(TTreeNode(List.Objects[index]), DM.aqryManage.FieldByName('mc').AsString); Node.ImageIndex:=0 end; List.AddObject(DM.aqryManage.FieldByName('ID').AsString, Node); DM.aqryManage.Next; end; finally List.Free; end; finally tvGCList.Items.EndUpdate; end; end;
结合上面我给你那段代码,那里有结构体的定义,你试试procedure TfrmManage.UpdateTreeView; var List:TStringList; Node:TTreeNode; Index,i:Integer; p:pmx; mc:string; begin new(p); with DM.aqryManage do begin Close; SQL.Clear; SQL.Text:='SELECT * FROM List ORDER BY ParentID,ID'; Open; end; tvGCList.Items.BeginUpdate; try tvGCList.Items.Clear; List:= TStringList.Create; try List.Sorted:= True; while not DM.aqryManage.Eof do begin i:=DM.aqryManage.RecNo; s:=DM.aqryManage.FieldByName('ID').AsString; mc:=DM.aqryManage.FieldByName('mc').AsString; p.bh[i-1]:=s; if DM.aqryManage.FieldByName('ParentID').AsString= '0' then begin Node:= tvGCList.Items.AddChildObject(nil, mc,p); Node.ImageIndex:=0 end else begin Index:= List.IndexOf(DM.aqryManage.FieldByName('ParentID').AsString); Node:= tvGCList.Items.AddChildObject(TTreeNode(List.Objects[index]),mc,p); Node.ImageIndex:=0 end; List.AddObject(DM.aqryManage.FieldByName('ID').AsString, Node); DM.aqryManage.Next; end; finally List.Free; end; finally tvGCList.Items.EndUpdate; end; end;
不可能吧,在循环里怎么会出现这种情况 DM.aqryManage.First;//加上这句试试 while not DM.aqryManage.Eof do begin i:=DM.aqryManage.RecNo; s:=DM.aqryManage.FieldByName('ID').AsString; mc:=DM.aqryManage.FieldByName('mc').AsString;或者这样 i:=0;// while not DM.aqryManage.Eof do beign i:=i+1; s:=DM.aqryManage.FieldByName('ID').AsString; mc:=DM.aqryManage.FieldByName('mc').AsString;
这样生成的树用鼠标点击节点后显示的ID值与数据库里面ID值对不上号....
procedure TfrmManage.tvGCListClick(Sender: TObject); var tn:TTreeNode; i:Integer; s1:string; begin tn:=tvGCList.Selected; if tn=nil then Exit; if tn.Parent=nil then Exit; i:=tn.Index; s1:=pmx(tn.Data).bh[i]; ShowMessage(s1); end;
begin Index:= List.IndexOf(DM.aqryManage.FieldByName('ParentID').AsString); Node:= tvGCList.Items.AddChildObject(TTreeNode(List.Objects[index]),mc,p); Node.ImageIndex:=0 end; 可能是这段有问题
procedure TfrmManage.tvGCListClick(Sender: TObject); var tn:TTreeNode; i:Integer; s1:string; begin tn:=tvGCList.Selected; if tn=nil then Exit; if tn.Parent=nil then Exit; i:=tn.AbsoluteIndex;//这里改了试试,你那样去的index不对 s1:=pmx(tn.Data).bh[i]; ShowMessage(s1); end;
生成树的代码改成这样,哎,直接在网页上写代码真是难啊procedure TfrmManage.UpdateTreeView; var List,list1:TStrings; Node:TTreeNode; Index,i,m,n,k:Integer; p:pmx; mc:string; begin new(p); with DM.aqryManage do begin Close; SQL.Clear; SQL.Text:='SELECT * FROM List ORDER BY ParentID,ID'; Open; end; tvGCList.Items.BeginUpdate; try tvGCList.Items.Clear; List:= TStringList.Create; List.Clear; List1:= TStringList.Create; List1.Clear; try
while not DM.aqryManage.Eof do begin i:=DM.aqryManage.RecNo; s:=DM.aqryManage.FieldByName('ID').AsString; mc:=DM.aqryManage.FieldByName('mc').AsString; p.bh[i-1]:=s; if DM.aqryManage.FieldByName('ParentID').AsString= '0' then begin Node:= tvGCList.Items.AddChildObject(nil, mc,p); Node.ImageIndex:=0; k:=node.AbsoluteIndex; if list.index(s)=-1 then begin List.Add(s); list1.add(inttostr(k)); end; end else begin Index:= List.IndexOf(DM.aqryManage.FieldByName('ParentID').AsString); k:=strtoint(list1.strings[index]); Node:= tvGCList.Items.AddChildObject(TTreeNode(k),mc,p); Node.ImageIndex:=0 end; DM.aqryManage.Next; end; finally List.Free; end; finally tvGCList.Items.EndUpdate; end; end;
靠,还是差了些东西,应该这样 靠,已经发三帖了,郁闷啊,等吧 我发给你的这个,你试了?还有什么问题?procedure TfrmManage.UpdateTreeView; var List,list1:TStrings; Node:TTreeNode; Index,i,m,n,k:Integer; p:pmx; mc:string; begin new(p); with DM.aqryManage do begin Close; SQL.Clear; SQL.Text:='SELECT * FROM List ORDER BY ParentID,ID'; Open; end; tvGCList.Items.BeginUpdate; try tvGCList.Items.Clear; List:= TStringList.Create; List.Clear; List1:= TStringList.Create; List1.Clear; try
while not DM.aqryManage.Eof do begin i:=DM.aqryManage.RecNo; s:=DM.aqryManage.FieldByName('ID').AsString; mc:=DM.aqryManage.FieldByName('mc').AsString; p.bh[i-1]:=s; if DM.aqryManage.FieldByName('ParentID').AsString= '0' then begin Node:= tvGCList.Items.AddChildObject(nil, mc,p); Node.ImageIndex:=0; k:=node.AbsoluteIndex; if list.index(s)=-1 then begin List.Add(s); list1.add(inttostr(k)); end; end else begin Index:= List.IndexOf(DM.aqryManage.FieldByName('ParentID').AsString); k:=strtoint(list1.strings[index]); Node:= tvGCList.Items.AddChildObject(TTreeNode(k),mc,p); Node.ImageIndex:=0; k:=node.AbsoluteIndex; if list.index(s)=-1 then begin List.Add(s); list1.add(inttostr(k)); end; end; DM.aqryManage.Next; end; finally List.Free; end; finally tvGCList.Items.EndUpdate; end; end;
//添加同级文件夹 procedure TForm1.Button5Click(Sender: TObject); var node,node1:Ttreenode; begin node:=self.TreeView1.Selected.Parent; node1:=self.TreeView1.Items.AddChild(node,'fdfd') ; node1.ImageIndex:=0; if node=nil then begin m:=0; i:=self.TreeView1.Items.Count; for j:=0 to i-1 do begin if self.TreeView1.Items[j].Parent=nil then m:=m+1; end; self.adoquery1.close; self.adoquery1.connection:=self.adoconnection1; self.adoquery1.sql.clear; self.adoquery1.sql.add('insert into tablename (id,parent,name,sort) values(:s1,:s2,:s3,1)'); self.ADOQuery1.Parameters.ParamByName('s1').Value:=inttostr(m+1); self.ADOQuery1.Parameters.ParamByName('s2').Value:=0; self.ADOQuery1.Parameters.ParamByName('s3').Value:='fdfd'; self.adoquery1.ExecSQL end else begin i:=node.GetLastChild.Index+1;//得到i的值为6 s:=node.text; self.adoquery1.close; self.adoquery1.connection:=self.adoconnection1; self.adoquery1.sql.clear; self.adoquery1.sql.add(select * from tablename where name=:s1'); self.ADOQuery1.Parameters.ParamByName('s1').Value:=s; self.adoquery1.Open; bh:=self.adoquery1.fieldbyname('id').asstring; self.adoquery1.close; self.adoquery1.connection:=self.adoconnection1; self.adoquery1.sql.clear; self.adoquery1.sql.add('insert into tablename (id,parent,name,sort) values(:s1,:s2,:s3,1)'); self.ADOQuery1.Parameters.ParamByName('s1').Value:=bh+'.'+inttostr(i);//** self.ADOQuery1.Parameters.ParamByName('s2').Value:=bh; self.ADOQuery1.Parameters.ParamByName('s3').Value:='fdfd'; self.adoquery1.ExecSQL end; end; 这段代码,如果我先在的ID是 1.1,1.2,1.3,1.6,1.7.因为我把1.6删掉了所以这样. i:=node.GetLastChild.Index+1;//得到i的值为6 最后 self.ADOQuery1.Parameters.ParamByName('s1').Value:=bh+'.'+inttostr(i);//** self.ADOQuery1.Parameters.ParamByName('s2').Value:=bh; self.ADOQuery1.Parameters.ParamByName('s3').Value:='fdfd'; self.adoquery1.ExecSQL 插入的时候s1就等于1.6了,这样和以前的ID重复了,ID是唯一的.
add.subitem.add
var
List:TStringList;
Node:TTreeNode;
Index:Integer;
begin
with Querydo
begin
Close;
SQL.Clear;
SQL.Text:='SELECT * FROM '+TableName+' ORDER BY PID,ID';
Open;
end;
TreeView.Items.BeginUpdate;
try
TreeView.Items.Clear; List:= TStringList.Create;
try
List.Sorted:= True; while not Query.Eof do
begin
if Query.FieldByName('PID').AsInteger= 0 then
Node:= TreeView.Items.AddChild(nil, Query.FieldByName(mName).AsString)
else
begin
Index:= List.IndexOf(Query.FieldByName('PID').AsString);
Node:= TreeView.Items.AddChildFirst(TTreeNode(List.Objects[index]),
Query.FieldByName(mName).AsString);
end;
List.AddObject(Query.FieldByName('ID').AsString, Node);
Query.Next;
end;
finally
List.Free;
end;
finally
TreeView.Items.EndUpdate;
end;
TreeView的Images指向ImageList1
通过代码设置ImageIndex,默认为0
Query.FieldByName(mName).AsString);
Node.ImageIndex:=0;//这里加上这句
procedure TForm1.TreeView1Expanded(Sender: TObject; Node: TTreeNode);
begin
node.ImageIndex:=1;
end;procedure TForm1.TreeView1Collapsed(Sender: TObject; Node: TTreeNode);
begin
node.ImageIndex:=0;
end;
//添加同级文件夹
procedure TForm1.Button5Click(Sender: TObject);
var
node:Ttreenode;
begin
node:=self.TreeView1.Selected.Parent;
node:=self.TreeView1.Items.AddChild(node,'fdfd') ;
node.ImageIndex:=0;
end;
//添加下级文件夹
procedure TForm1.Button6Click(Sender: TObject);
var
node:Ttreenode;
begin
node:=Self.TreeView1.Selected;
node:=Self.TreeView1.Items.AddChild(node,'fdsfsdf');end;
//删除
procedure TForm1.Button7Click(Sender: TObject);
begin
self.TreeView1.Selected.Delete;
end;
//改名
procedure TForm1.Button8Click(Sender: TObject);
begin
self.TreeView1.Selected.Text:='fsdfsdfds';
end;
不知道你能不能明白
字段ID(文本),parentid(文本),name(文本) 就是这样的结构啊.另外还有个SORT字段不要也可以.
1 0 工程文件夹 1
1.1 1 XX工程 0
1.1.1 1.1 OO段 0
1.2 1 YY工程 0就是这样啊,不会发图..
procedure TForm1.Button5Click(Sender: TObject);
var
node,node1:Ttreenode;
begin
node:=self.TreeView1.Selected.Parent;
node1:=self.TreeView1.Items.AddChild(node,'fdfd') ;
node1.ImageIndex:=0;
if node=nil then
begin
m:=0;
i:=self.TreeView1.Items.Count;
for j:=0 to i-1 do
begin
if self.TreeView1.Items[j].Parent=nil then
m:=m+1;
end;
self.adoquery1.close;
self.adoquery1.connection:=self.adoconnection1;
self.adoquery1.sql.clear;
self.adoquery1.sql.add('insert into tablename (id,parent,name,sort) values(:s1,:s2,:s3,1)');
self.ADOQuery1.Parameters.ParamByName('s1').Value:=inttostr(m+1);
self.ADOQuery1.Parameters.ParamByName('s2').Value:=0;
self.ADOQuery1.Parameters.ParamByName('s3').Value:='fdfd';
self.adoquery1.ExecSQL
end
else
begin
i:=node.GetLastChild.Index+1;
s:=node.text;
self.adoquery1.close;
self.adoquery1.connection:=self.adoconnection1;
self.adoquery1.sql.clear;
self.adoquery1.sql.add(select * from tablename where name=:s1');
self.ADOQuery1.Parameters.ParamByName('s1').Value:=s;
self.adoquery1.Open;
bh:=self.adoquery1.fieldbyname('id').asstring;
self.adoquery1.close;
self.adoquery1.connection:=self.adoconnection1;
self.adoquery1.sql.clear;
self.adoquery1.sql.add('insert into tablename (id,parent,name,sort) values(:s1,:s2,:s3,1)');
self.ADOQuery1.Parameters.ParamByName('s1').Value:=bh+'.'+inttostr(i);
self.ADOQuery1.Parameters.ParamByName('s2').Value:=bh;
self.ADOQuery1.Parameters.ParamByName('s3').Value:='fdfd';
self.adoquery1.ExecSQL
end;
end;
procedure TForm1.Button5Click(Sender: TObject);
var
node,node1:Ttreenode;
begin
node:=self.TreeView1.Selected;
node1:=self.TreeView1.Items.AddChild(node,'fdfd') ;
node1.ImageIndex:=0;
i:=node.GetLastChild.Index+1;
s:=node.text;
self.adoquery1.close;
self.adoquery1.connection:=self.adoconnection1;
self.adoquery1.sql.clear;
self.adoquery1.sql.add(select * from tablename where name=:s1');
self.ADOQuery1.Parameters.ParamByName('s1').Value:=s;
self.adoquery1.Open;
bh:=self.adoquery1.fieldbyname('id').asstring;
self.adoquery1.close;
self.adoquery1.connection:=self.adoconnection1;
self.adoquery1.sql.clear;
self.adoquery1.sql.add('insert into tablename (id,parent,name,sort) values(:s1,:s2,:s3,1)');
self.ADOQuery1.Parameters.ParamByName('s1').Value:=bh+'.'+inttostr(i);
self.ADOQuery1.Parameters.ParamByName('s2').Value:=bh;
self.ADOQuery1.Parameters.ParamByName('s3').Value:='fdfd';
self.adoquery1.ExecSQL
end;
procedure TForm1.Button5Click(Sender: TObject);
var
node,node1:Ttreenode;
begin
node1:=self.TreeView1.Selected;
s:=node1.text;
node:=node1.parent;
if node=nil then
begin
i:=node1.index+1;
self.adoquery1.close;
self.adoquery1.connection:=self.adoconnection1;
self.adoquery1.sql.clear;
self.adoquery1.sql.add(delete from tablename where name=:s1 and id=:s2');
self.ADOQuery1.Parameters.ParamByName('s1').Value:=s;
self.ADOQuery1.Parameters.ParamByName('s2').Value:=inttostr(i);
self.adoquery1.ExecSQL;
end
else
begin
s1:=node.text;
self.adoquery1.close;
self.adoquery1.connection:=self.adoconnection1;
self.adoquery1.sql.clear;
self.adoquery1.sql.add(select * from tablename where name=:s1 and parent=''0''');
self.ADOQuery1.Parameters.ParamByName('s1').Value:=s1;
self.adoquery1.Open;
bh:=self.adoquery1.fieldbyname('id').asstring; self.adoquery1.close;
self.adoquery1.connection:=self.adoconnection1;
self.adoquery1.sql.clear;
self.adoquery1.sql.add(delete from tablename where name=:s1 and parent=:s2');
self.ADOQuery1.Parameters.ParamByName('s1').Value:=s;
self.ADOQuery1.Parameters.ParamByName('s2').Value:=bh;
self.adoquery1.ExecSQL; end;
end;
给数节点添加data和读取data内容的参考代码如下,剩下的就简单了,你自己搞定吧unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, Buttons, ComCtrls;
//定义一个树结构
type
tmx=packed record
bh:array[0..100] of string;//这个可以作为存放ID的字符串数组
end;
pmx=^tmx;
//**********************
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
TreeView1: TTreeView;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Label1: TLabel;
Label2: TLabel;
procedure FormShow(Sender: TObject);
procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
procedure BitBtn1Click(Sender: TObject);
procedure TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}//添加节点,并为每个节点创建一个data
procedure TForm1.BitBtn1Click(Sender: TObject);
var
p:pmx;
tn:TTreeNode;
begin
new(p);
p.bh[0]:='010001';
p.bh[1]:='010002';
self.TreeView1.Items.Clear;
tn:=self.TreeView1.Items.Add(nil,'1');//创建父节点
//创建子节点,并为其关联一个结构体,123和234是节点的text
self.TreeView1.Items.AddChildObject(tn,'123',p);
self.TreeView1.Items.AddChildObject(tn,'234',p);
end;
//读取节点的data内容
procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
tn:TTreeNode;
s1,s2:string;
i:Integer;
begin
tn:=self.TreeView1.GetNodeAt(x,y);
if tn=nil then
Exit;
if tn.Parent=nil then
Exit;
i:=tn.Index;
s1:=pmx(tn.Data).bh[i];
self.Label1.Caption:=s1;
self.Label2.Caption:=s2;
end;
var
List:TStringList;
Node:TTreeNode;
Index:Integer;
begin
with DM.aqryManage do
begin
Close;
SQL.Clear;
SQL.Text:='SELECT * FROM List ORDER BY ParentID,ID';
Open;
end;
tvGCList.Items.BeginUpdate;
try
tvGCList.Items.Clear; List:= TStringList.Create;
try
List.Sorted:= True; while not DM.aqryManage.Eof do
begin
if DM.aqryManage.FieldByName('ParentID').AsString= '0' then
begin
Node:= tvGCList.Items.AddChild(nil, DM.aqryManage.FieldByName('mc').AsString);
Node.ImageIndex:=0
end
else
begin
Index:= List.IndexOf(DM.aqryManage.FieldByName('ParentID').AsString);
Node:= tvGCList.Items.AddChildFirst(TTreeNode(List.Objects[index]),
DM.aqryManage.FieldByName('mc').AsString);
Node.ImageIndex:=0
end;
List.AddObject(DM.aqryManage.FieldByName('ID').AsString, Node);
DM.aqryManage.Next;
end;
finally
List.Free;
end;
finally
tvGCList.Items.EndUpdate;
end;
end;
var
List:TStringList;
Node:TTreeNode;
Index:Integer;
begin
with DM.aqryManage do
begin
Close;
SQL.Clear;
SQL.Text:='SELECT * FROM List ORDER BY ParentID,ID';
Open;
end;
tvGCList.Items.BeginUpdate;
try
tvGCList.Items.Clear; List:= TStringList.Create;
try
List.Sorted:= True; while not DM.aqryManage.Eof do
begin
if DM.aqryManage.FieldByName('ParentID').AsString= '0' then
begin
Node:= tvGCList.Items.AddChild(nil, DM.aqryManage.FieldByName('mc').AsString);
Node.ImageIndex:=0
end
else
begin
Index:= List.IndexOf(DM.aqryManage.FieldByName('ParentID').AsString);
Node:= tvGCList.Items.AddChildFirst(TTreeNode(List.Objects[index]),
DM.aqryManage.FieldByName('mc').AsString);
Node.ImageIndex:=0
end;
List.AddObject(DM.aqryManage.FieldByName('ID').AsString, Node);
DM.aqryManage.Next;
end;
finally
List.Free;
end;
finally
tvGCList.Items.EndUpdate;
end;
end;
var
List:TStringList;
Node:TTreeNode;
Index,i:Integer;
p:pmx;
mc:string;
begin
new(p);
with DM.aqryManage do
begin
Close;
SQL.Clear;
SQL.Text:='SELECT * FROM List ORDER BY ParentID,ID';
Open;
end;
tvGCList.Items.BeginUpdate;
try
tvGCList.Items.Clear; List:= TStringList.Create;
try
List.Sorted:= True; while not DM.aqryManage.Eof do
begin
i:=DM.aqryManage.RecNo;
s:=DM.aqryManage.FieldByName('ID').AsString;
mc:=DM.aqryManage.FieldByName('mc').AsString;
p.bh[i-1]:=s;
if DM.aqryManage.FieldByName('ParentID').AsString= '0' then
begin
Node:= tvGCList.Items.AddChildObject(nil, mc,p);
Node.ImageIndex:=0
end
else
begin
Index:= List.IndexOf(DM.aqryManage.FieldByName('ParentID').AsString);
Node:= tvGCList.Items.AddChildObject(TTreeNode(List.Objects[index]),mc,p);
Node.ImageIndex:=0
end;
List.AddObject(DM.aqryManage.FieldByName('ID').AsString, Node);
DM.aqryManage.Next;
end;
finally
List.Free;
end;
finally
tvGCList.Items.EndUpdate;
end;
end;
s:=DM.aqryManage.FieldByName('ID').AsString;
mc:=DM.aqryManage.FieldByName('mc').AsString;
p.bh[i-1]:=s;
这里运行的时候DM.aqryManage.RecNo=-1了,所以运行到p.bh[i-1]:=s就提示出错了,这是怎么回事呢?
提示
while not DM.aqryManage.Eof do
begin
i:=DM.aqryManage.RecNo;
s:=DM.aqryManage.FieldByName('ID').AsString;
mc:=DM.aqryManage.FieldByName('mc').AsString;或者这样 i:=0;//
while not DM.aqryManage.Eof do
beign
i:=i+1;
s:=DM.aqryManage.FieldByName('ID').AsString;
mc:=DM.aqryManage.FieldByName('mc').AsString;
var
tn:TTreeNode;
i:Integer;
s1:string;
begin
tn:=tvGCList.Selected;
if tn=nil then
Exit;
if tn.Parent=nil then
Exit;
i:=tn.Index;
s1:=pmx(tn.Data).bh[i];
ShowMessage(s1);
end;
begin
Index:= List.IndexOf(DM.aqryManage.FieldByName('ParentID').AsString);
Node:= tvGCList.Items.AddChildObject(TTreeNode(List.Objects[index]),mc,p);
Node.ImageIndex:=0
end;
可能是这段有问题
procedure TfrmManage.tvGCListClick(Sender: TObject);
var
tn:TTreeNode;
i:Integer;
s1:string;
begin
tn:=tvGCList.Selected;
if tn=nil then
Exit;
if tn.Parent=nil then
Exit;
i:=tn.AbsoluteIndex;//这里改了试试,你那样去的index不对
s1:=pmx(tn.Data).bh[i];
ShowMessage(s1);
end;
var
List,list1:TStrings;
Node:TTreeNode;
Index,i,m,n,k:Integer;
p:pmx;
mc:string;
begin
new(p);
with DM.aqryManage do
begin
Close;
SQL.Clear;
SQL.Text:='SELECT * FROM List ORDER BY ParentID,ID';
Open;
end;
tvGCList.Items.BeginUpdate;
try
tvGCList.Items.Clear; List:= TStringList.Create;
List.Clear;
List1:= TStringList.Create;
List1.Clear; try
while not DM.aqryManage.Eof do
begin
i:=DM.aqryManage.RecNo;
s:=DM.aqryManage.FieldByName('ID').AsString;
mc:=DM.aqryManage.FieldByName('mc').AsString;
p.bh[i-1]:=s;
if DM.aqryManage.FieldByName('ParentID').AsString= '0' then
begin
Node:= tvGCList.Items.AddChildObject(nil, mc,p);
Node.ImageIndex:=0;
k:=node.AbsoluteIndex;
if list.index(s)=-1 then
begin
List.Add(s);
list1.add(inttostr(k));
end;
end
else
begin
Index:= List.IndexOf(DM.aqryManage.FieldByName('ParentID').AsString);
k:=strtoint(list1.strings[index]);
Node:= tvGCList.Items.AddChildObject(TTreeNode(k),mc,p);
Node.ImageIndex:=0
end;
DM.aqryManage.Next;
end;
finally
List.Free;
end;
finally
tvGCList.Items.EndUpdate;
end;
end;
靠,已经发三帖了,郁闷啊,等吧
我发给你的这个,你试了?还有什么问题?procedure TfrmManage.UpdateTreeView;
var
List,list1:TStrings;
Node:TTreeNode;
Index,i,m,n,k:Integer;
p:pmx;
mc:string;
begin
new(p);
with DM.aqryManage do
begin
Close;
SQL.Clear;
SQL.Text:='SELECT * FROM List ORDER BY ParentID,ID';
Open;
end;
tvGCList.Items.BeginUpdate;
try
tvGCList.Items.Clear; List:= TStringList.Create;
List.Clear;
List1:= TStringList.Create;
List1.Clear; try
while not DM.aqryManage.Eof do
begin
i:=DM.aqryManage.RecNo;
s:=DM.aqryManage.FieldByName('ID').AsString;
mc:=DM.aqryManage.FieldByName('mc').AsString;
p.bh[i-1]:=s;
if DM.aqryManage.FieldByName('ParentID').AsString= '0' then
begin
Node:= tvGCList.Items.AddChildObject(nil, mc,p);
Node.ImageIndex:=0;
k:=node.AbsoluteIndex;
if list.index(s)=-1 then
begin
List.Add(s);
list1.add(inttostr(k));
end;
end
else
begin
Index:= List.IndexOf(DM.aqryManage.FieldByName('ParentID').AsString);
k:=strtoint(list1.strings[index]);
Node:= tvGCList.Items.AddChildObject(TTreeNode(k),mc,p);
Node.ImageIndex:=0;
k:=node.AbsoluteIndex;
if list.index(s)=-1 then
begin
List.Add(s);
list1.add(inttostr(k));
end; end;
DM.aqryManage.Next;
end;
finally
List.Free;
end;
finally
tvGCList.Items.EndUpdate;
end;
end;
procedure TForm1.Button5Click(Sender: TObject);
var
node,node1:Ttreenode;
begin
node:=self.TreeView1.Selected.Parent;
node1:=self.TreeView1.Items.AddChild(node,'fdfd') ;
node1.ImageIndex:=0;
if node=nil then
begin
m:=0;
i:=self.TreeView1.Items.Count;
for j:=0 to i-1 do
begin
if self.TreeView1.Items[j].Parent=nil then
m:=m+1;
end;
self.adoquery1.close;
self.adoquery1.connection:=self.adoconnection1;
self.adoquery1.sql.clear;
self.adoquery1.sql.add('insert into tablename (id,parent,name,sort) values(:s1,:s2,:s3,1)');
self.ADOQuery1.Parameters.ParamByName('s1').Value:=inttostr(m+1);
self.ADOQuery1.Parameters.ParamByName('s2').Value:=0;
self.ADOQuery1.Parameters.ParamByName('s3').Value:='fdfd';
self.adoquery1.ExecSQL
end
else
begin
i:=node.GetLastChild.Index+1;//得到i的值为6
s:=node.text;
self.adoquery1.close;
self.adoquery1.connection:=self.adoconnection1;
self.adoquery1.sql.clear;
self.adoquery1.sql.add(select * from tablename where name=:s1');
self.ADOQuery1.Parameters.ParamByName('s1').Value:=s;
self.adoquery1.Open;
bh:=self.adoquery1.fieldbyname('id').asstring;
self.adoquery1.close;
self.adoquery1.connection:=self.adoconnection1;
self.adoquery1.sql.clear;
self.adoquery1.sql.add('insert into tablename (id,parent,name,sort) values(:s1,:s2,:s3,1)');
self.ADOQuery1.Parameters.ParamByName('s1').Value:=bh+'.'+inttostr(i);//**
self.ADOQuery1.Parameters.ParamByName('s2').Value:=bh;
self.ADOQuery1.Parameters.ParamByName('s3').Value:='fdfd';
self.adoquery1.ExecSQL
end;
end;
这段代码,如果我先在的ID是 1.1,1.2,1.3,1.6,1.7.因为我把1.6删掉了所以这样.
i:=node.GetLastChild.Index+1;//得到i的值为6
最后
self.ADOQuery1.Parameters.ParamByName('s1').Value:=bh+'.'+inttostr(i);//**
self.ADOQuery1.Parameters.ParamByName('s2').Value:=bh;
self.ADOQuery1.Parameters.ParamByName('s3').Value:='fdfd';
self.adoquery1.ExecSQL
插入的时候s1就等于1.6了,这样和以前的ID重复了,ID是唯一的.
这个的确很麻烦