- UID
- 13801
注册时间2006-5-22
阅读权限40
最后登录1970-1-1
独步武林
该用户从未签到
|
发表于 2007-1-25 14:58:49
|
显示全部楼层
我贴一个,旨在交流,不要见笑!!!!!!:hug: :handshake :hug:
算法中主要用到了一个栈,用于记录父结点指针,整个程序一次扫描数据库,大约为O(N),数据库表查询,需以BH字段升序排列(SELECT * FROM LIST2 ORDER BY BH ASC)。
程序中只处理了LIST2表,做为演示。
另外数据库的数据格式,级与级间的的格式最好统一,要不程序不好处理。
如:01
0101
010101
每级间字符串长度差为2,即每一级项最多为01-99。目前库中有些格式不统一,比如16001, 为五位了,这可能是取值范围超出100的原因,这样如果有下级的话,会增加计算。
最好给出一个明确的级与级间区分的说明。
unit PrgTree;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, DB, ADODB, Grids, DBGrids, Contnrs, ImgList;
type
TForm1 = class(TForm)
TreeView1: TTreeView;
Button1: TButton;
ADOQuery1: TADOQuery;
ImageList1: TImageList;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
root, parenttn, lasttn: TTreeNode;
count: integer;
bhtitle: string;
tl: TStack;
len, i: integer;
tt:tdatetime;
begin
root := TreeView1.Items.AddChild(nil, 'Root');
count := 0;
tl := TStack.Create;
parenttn := nil;
lasttn := root;
TreeView1.Items.BeginUpdate;
while not ADOQuery1.Eof do
begin
bhtitle := ADOQuery1.FieldByName('bh').AsString;
len := length(bhtitle);
bhtitle := bhtitle + ADOQuery1.FieldByName('cname').AsString;
if (len > count) then
begin
tl.Push(parenttn);
parenttn := lasttn;
parenttn.ImageIndex := 2;
lasttn := TreeView1.Items.AddChild(parenttn, bhtitle);
lasttn.ImageIndex := 1;
count := len;
end
else if (len = count) then
begin
lasttn := TreeView1.Items.AddChild(parenttn, bhtitle);
lasttn.ImageIndex := 1;
end
else if (len < count) then
begin
for i := 0 to (count - len) div 2 - 1 do
parenttn := TTreeNode(tl.Pop);
parenttn.ImageIndex := 2;
lasttn := TreeView1.Items.AddChild(parenttn, bhtitle);
lasttn.ImageIndex := 1;
count := len;
end;
ADOQuery1.Next;
end;
TreeView1.Items.EndUpdate;
tl.Free;//呵呵,原来没释放TL,丢内存了,最好用TRY。。FINNALLY括起来,打包的源程序中也得改下,下载的朋友自己改下吧
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ADOQuery1.Open;
end;
end.
[ 本帖最后由 caterpilla 于 2007-1-27 00:07 编辑 ] |
|