Delphi實(shí)現(xiàn)樹型結(jié)構(gòu)具體實(shí)例
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, DB, ADODB;
type
PNodeInfoEx = ^TNodeInfoEx;
TNodeInfoEx = Packed Record
NodeID : Integer;
ParentID : Integer;
NodeType : Integer;
ChnNodeTitle : String;
ImageIndex: SmallInt;
SelectedIndex: SmallInt;
end;
TForm1 = class(TForm)
tv1: TTreeView;
btn1: TButton;
qry1: TADOQuery;
procedure btn1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
function StaticBuildTree(TreeView:TTreeView ):Boolean;
function AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;
function FindTreeItem(TreeView:TTreeView; CurNodeID:integer): TTreeNode;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.StaticBuildTree(TreeView:TTreeView ):Boolean;
var
AddNodeInfo : PNodeInfoEx;
begin
Result := False;
qry1.LoadFromFile('c:/AdminixTree.xml');//這里以XML文件做為數(shù)據(jù)源
Treeview.Items.BeginUpdate;//記住:在進(jìn)行批量添加數(shù)據(jù)時(shí)要使用BeginUpdate,來(lái)暫時(shí)關(guān)閉由于添加數(shù)據(jù)而觸發(fā)的某些事件(如OnChange事件等)
Treeview.Items.Clear;//清空Treeview
try
try
if qry1.RecordCount >0 then
begin
qry1.First;
while Not qry1.Eof do
begin
New(AddNodeInfo) ;//生成結(jié)構(gòu)體
AddNodeInfo^.NodeID := qry1.FieldByName('NODE_ID').AsInteger;
AddNodeInfo^.ParentID := qry1.FieldByName('PARENT_ID').AsInteger;
AddNodeInfo^.NodeType := qry1.FieldByName('NodeType').AsInteger;
AddNodeInfo^.ChnNodeTitle := qry1.FieldByName('ChnNodeTitle').AsString;
AddNodeInfo^.ImageIndex := qry1.FieldByName('ImageIndex').AsInteger;
AddNodeInfo^.SelectedIndex := qry1.FieldByName('SelectedIndex').AsInteger;
AddTreeItem(Treeview,AddNodeInfo);//把結(jié)構(gòu)體的指針存到Treeview中
qry1.Next;
end;
end;
except
Application.MessageBox('生成樹結(jié)點(diǎn)失敗',MB_ICONSTOP+MB_OK);
raise;//向上級(jí)拋異常
end;
qry1.Close;
Result := True;
finally
Treeview.Items.EndUpdate;
end;
end;
//在加入結(jié)點(diǎn)時(shí),應(yīng)先判斷加入的是父結(jié)點(diǎn)還是子結(jié)點(diǎn),判斷的依據(jù)是在已存在的樹結(jié)點(diǎn)中是否存在該結(jié)點(diǎn)的ParentID
function TForm1.AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;
var
ParentNode: TTreeNode;
begin
ParentNode := FindTreeItem(Treeview,AddNodeInfo^.ParentID);
If ParentNode <> nil then
Result := Treeview.Items.AddChildObject(ParentNode, Trim(AddNodeInfo.ChnNodeTitle), Pointer(AddNodeInfo))
else
Result := Treeview.Items.AddObject(ParentNode, Trim(AddNodeInfo.ChnNodeTitle), Pointer(AddNodeInfo));
if Result<>nil then
begin
Result.ImageIndex := AddNodeInfo.ImageIndex;
Result.SelectedIndex := AddNodeInfo.SelectedIndex;
end;
end;
//這里是判斷是否存在其父結(jié)點(diǎn)
function TForm1.FindTreeItem(TreeView:TTreeView; CurNodeID:integer): TTreeNode;
var
i : Integer;
begin
Result := nil;
for i := 0 to Treeview.Items.Count-1 do
begin
if CurNodeID=PNodeInfoEx(Treeview.Items[i].Data)^.NodeID then
begin
Result := Treeview.Items[i];
Exit;
end;
end;
end;
//生成樹結(jié)構(gòu)
procedure TForm1.btn1Click(Sender: TObject);
begin
StaticBuildTree (tv1)
end;
//在窗體釋放時(shí)一定要把樹結(jié)點(diǎn)中的結(jié)構(gòu)體指針給釋放掉,對(duì)于在Dispose時(shí)為什么要進(jìn)行強(qiáng)制轉(zhuǎn)型后釋放,以前有專門的講解,在此不在累述
procedure TForm1.FormDestroy(Sender: TObject);
var
i : Integer;
begin
for i := 0 to tv1.Items.Count-1 do
begin
Dispose( PNodeInfoEx(tv1.Items[i].Data) )
end;
end;
end.
//如何訪問(wèn)樹結(jié)點(diǎn)?
procedure TForm1.tv1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
pNode:TTreeNode;
begin
pNode:=tv1.GetNodeAt(x,y);
if (pNode<>nil) and (Button=mbleft) then
ShowMessage(PNodeInfoEx(pNode.Data)^.ChnNodeTitle);
end;
上一篇:wordpress主題支持自定義菜單及修改css樣式實(shí)現(xiàn)方法
欄 目:Delphi
本文標(biāo)題:Delphi實(shí)現(xiàn)樹型結(jié)構(gòu)具體實(shí)例
本文地址:http://mengdiqiu.com.cn/a1/Delphi/8653.html
您可能感興趣的文章
- 01-10在Delphi實(shí)現(xiàn)在數(shù)據(jù)庫(kù)中存取圖像的圖文演示無(wú)錯(cuò)
- 01-10delphi建立、讀取、存貯INI文件的方法《三》
- 01-10Delphi Command模式
- 01-10delphi 正弦曲線圖
- 01-10delphi建立、讀取、存貯INI文件的方法《二》
- 01-10插件管理框架 for Delphi(二)
- 01-10插件管理框架 for Delphi(一)
- 01-10Delphi中判斷文件是否為文本文件的函數(shù)
- 01-10delphi中一個(gè)值得大家來(lái)考慮的DLL問(wèn)題
- 01-10初探Delphi中的插件編程


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10在Delphi實(shí)現(xiàn)在數(shù)據(jù)庫(kù)中存取圖像的圖
- 01-10delphi建立、讀取、存貯INI文件的方法
- 01-10delphi 正弦曲線圖
- 01-10Delphi Command模式
- 01-10delphi建立、讀取、存貯INI文件的方法
- 01-10插件管理框架 for Delphi(二)
- 01-10插件管理框架 for Delphi(一)
- 01-10Delphi中判斷文件是否為文本文件的函
- 01-10delphi中一個(gè)值得大家來(lái)考慮的DLL問(wèn)題
- 01-10初探Delphi中的插件編程
隨機(jī)閱讀
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什