Delphi中根據分類資料生成樹形結構的最優方法

2021-08-22 16:52:08 字數 1549 閱讀 7407

很多系統都有類似於如下的表結構(table1):

id                 name                         parentid

001              電子類                              0

002              金屬類                              0

003              電容電子                         001

004              電阻電子                         001

005              有色金屬                         002

而且大家都習慣於用樹(treeview)來顯示,這樣就可以很好的顯示整個表的分類情況。但如果資料量多時會造成樹的生成比較慢,特別是用遞迴來實現時要訪問資料庫的次數很多(根據層數),用在三層中效果更加顯。在此提供乙個好的方法來生成樹形結構。

這個演算法只訪問一次資料庫,具體的實現如下:

1、一次性從資料庫中取出所有的資料,並按照parentid欄位進行排序,這樣就保證每一條資料的父節點都在它的前面。

2、取出第一條資料畫到樹中,在新增到樹中時先找到這條資料的父節點,如果沒有 則將此記錄直接作為樹的第一級節點

3、如果還有資料,則取出來執行第2步,直到沒有資料為止。

程式實現:

本程式將用乙個stlid的tstringlist變數來存放對應樹中每乙個節點的id值,用findparent函式來父節點。

function findparent(id:string):ttreenode;

vari:integer;

begin

result:=nil;

for i:=treeview1.items.count-1 downto 0 do

if stlid.strings[i]=id then

begin

result:=treeview1.items[i];

break;

end;

end;

//生成樹

procedure createtree;

vartmpnode:ttreenode;

begin

query1.close;

query1.sql.text:='select * from table1 order by parentid';

query1.open;

query1.first;

while not query1.eof do

begin

tmpnode:=treeview1.items.addchild(findparent(query1.fieldbyname('parentid').asstring),query1.fieldbyname('name').asstring);

stlid.add(query1.fieldbyname('id').asstring);//記錄id

query1.next;

end;

end;

Delphi中根據分類資料生成樹形結構的方法

很多系統都有類似於如下的表結構 表名 placename 該方法在層數多資料量大時,效率將會比較低。二 用資料記錄集的方法定位記錄,再迴圈結果集生成樹,具體方法如下 該方法只訪問一次資料庫,但是需要迴圈往復多次操作結果集。1 一次性從資料庫中取出所有的資料,並按照pid欄位進行排序,這樣就保證每一條...

Delphi中根據分類資料生成樹形結構的最優方法

很多系統都有類似於如下的表結構 table1 id name parentid 001 電子類 0 002 金屬類 0 003 電容電子 001 004 電阻電子 001 005 有色金屬 002 而且大家都習慣於用樹 treeview 來顯示,這樣就可以很好的顯示整個表的分類情況。但如果資料量多時...

根據資料表中資料,生成Powerpoint幻燈片

曾經有乙個問題,一直困擾我很久。由於工作的需要,經常需要把access資料表的內容,製作成powerpoint幻燈片,常常在做大量的單調的重複的簡單勞動。作為乙個程式設計的愛好者,最不願意做的就是這種簡單機械的事情。那麼,如何根據資料表中資料,生成powerpoint幻燈片呢?我的具體要求是這樣的 ...