说明没有 给你一个例子吧 unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, DB, DBTables, ImgList, ExtCtrls, DBCtrls, StdCtrls, Mask, Grids, DBGrids; const cTreeCodeFormat='122222';// cTreeMaxLevel=6; cTreeRootTxt='单位字典'; type TForm1 = class(TForm) tree: TTreeView; ImageList1: TImageList; Table1: TTable; Database1: TDatabase; DBEdit1: TDBEdit; DBEdit2: TDBEdit; DataSource1: TDataSource; DBNavigator1: TDBNavigator; DBGrid1: TDBGrid; procedure Table1NewRecord(DataSet: TDataSet); procedure Table1BeforeEdit(DataSet: TDataSet); procedure Table1AfterDelete(DataSet: TDataSet); procedure Table1AfterInsert(DataSet: TDataSet); procedure Table1AfterPost(DataSet: TDataSet); procedure Table1AfterEdit(DataSet: TDataSet); procedure Table1BeforeDelete(DataSet: TDataSet); procedure FormCreate(Sender: TObject); procedure treeClick(Sender: TObject); private { Private declarations } mystate, gNodeID:string; gNode:TTreeNode; gNodelevel:integer; procedure setFieldMask; procedure LoadTree(treeDB:TDBDataSet); procedure UpdateTree(curNode:TTreeNode;nodeTxt:string;state:string); function GetNodeLevel(sFormat,sCode:string):integer; public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm} procedure TForm1.setFieldMask; var i,j:integer; maskStr:string; setField:TField; begin setField:=table1.FieldByName('dwbm'); if (gNodeID<>'') and (gNodelevel<cTreeMaxLevel) then begin maskStr:=''; if setField.DataSet.state=dsInsert then j:=Length(gNodeID) else j:=Length(gNodeID)-2; for i:=1 to j do begin maskStr:=maskStr+'\'+gNodeID[i]; end; setField.EditMask:='!'+maskStr+'00;1;?'; end else begin setField.DataSet.Cancel; end; end;procedure TForm1.LoadTree(treeDB:TDBDataSet); var curID,nodeTxt:string; level,chindex,cnode,num:integer; mynode:array[0..6]of TTreeNode; begin Screen.Cursor:=crHourGlass; tree.Enabled:=True; tree.Items.clear; level:=0; num:=1; mynode[level]:=tree.Items.Add(Tree.TopItem,cTreeRootTxt); mynode[level].ImageIndex:=1; with treeDB do begin try if not Active then open; first; while not EOF do begin curID:=trim(FieldByName('dwbm').AsString ); nodeTxt:=curID+'-'+trim(FieldByName('dwmc').AsString ); level:=GetNodeLevel(cTreeCodeFormat,curID); if level>0 then begin mynode[level]:=tree.Items.addchild(mynode[level-1],nodeTxt); mynode[level].ImageIndex:=2; end; next; end; finally close; end; mynode[0].Expand(False); Screen.Cursor:=crDefault; end; end;procedure TForm1.UpdateTree(curNode:TTreeNode;nodeTxt:string;state:string); begin if state='add' then begin curNode:=tree.Items.AddChild(curNode,nodeTxt); curNode.ImageIndex:=2; end; if state='del' then curNode.Delete; if state='edi' then curNode.Text:=nodeTxt;end;function TForm1.GetNodeLevel(sFormat,sCode:string):integer; var i,level,iLen:integer; begin level:=-1; iLen:=0; if (sFormat<>'') and (sCode<>'') then begin for i:=1 to Length(sFormat) do begin iLen:=iLen+StrToInt(sFormat[i]); if Length(sCode)=iLen then begin level:=i; break; end; end; result:=level; end; end;procedure TForm1.Table1NewRecord(DataSet: TDataSet); begin setFieldMask; end;procedure TForm1.Table1BeforeEdit(DataSet: TDataSet); begin setFieldMask; end;procedure TForm1.Table1AfterDelete(DataSet: TDataSet); begin UpdateTree(gNode,'','del'); end;procedure TForm1.Table1AfterInsert(DataSet: TDataSet); begin mystate:='add'; end;procedure TForm1.Table1AfterPost(DataSet: TDataSet); var nodetext:string; begin nodetext:=table1.fieldbyName('dwbm').Text+'-'+table1.fieldByName('dwmc').Text; if mystate='add' then UpdateTree(gNode,nodetext,mystate); if mystate='edi' then UpdateTree(gNode,nodetext,mystate); mystate:='edi'; table1.Refresh; end;procedure TForm1.Table1AfterEdit(DataSet: TDataSet); begin mystate:='edi'; end;procedure TForm1.Table1BeforeDelete(DataSet: TDataSet); begin if Application.MessageBox('确定要删除?','操作提示', MB_OKCANCEL)<>IDOK then table1.cancel; end;procedure TForm1.FormCreate(Sender: TObject); begin table1.DatabaseName:='C:\My Documents\treeview'; LoadTree(table1); end;procedure TForm1.treeClick(Sender: TObject); var temp,recID:string; n,m:integer; curLevel:integer;begin gNode:=tree.Selected; n:=Pos('-',gNode.text)-1; recID:=copy(gNode.text,1,n); gNodeID:=recID; if gNode.text<>'单位字典' then begin if recID<>'' then begin with table1 do begin open; active:=true; FindNearest([recID]); end; curLevel:=getNodeLevel(cTreeCodeFormat,recID)+1; end else curLevel:=1; end; gNodelevel:=curLevel; end;end.
这么写不行吗?
你说不成功是指程序在运行出现异常还是没有加上子结点?
对了你将第一个add,也改为addchild;再试试看.
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, DB, DBTables, ImgList, ExtCtrls, DBCtrls, StdCtrls,
Mask, Grids, DBGrids;
const
cTreeCodeFormat='122222';//
cTreeMaxLevel=6;
cTreeRootTxt='单位字典';
type
TForm1 = class(TForm)
tree: TTreeView;
ImageList1: TImageList;
Table1: TTable;
Database1: TDatabase;
DBEdit1: TDBEdit;
DBEdit2: TDBEdit;
DataSource1: TDataSource;
DBNavigator1: TDBNavigator;
DBGrid1: TDBGrid;
procedure Table1NewRecord(DataSet: TDataSet);
procedure Table1BeforeEdit(DataSet: TDataSet);
procedure Table1AfterDelete(DataSet: TDataSet);
procedure Table1AfterInsert(DataSet: TDataSet);
procedure Table1AfterPost(DataSet: TDataSet);
procedure Table1AfterEdit(DataSet: TDataSet);
procedure Table1BeforeDelete(DataSet: TDataSet);
procedure FormCreate(Sender: TObject);
procedure treeClick(Sender: TObject);
private
{ Private declarations }
mystate,
gNodeID:string;
gNode:TTreeNode;
gNodelevel:integer;
procedure setFieldMask; procedure LoadTree(treeDB:TDBDataSet);
procedure UpdateTree(curNode:TTreeNode;nodeTxt:string;state:string);
function GetNodeLevel(sFormat,sCode:string):integer;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}
procedure TForm1.setFieldMask;
var
i,j:integer;
maskStr:string;
setField:TField;
begin
setField:=table1.FieldByName('dwbm');
if (gNodeID<>'') and (gNodelevel<cTreeMaxLevel) then
begin
maskStr:='';
if setField.DataSet.state=dsInsert then
j:=Length(gNodeID)
else
j:=Length(gNodeID)-2;
for i:=1 to j do
begin
maskStr:=maskStr+'\'+gNodeID[i];
end;
setField.EditMask:='!'+maskStr+'00;1;?';
end
else begin
setField.DataSet.Cancel;
end;
end;procedure TForm1.LoadTree(treeDB:TDBDataSet);
var
curID,nodeTxt:string;
level,chindex,cnode,num:integer;
mynode:array[0..6]of TTreeNode;
begin
Screen.Cursor:=crHourGlass;
tree.Enabled:=True;
tree.Items.clear;
level:=0;
num:=1;
mynode[level]:=tree.Items.Add(Tree.TopItem,cTreeRootTxt);
mynode[level].ImageIndex:=1;
with treeDB do
begin
try
if not Active then open;
first;
while not EOF do
begin
curID:=trim(FieldByName('dwbm').AsString );
nodeTxt:=curID+'-'+trim(FieldByName('dwmc').AsString );
level:=GetNodeLevel(cTreeCodeFormat,curID);
if level>0 then
begin
mynode[level]:=tree.Items.addchild(mynode[level-1],nodeTxt);
mynode[level].ImageIndex:=2; end;
next;
end;
finally
close;
end;
mynode[0].Expand(False);
Screen.Cursor:=crDefault;
end;
end;procedure TForm1.UpdateTree(curNode:TTreeNode;nodeTxt:string;state:string);
begin
if state='add' then
begin
curNode:=tree.Items.AddChild(curNode,nodeTxt);
curNode.ImageIndex:=2;
end;
if state='del' then curNode.Delete;
if state='edi' then curNode.Text:=nodeTxt;end;function TForm1.GetNodeLevel(sFormat,sCode:string):integer;
var
i,level,iLen:integer;
begin
level:=-1;
iLen:=0;
if (sFormat<>'') and (sCode<>'') then
begin
for i:=1 to Length(sFormat) do
begin
iLen:=iLen+StrToInt(sFormat[i]);
if Length(sCode)=iLen then
begin
level:=i;
break;
end;
end;
result:=level;
end;
end;procedure TForm1.Table1NewRecord(DataSet: TDataSet);
begin
setFieldMask;
end;procedure TForm1.Table1BeforeEdit(DataSet: TDataSet);
begin
setFieldMask;
end;procedure TForm1.Table1AfterDelete(DataSet: TDataSet);
begin
UpdateTree(gNode,'','del');
end;procedure TForm1.Table1AfterInsert(DataSet: TDataSet);
begin
mystate:='add';
end;procedure TForm1.Table1AfterPost(DataSet: TDataSet);
var
nodetext:string;
begin
nodetext:=table1.fieldbyName('dwbm').Text+'-'+table1.fieldByName('dwmc').Text;
if mystate='add' then
UpdateTree(gNode,nodetext,mystate);
if mystate='edi' then
UpdateTree(gNode,nodetext,mystate); mystate:='edi';
table1.Refresh;
end;procedure TForm1.Table1AfterEdit(DataSet: TDataSet);
begin
mystate:='edi';
end;procedure TForm1.Table1BeforeDelete(DataSet: TDataSet);
begin
if Application.MessageBox('确定要删除?','操作提示',
MB_OKCANCEL)<>IDOK then table1.cancel;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
table1.DatabaseName:='C:\My Documents\treeview';
LoadTree(table1);
end;procedure TForm1.treeClick(Sender: TObject);
var
temp,recID:string;
n,m:integer;
curLevel:integer;begin
gNode:=tree.Selected;
n:=Pos('-',gNode.text)-1;
recID:=copy(gNode.text,1,n);
gNodeID:=recID;
if gNode.text<>'单位字典' then
begin
if recID<>'' then
begin
with table1 do
begin
open;
active:=true;
FindNearest([recID]);
end;
curLevel:=getNodeLevel(cTreeCodeFormat,recID)+1;
end
else
curLevel:=1;
end;
gNodelevel:=curLevel;
end;end.