捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  粤ICP备10103342号 DELPHI盒子 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 盒子检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
盒子资源分类
全部展开 - 全部合拢
使用 Virtual List 技术快速列出大批量数据
关键字:VirtualList ListView Item 快速 数据
来 自:原创
平 台:Win9x,Win2k/XP/NT,Win2003 下载所需:0 火柴
深浅度:初级 完成时间:2006/8/22
发布者:yqqjerk 发布时间:2006/8/22
编辑器:BDS2006 语  种:简体中文
分 类:组件 下载浏览:4465/18973
加入到我的收藏
下载错误报错
登陆以后才能下载
 用户名:
 密 码:
自动登陆(30天有效)
图片如果打不开,说明流量不够了,请稍候下载……
当我在盒子上发布了采用VirtualList列出数据的电脑销售信息系统后(http://www.delphibox.com/article.asp?articleid=3551),很多网友向我打听关于Virtual List的细节。在这里我做了一个演示程序给大家,附上以下的讲解,希望能给大家带来帮助。

ListView拥有灵活易用的特点,它是Windows的标准控件。做过数据库的朋友都知道,ListView在插入大量的数据时会很慢很慢(如果你是用*DBGrid,那就算了:)。通过测试,即使是使用oracle10g,列出10w条数据也要几十秒(也可能是我机子太慢了),而且还占用很大的内存。参照msdn里面的内容,说简单点是这样的:因为ListView插入一条Item时,它会同时插入Item所对应的数据,也就是说ListView中的Item拥有一块数据区,这数据区用来保存Item的信息(标题、字体等等)。所以Item一多,初始化这些数据区就很慢了。

而Virtual List不一样,ListView中每一条Item不会拥有自己的数据,当要显示数据时,它会发送消息问父窗体索要显示的内容。所以在父窗体接受相应的消息,再配合数据库记录的移动,就可以实现数据库结合Virtual List的功能了。

具体实现方法如下(Delphi7和Delphi2006都封装了Virtual List,老Delphi没试过):

首先,在窗体上添加一个控件:TListview(Win32页)、不用改名。

添加如下代码:

procedure TForm1.FormCreate( Sender: TObject );
begin
  with ListView1 do
  begin
    ViewStyle := vsReport;
    OwnerData := True;
    Items.Count := 10000; // 注意:在此处必须主动的设置Virtual List的行数

    with Columns.Add do
      Caption := '行号';
  end;
end;

// ListView的OnData事件
procedure TForm1.ListView1Data( Sender: TObject; Item: TListItem );
begin
  Item.Caption := IntToStr( Item.Index );
end;

大家可以看到,OnData事件用来接收Virtual List传过来的需要显示的Item,大家可以在这个事件里对Item的相关信息进行显示。
注意:由于Virtual List的Item不保存任何数据,所以在OnData事件中经过显示后的Item仍然不具有任何数据。因此,即使遍历完所有Item的显示,还会不停的激发OnData事件,Virtual List的Item需要你给它数据进行显示,而不是给它数据进行保存。

正因为Virtual List有这个特性,所以我们可以很好的利用这个特性和数据库结合。因为我们用数据库保存数据,而用Virtual List把它显示出来。我们可以通过OnData事件中Item的索引值(Item.Index)来移动ado记录集指针(Recordset.Move)到这个指针,然后获取当前记录集上的数据显示出来就可以了。

只要改上面的两个地方:

Items.Count := Recordset.RecordCount; // 获取记录集的行数

在OnData里面:

Items.Caption := Recordset.Fields[ Item.Index ].Value;

……

相信大家都知道原理了,那么动手做吧:)

在压缩包里带了两个代码,一个是简单的Virtual List演示,另外一个是Virtual List结合ado列出数据的演示。gl!

我希望和大家一起探讨:
QQ:77993092
我的主页:http://www.jerkflash.com
里面有我很多的作品,部分开源-,-  希望大家能来捧捧场。

大家可以在msdn上通过索引“VListVw: Virtual ListView Control Sample”,可以了解一下VirtualList的sdk例子。
Google
 
本站原创作品,未经作者许可,严禁任何方式转载;转载作品,如果侵犯了您的权益,请联系我们
龙脉加密锁 15元起 Grid++Report 报表 申请支付@网
 相关文章
使用 Virtual List 技术快速列出大批量数据
yqqjerk 2006/8/22 下+4465/浏+18974 评+13
电脑销售信息系统 (使用原生ADO)
yqqjerk 2006/8/11 下+13705/浏+22428 评+39
相关评论
共有评论13条 当前显示最后6条评论
yqqjerk 2006/8/24 8:57:46
to yeschoto:

看了你的留言后,我专门拿Virtual List和DBGrid进行了速度测试比较,30w条记录,结果是速度几乎一样快。

我还看了TDBGrid的vcl代码,我的Data Virtual list代码原理和DBGrid的原理基本是一样的,都是用Move语句移动记录集指针。

另外,在压缩包内附带的Data Virtual List的Demo列出的数据量是1w条(Access数据库),如果这样的记录集还不大,兄弟可以自己将Access数据库里的数据量加到到你满意的条数后再测试,看看速度有没有慢过DBGrid。
yqqjerk 2006/8/24 8:58:44
to factsoft:

对,demo里有关于外壳使用的例子:)
flfq 2006/9/15 0:03:47
解决了我的一个问题
flfq 2006/9/15 0:33:50
超快呀,以前一个读数据的过程要 30秒多左右,现在 153 ms ,太感谢了
cat_999 2008/3/28 15:23:39
很好!!!
能实现在首列加一个check吗,实现对每行的select那就更好了!!!
419546021 2017/10/4 14:58:32
不错啊
我要发表评论 查看全部评论
 
  DELPHI盒子版权所有 技术支持:深圳市麟瑞科技有限公司 1999-2024 V4.01 粤ICP备10103342号 更新RSS列表