飘云 发表于 2007-1-25 14:58:48

【已结束】[悬赏:DELPHI赛事]--速度大比拼!

DELPHI玩家来玩玩~~ 关于数据库的,以读取速度快慢作为评判标准!结贴时间:2007.2.8
奖励说明:
A.100点积分全部送个“最佳答案”
B.对参与者,根据实际情况奖励20、30、50积分不等~~~数据库结构大概如下:
01
0101
   010101
..................

以此类推(你也可以将它看成最多4层结构),试用DELPHI编写代码使其在TreeView中按照结构显示出来(编号也要显示出来),并打包上传最优源码!

示意图:

caterpilla 发表于 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 编辑 ]

wan 发表于 2007-1-25 17:26:13

不懂Delphi,支持这样的活动

ww-jack 发表于 2007-1-25 18:30:38

老大是不是把什么程序的 网络电视的数据库搞下来了?
准备自己做个啊
数据库下来看看 呵呵!~

情天下雪 发表于 2007-1-25 18:35:54

我比较菜,还是搞不了

飘云 发表于 2007-1-25 18:48:15

原帖由 ww-jack 于 2007-1-25 18:30 发表
老大是不是把什么程序的 网络电视的数据库搞下来了?
准备自己做个啊
数据库下来看看 呵呵!~


无尽想象ing......

coolpeople 发表于 2007-1-25 21:58:12

没学过DELPHI只能帮顶。。支持活动。。:lol:

ww-jack 发表于 2007-1-26 11:07:16

原帖由 飘云 于 2007-1-25 18:48 发表



无尽想象ing......

哎刚看见题目连编号也要显示 ,修改完成了
老大请收EMAIL [email protected]

[ 本帖最后由 ww-jack 于 2007-1-26 11:26 编辑 ]

ww-jack 发表于 2007-1-26 17:21:08

问题捆饶了我

[ 本帖最后由 ww-jack 于 2007-1-26 18:08 编辑 ]

caterpilla 发表于 2007-1-26 18:08:58

原帖由 ww-jack 于 2007-1-26 17:21 发表

其实楼上想到了 SQL 语句 想到了排序 为什么不想到SQL 模糊查询呢?在排序 那么 01 and 01xxx的都可以被找到 在排序那么效率是不是要快很多并且也不要那么多语句.
还有注意 BH 字段 他是用01 xx xx xx 作为每 ...

用模糊查询?不太理解你的意思。
程序中是一次把所有记录读进来直接处理了,因为字段BH的内容已经体现出了大体层次结构,排序后就已经接近树型了,只要按照层次加到TREEVIEW就可以了。

BH字段如果能在设计时考虑到后序的程序设计,设计出规律就更好了。在程序中采用计数是可以做到,但要增加很多判断和处理。这个小程序,以空间换时间还是合适的。
页: [1] 2 3
查看完整版本: 【已结束】[悬赏:DELPHI赛事]--速度大比拼!