Delphi实现树型结构具体实例
<P><div class="codetitle"><span><U>复制代码</U></span> 代码如下:</div><div class="codebody" id="code39713"><BR>unit Unit1;<BR>interface<BR>uses<BR> Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<BR> Dialogs, StdCtrls, ComCtrls, DB, ADODB;<BR>type<BR> PNodeInfoEx = ^TNodeInfoEx;<BR> TNodeInfoEx = Packed Record<BR> NodeID : Integer;<BR> ParentID : Integer;<BR> NodeType : Integer;<BR> ChnNodeTitle : String;<BR> ImageIndex: SmallInt;<BR> SelectedIndex: SmallInt;<BR> end;<BR> TForm1 = class(TForm)<BR> tv1: TTreeView;<BR> btn1: TButton;<BR> qry1: TADOQuery;<BR> procedure btn1Click(Sender: TObject);<BR> procedure FormDestroy(Sender: TObject);<BR> private<BR> { Private declarations }<BR> function StaticBuildTree(TreeView:TTreeView ):Boolean;<BR> function AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;<BR> function FindTreeItem(TreeView:TTreeView; CurNodeID:integer): TTreeNode;<BR> public<BR> { Public declarations }<BR> end;<BR>var<BR> Form1: TForm1;<BR>implementation<BR>{$R *.dfm}<br><br>function TForm1.StaticBuildTree(TreeView:TTreeView ):Boolean;<BR>var<BR> AddNodeInfo : PNodeInfoEx;<BR>begin<BR> Result := False;<BR> qry1.LoadFromFile('c:/AdminixTree.xml');//这里以XML文件做为数据源<BR> Treeview.Items.BeginUpdate;//记住:在进行批量添加数据时要使用BeginUpdate,来暂时关闭由于添加数据而触发的某些事件(如OnChange事件等)<BR> Treeview.Items.Clear;//清空Treeview<BR> try<BR> try<BR> if qry1.RecordCount >0 then<BR> begin<BR> qry1.First;<BR> while Not qry1.Eof do<BR> begin<BR> New(AddNodeInfo) ;//生成结构体<BR> AddNodeInfo^.NodeID := qry1.FieldByName('NODE_ID').AsInteger;<BR> AddNodeInfo^.ParentID := qry1.FieldByName('PARENT_ID').AsInteger;<BR> AddNodeInfo^.NodeType := qry1.FieldByName('NodeType').AsInteger;<BR> AddNodeInfo^.ChnNodeTitle := qry1.FieldByName('ChnNodeTitle').AsString;<BR> AddNodeInfo^.ImageIndex := qry1.FieldByName('ImageIndex').AsInteger;<BR> AddNodeInfo^.SelectedIndex := qry1.FieldByName('SelectedIndex').AsInteger;<BR> AddTreeItem(Treeview,AddNodeInfo);//把结构体的指针存到Treeview中<BR> qry1.Next;<BR> end;<BR> end;<BR> except<BR> Application.MessageBox('生成树结点失败',MB_ICONSTOP+MB_OK);<BR> raise;//向上级抛异常<BR> end;<BR> qry1.Close;<BR> Result := True;<BR> finally<BR> Treeview.Items.EndUpdate;<BR> end;<BR>end;<BR>//在加入结点时,应先判断加入的是父结点还是子结点,判断的依据是在已存在的树结点中是否存在该结点的ParentID<BR>function TForm1.AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;<BR>var<BR> ParentNode: TTreeNode;<BR>begin<BR> ParentNode := FindTreeItem(Treeview,AddNodeInfo^.ParentID);<BR> If ParentNode <> nil then<BR> Result := Treeview.Items.AddChildObject(ParentNode, Trim(AddNodeInfo.ChnNodeTitle), Pointer(AddNodeInfo))<BR> else<BR> Result := Treeview.Items.AddObject(ParentNode, Trim(AddNodeInfo.ChnNodeTitle), Pointer(AddNodeInfo));<BR> if Result<>nil then<BR> begin<BR> Result.ImageIndex := AddNodeInfo.ImageIndex;<BR> Result.SelectedIndex := AddNodeInfo.SelectedIndex;<BR> end;<BR>end;<BR>//这里是判断是否存在其父结点<BR>function TForm1.FindTreeItem(TreeView:TTreeView; CurNodeID:integer): TTreeNode;<BR>var<BR> i : Integer;<BR>begin<BR> Result := nil;<BR> for i := 0 to Treeview.Items.Count-1 do<BR> begin<BR> if CurNodeID=PNodeInfoEx(Treeview.Items.Data)^.NodeID then<BR> begin<BR> Result := Treeview.Items;<BR> Exit;<BR> end;<BR> end;<BR>end;<BR>//生成树结构<BR>procedure TForm1.btn1Click(Sender: TObject);<BR>begin<BR> StaticBuildTree (tv1)<BR>end;<BR>//在窗体释放时一定要把树结点中的结构体指针给释放掉,对于在Dispose时为什么要进行强制转型后释放,以前有专门的讲解,在此不在累述<BR>procedure TForm1.FormDestroy(Sender: TObject);<BR>var<BR> i : Integer;<BR>begin<BR> for i := 0 to tv1.Items.Count-1 do<BR> begin<BR> Dispose( PNodeInfoEx(tv1.Items.Data) )<BR> end;<BR>end;<BR>end.<BR></div></P><P><div class="codetitle"><span><U>复制代码</U></span> 代码如下:</div><div class="codebody" id="code31427"><BR>//如何访问树结点?<BR>procedure TForm1.tv1MouseDown(Sender: TObject; Button: TMouseButton;<BR> Shift: TShiftState; X, Y: Integer);<BR>var<BR> pNode:TTreeNode;<BR>begin<BR> pNode:=tv1.GetNodeAt(x,y);<BR> if (pNode<>nil) and (Button=mbleft) then<BR> ShowMessage(PNodeInfoEx(pNode.Data)^.ChnNodeTitle);<BR>end;<BR></div></P>
<div class="art_xg">
<b>您可能感兴趣的文章:</b><ul><li>delphi7连接mysql5的实现方法</li><li>Delphi下OpenGL2d绘图之画四边形的方法</li><li>Delphi下OpenGL2d绘图之画线的方法</li><li>Delphi下OpenGL2d绘图之画点的方法</li><li>Delphi下OpenGL2d绘图之初始化流程详解</li><li>Delphi使用OpenGL2d绘图之画图片Bmp的方法</li><li>C# 调用Delphi dll 实例代码</li><li>Delphi 生成excel中饼图的实例代码</li><li>Delphi7中Listview的常用功能汇总</li></ul>
</div>
</div>
<!--endmain-->
頁:
[1]