【已结束】[悬赏:DELPHI赛事]--速度大比拼!
DELPHI玩家来玩玩~~ 关于数据库的,以读取速度快慢作为评判标准!结贴时间:2007.2.8奖励说明:
A.100点积分全部送个“最佳答案”
B.对参与者,根据实际情况奖励20、30、50积分不等~~~数据库结构大概如下:
01
0101
010101
..................
以此类推(你也可以将它看成最多4层结构),试用DELPHI编写代码使其在TreeView中按照结构显示出来(编号也要显示出来),并打包上传最优源码!
示意图: 我贴一个,旨在交流,不要见笑!!!!!!: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 编辑 ] 不懂Delphi,支持这样的活动 老大是不是把什么程序的 网络电视的数据库搞下来了?
准备自己做个啊
数据库下来看看 呵呵!~ 我比较菜,还是搞不了 原帖由 ww-jack 于 2007-1-25 18:30 发表
老大是不是把什么程序的 网络电视的数据库搞下来了?
准备自己做个啊
数据库下来看看 呵呵!~
无尽想象ing...... 没学过DELPHI只能帮顶。。支持活动。。:lol: 原帖由 飘云 于 2007-1-25 18:48 发表
无尽想象ing......
哎刚看见题目连编号也要显示 ,修改完成了
老大请收EMAIL [email protected]
[ 本帖最后由 ww-jack 于 2007-1-26 11:26 编辑 ] 问题捆饶了我
[ 本帖最后由 ww-jack 于 2007-1-26 18:08 编辑 ] 原帖由 ww-jack 于 2007-1-26 17:21 发表
其实楼上想到了 SQL 语句 想到了排序 为什么不想到SQL 模糊查询呢?在排序 那么 01 and 01xxx的都可以被找到 在排序那么效率是不是要快很多并且也不要那么多语句.
还有注意 BH 字段 他是用01 xx xx xx 作为每 ...
用模糊查询?不太理解你的意思。
程序中是一次把所有记录读进来直接处理了,因为字段BH的内容已经体现出了大体层次结构,排序后就已经接近树型了,只要按照层次加到TREEVIEW就可以了。
BH字段如果能在设计时考虑到后序的程序设计,设计出规律就更好了。在程序中采用计数是可以做到,但要增加很多判断和处理。这个小程序,以空间换时间还是合适的。