又是listview的问题,如何提高性能(30分)

  • 主题发起人 主题发起人 ie
  • 开始时间 开始时间
I

ie

Unregistered / Unconfirmed
GUEST, unregistred user!
我在listview的OnSelectItem(Sender: TObject;Item: TListItem; Selected: Boolean);事件
中写了一些简单的判断,比如 if item.caption = 'a' then, 我对listview做选择全部
的操作,如果列表中数据少,没影响,如果列表中有几百条数据,那速度就奇慢,我想是这个判断
语句的问题,如何能提高效率。
 
不会没有人遇到吧
 
你上面的写法会造成死循环,因为当选择了caption为'a'的项目时你全选,这时caption为'a'
的项目又会被选到,程序再次执行全选,这样,一直死循环,直到程序死掉
 
要写到哪里呢,如何写?
 
仅仅做了一点判断吗?判断完后做了什么?仅仅是一个判断的话,几百条绝对不会造成速度问题,除非是上十万百万条记录。
 
确实如此,不知道大家试过没有,你们都是在OnSelectItem写这些代码的吗
我也就是想实现:当移动到某一条记录时,根据这行的记录内容判断工具栏的按钮的enabled = true或false
可是现在列表中有300-500条记录,一旦选择全部items时,判断的速度很慢,
这要怎么办
 
[选择全部]之前关闭你的判断功能,
 
问题是我要用到这些判断啊,我要在哪里写关闭判断,在列表的items被全部选择时再判断呢,
这操作都是在OnSelectItem中的啊(如:我选择第一条,再按住shift键,选最后一条)!?
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
ListView1: TListView;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure ListView1SelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
Var StringList:TStringList;
i:Integer;
begin
StringList:=TStringList.Create;
try
StringList.LoadFromFile('C:/WINNT/UEDIT32.INI');
ListView1.Items.BeginUpdate;
For i:=0 to StringList.Count-1 do//475行.
begin
ListView1.AddItem(StringList,nil);
with ListView1.Items do
begin
SubItems.LoadFromFile('C:/WINNT/system.ini'); //这个文件14行.
end;
end;
ListView1.Items.EndUpdate;
finally
StringList.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ListView1.SelectAll;//完成后基本不花时间.
end;

procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
var i:Integer;
begin
with Item do
begin
For i:=0 to SubItems.Count-1 do //14列.
if SubItems='[mci]' then
Button1.Enabled:=False;
end;
end;

end.



我相信是你的程序的问题,我不明白你在OnSelectItem事件中怎么会用到Item.Caption这样的用法,
难道你在OnSelectItem事件中又去遍历每个Item?当你SelectAll的时候,
每选中一个Item都会触发一次OnSelectItem事件,如果你此时再去循环每个Item,假如你有500个Item,
那么会判断250000次,速度当然会受到影响,但想不能有什么理由需要在这个事件中循环.

在我的程序中OnSelectItem事件中只是循环这个Item的SubItem.
 
呵呵,ListView不适合大数据量,如果你的数据量大,可使用VirtualTree
下载地址:http://www.lischke-online.de/
这个控件非常不错
 
to: aizb
多谢,是我对这个事件理解错了,现在ok了

VirtualTree好象不错
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
851
DelphiTeacher的专栏
D
后退
顶部