Delphi中dxTreelist控件的使用.docx_第1页
Delphi中dxTreelist控件的使用.docx_第2页
Delphi中dxTreelist控件的使用.docx_第3页
Delphi中dxTreelist控件的使用.docx_第4页
Delphi中dxTreelist控件的使用.docx_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Delphi中dxTreelist控件的使用 最近公司项目中用到dxTreelist控件,以前没怎么用过这个控件,该控件比TreeView功能更强大,要完全掌握还真不容易,下面是我个人做的一个Demo,对该控件进行增删改遍历操作,以便自己以后忘了使用方法随时可以查吧。1.首先新建一个数据库。 打开SQL Server2005,新建数据库TreeTest,新建表DeviceTab,表的字段设计如下: 2.新建Delphi应用程序选择File-New-Application新建应用程序,File-New-Data Module,新建一个数据库模块,添加TADOConnection和TImageList控件,设置ADOConnection的LoginPrompt为false,给ImageList控件添加7个图片,该数据模块的Create事件代码如下: procedure Tdm.DataModuleCreate(Sender: TObject); begin if not con1.Connected then begin /设置连接字符串 con1.ConnectionString:=Provider=SQLOLEDB.1;Password=123456;Persist Security Info=True;User ID=sa;Initial Catalog=TreeList;Data Source=ZHSQLEXPRESS; con1.Open; /打开数据库连接 end; end; 在窗体上放置dxTreeList控件和四个Button控件以及一个Timer控件设置Timer控件的Interval属性为100,各按钮相关事件及源码如下:unit Main;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, dxExEdtr, dxCntner, dxTL, dxTLClms,ADODB, Menus, cxLookAndFeelPainters, StdCtrls, cxButtons, ExtCtrls;type TfrmTree = class(TForm) dxTreeList1: TdxTreeList; btnAddNode: TcxButton; btnDelNode: TcxButton; btnUpdate: TcxButton; btnbl: TcxButton; tmr1: TTimer; procedure btnblClick(Sender: TObject); procedure btnAddNodeClick(Sender: TObject); procedure btnDelNodeClick(Sender: TObject); procedure btnUpdateClick(Sender: TObject); procedure tmr1Timer(Sender: TObject); procedure FormDestroy(Sender: TObject); private Private declarations public Public declarations procedure CreateColumn(tree:TdxTreeList;list:TStrings); procedure CreateImageColumn(tree:TdxTreeList;Image:TImageList); procedure FillTree(node:TdxTreeListNode;pid:Integer;con:TADOConnection); function GetMaxId(con:TADOConnection):Integer; procedure DelTree(pid:Integer;con:TADOConnection); procedure UpdateTree(newname:string;id:Integer;con:TADOConnection); function GetCount(tree:TdxTreeList):Integer; end;var frmTree: TfrmTree;implementation$R *.dfmuses unitDM;var list:TStrings;procedure TfrmTree.CreateColumn(tree:TdxTreeList;list:TStrings); /动态创建dxTreeList的列var i:Integer; col:TdxTreeListColumn;begin for i:=0 to list.Count-1 do begin col:=tree.CreateColumn(TdxTreeListMaskColumn); col.Caption:=listi; /显示标题 col.ColIndex:=i; /列索引 col.Name:=listi; /列标识 col.Width:=90+10*i; /列宽 end;end;procedure TfrmTree.CreateImageColumn(tree:TdxTreeList;Image:TImageList);/创建带图片的列var col:TdxTreeListColumn; i:Integer;begin col:=tree.CreateColumn(TdxTreeListImageColumn); col.Width:=50; col.Name:=img; TdxTreeListImageColumn(col).Images:=Image; for i:=0 to image.Count-1 do/关联图片 begin TdxTreeListImageColumn(col).ImageIndexes.Add(IntToStr(i); TdxTreeListImageColumn(col).Values.Add(IntToStr(i); end;end;procedure TfrmTree.FillTree(node: TdxTreeListNode; pid: Integer;con:TADOConnection);/构造树var tmpnode:TdxTreeListNode; ADOQuery:TADOQuery;begin ADOQuery:=TADOQuery.Create(nil); try ADOQuery.Connection:=con; ADOQuery.Close; ADOQuery.SQL.Clear; ADOQuery.SQL.Text:=select * from DeviceTab where pid=+Inttostr(pid); ADOQuery.Open; with ADOQuery do begin First; while not Eof do begin if node=nil then tmpnode:=dxTreeList1.Add /添加根节点 else tmpnode:=node.AddChild; /添加子节点 pid:=FieldByName(id).AsInteger; tmpnode.Strings0:=IntToStr(pid); tmpnode.Strings1:=FieldByName(pid).AsString; tmpnode.Strings2:=FieldByName(aName).AsString; tmpnode.Strings3:=IntToStr(tmpnode.Level); tmpnode.ImageIndex:=tmpnode.Level; tmpnode.SelectedIndex:=tmpnode.Level; FillTree(tmpnode,pid,con); /递归添加子节点 Next; end; end; finally ADOQuery.Free; end;end;procedure TfrmTree.btnblClick(Sender: TObject); /遍历子节点var node,tmpnode:TdxTreeListNode; i:Integer; str:string;begin if dxTreeList1.Count=0 then Exit; node:=dxTreeList1.FocusedNode; /获取焦点的节点 for i:=0 to dxTreeList1.ColumnCount-1 do str:=str+node.Stringsi+; ShowMessage(str); tmpnode:=node.GetFirstChild; /获取第一个子节点 while tmpnodenil do begin str:=; for i:=0 to dxTreeList1.ColumnCount-1 do str:=str+tmpnode.Stringsi+; ShowMessage(str); /if tmpnode=node.GetLastChild then break; if (tmpnode=node.GetLastChild) and (not tmpNode.HasChildren) then break; /判断是否为最后一个子节点是终止循环 tmpnode:=tmpnode.GetNext; /获取下一个节点 end;end;procedure TfrmTree.btnAddNodeClick(Sender: TObject); /添加节点var node:TdxTreeListNode; i:Integer; idindex,pidIndex,anameindex,imgIndex:Integer; id,pid:integer; aname:string; qry:TADOQuery; IsExist:Boolean;begin aname:=; pid:=0; for i:=0 to dxTreeList1.ColumnCount-1 do begin if dxTreeList1.Columnsi.Name=aName then begin anameindex:=i; end else if dxTreeList1.Columnsi.Name=id then begin idindex:=i; end else if dxTreeList1.Columnsi.Name=pid then begin pidIndex:=i; end else if dxTreeList1.Columnsi.Name=img then begin imgIndex:=i; end; end; if InputQuery(添加节点,请输入节点名称,aname) then begin if dxTreeList1.Count=0 then begin node:=dxTreeList1.Add; /添加根节点 end else begin node:=dxTreeList1.FocusedNode; if node.Level=6 then begin ShowMessage(已经添加到节点极限); exit; end; pid:=StrToIntDef(node.Stringsidindex,0); node:=node.AddChild; /添加子节点 end; id:=GetMaxId(dm.con1)+1; node.Stringsidindex:=IntToStr(id); node.StringspidIndex:=IntToStr(pid); node.Stringsanameindex:=aname; node.StringsimgIndex:=IntToStr(node.Level); node.ImageIndex:=node.Level; node.SelectedIndex:=node.Level; try qry:=TADOQuery.Create(nil); qry.Connection:=dm.con1; qry.Close; qry.SQL.Clear; qry.SQL.Text:=insert into DeviceTab values(+inttostr(id)+,+Inttostr(pid)+,+QuotedStr(aname)+); qry.ExecSQL; finally qry.Free; end; end;end;function TfrmTree.GetMaxId(con: TADOConnection): Integer; /获取最大ID值var qry:TADOQuery;begin try qry:=TADOQuery.Create(nil); qry.Connection:=con; with qry do begin close; sql.Clear; SQL.Add(select Max(id) as mid from DeviceTab); Open; First; Result:=qry.FieldByName(mid).AsInteger; end; finally qry.Free; end; end;procedure TfrmTree.btnDelNodeClick(Sender: TObject); /删除节点var node:TdxTreeListNode; i,aid:integer;begin if dxTreeList1.Count=0 then begin ShowMessage(没有要删除的节点); Exit; end else begin node:=dxTreeList1.FocusedNode; if MessageBox(Self.Handle,PChar(确定要删除该节点及其所有的子节点吗?),PChar(删除提示),MB_OKCANCEL)IdOK then Exit; if node.HasChildren then node.DeleteChildren; /删除子节点 for i:=0 to dxTreeList1.ColumnCount-1 do begin if dxTreeList1.Columnsi.Name=id then begin aid:=i; Break; end end; DelTree(StrToIntDef(node.Stringsaid,0),dm.con1); node.Free; end;end;procedure TfrmTree.DelTree(pid: Integer;con: TADOConnection); /删除数据库节点记录var tmpnode:TdxTreeListNode; ADOQuery:TADOQuery;begin ADOQuery:=TADOQuery.Create(nil); try ADOQuery.Connection:=con; with ADOQuery do begin Close; SQL.Clear; SQL.Text:=delete from DeviceTab where id=+Inttostr(pid); /删除当前节点记录 ExecSQL; end; ADOQuery.Close; ADOQuery.SQL.Clear; ADOQuery.SQL.Text:=select * from DeviceTab where pid=+Inttostr(pid); /查找子节点记录 ADOQuery.Open; with ADOQuery do begin First; while not Eof do begin DelTree(FieldByName(id).AsInteger,con); /递归删除下级记录 Next; end; end; finally ADOQuery.Free; end;end;procedure TfrmTree.btnUpdateClick(Sender: TObject); 修改var node:TdxTreeListNode; aname:string; i,j,k,id:Integer; IsExist:Boolean;begin IsExist:=False; if dxTreeList1.Count=0 then begin ShowMessage(没有要修改的节点); exit; end else begin dxTreeList1.BeginUpdate; node:=dxTreeList1.FocusedNode; for i:=0 to dxTreeList1.ColumnCount-1 do begin if dxTreeList1.Columnsi.Name=aName then begin j:=i; aname:=node.Stringsi; Break; end else if dxTreeList1.Columnsi.Name=id then begin k:=i; id:=StrToIntDef(node.Stringsi,0); end; end; if InputQuery(修改节点,请输入修改后的节点名,aname) then begin node.Stringsj:=aname; UpdateTree(aname,id,dm.con1);/更新数据库记录 end; end; dxTreeList1.EndUpdate;end;procedure TfrmTree.UpdateTree(newname: string; id: Integer; con: TADOConnection);var qry:TADOQuery;begin qry :=TADOQuery.Create(nil); try with qry do begin Connection:=con; Close; SQL.Clear; SQL.Text:=update DeviceTab set aname=+Quotedstr(newname)+ where id=+Inttostr(id); ExecSQL; end; finally qry.Fr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论