資料庫 樹型結構 TTreeView篇

2021-08-24 21:02:57 字數 2951 閱讀 4587

1.首先看一下我的資料庫結構:

id                      :    int

group_name     :    int

parent_id          :    int

不用解釋,相信大家一看就明白。

2.delphi中新建乙個datemodel,命名為dm,和乙個窗體frmmain

在dm中放入tadoconnection,和乙個tadodataset,並連線上資料庫。

在frmmain上放入乙個ttreeview.

3.我的建立樹結構的單元檔案**:

unit buildtreeunit;

inte***ce

uses

db, adodb, comctrls,dialogs;

// 定義樹結點對資料庫表記錄對應的結構體

type

pnode = ^tnode;

tnode = record

fid:integer; // 記錄的id號

fbm:tbookmark; // 定位記錄的指標(書籤)

end;

function buildtree(dataset: tadodataset; tv: ttreeview; selffield,selfname,parentfield:string):boolean;

implementation

function buildtree(dataset: tadodataset; tv: ttreeview; selffield,selfname,parentfield:string):boolean;

function findkey(aindex: integer; ffirst:boolean): boolean;

begin

result:=dataset.locate(parentfield,aindex,[locaseinsensitive]);

end;

function findnext(aindex: integer): boolean;

begin

dataset.next;

if dataset.eof then

result:=false

else

result:=dataset.fieldvalues[parentfield]=aindex;

if not result then dataset.prior;

end;

function getchildnode(index: integer; anode: ttreenode):integer;

varmynode:pnode;

node:ttreenode;

begin

if findkey(index,true) then

begin

new(mynode);

with dataset do

begin

mynode^.fid :=fieldvalues[selffield];

mynode^.fbm :=getbookmark;

end;

node:=tv.items.addchild(anode,dataset.fieldvalues[selfname]);

node.data:=mynode;

result:=1;

while findnext(index) do

begin

new(mynode);

with dataset do

begin

mynode^.fid :=fieldvalues[selffield];

mynode^.fbm :=getbookmark;

end;

node:=tv.items.addchild(anode,dataset.fieldvalues[selfname]);

node.data:=mynode;

result:=result+1;

end;

endelse

result:=0;

end;

procedure buildme(aindex: integer; anode: ttreenode);

varnodenum:integer;

node:ttreenode;

i:integer;

begin

nodenum:=getchildnode(aindex,anode);

if nodenum>0 then

begin

if anode=nil then node:=tv.items.getfirstnode

else

node:=anode.getfirstchild;

for i:=1 to nodenum do

begin

buildme(pnode(node.data)^.fid,node);

node:=anode.getnextchild(node);

end;

end;

end;

// 組合部份

begin

showmessage('here');

if (dataset=nil) or (dataset.active =false) then

result:=false

else if (tv=nil) then

result:=false

else begin

tv.items.clear;

buildme(0,nil);

result:=true;

end;

end;

end.

4.呼叫: 

buildtree(dm.dsgroup_,tv,'id','group_name','parent_id');

用資料庫實現樹型結構

做 的時候有時需要實現乙個樹形列表,類似目錄那樣的。最好的建立方法就是採用指向父節點的指標的結構建立表。表的結構如下 表名為xx 字段 型別 null 預設 注釋 cidint 11 否 主鍵 pid int 11 否 0 父類別的cid,0表示該項為頂層類別。name varchar 64 否 類...

組織機構樹型資料庫結構

之前做的乙個系統,裡面涉及乙個組織機構,之前也做過,之前做得非常簡單普遍 資料庫表結構主要是乙個主鍵id,名稱name,乙個父級外來鍵parent id 比如id name parent id 1 汕頭公司 null 2 計算機中心 1 3 人事部 1 類似這樣,相信大家都能想到,新增,修改都很方便...

關係型資料庫 非關係型資料庫

關係型資料庫,是指採用了關係模型來組織資料的資料庫。關係模型是在1970年由ibm的研究員e.f.codd博士首先提出的,在之後的幾十年中,關係模型的概念得到了充分的發展並逐漸成為主流資料庫結構的主流模型。簡單來說,關係模型指的就是二維 模型,而乙個關係型資料庫就是由二維表及其之間的聯絡所組成的乙個...