ListBox控件有无条数限制?(40分)

  • 主题发起人 主题发起人 动力汽车
  • 开始时间 开始时间

动力汽车

Unregistered / Unconfirmed
GUEST, unregistred user!
ListBox控件有无条数限制?写了个程序,每当ListBox里插入数据的条数为6万条的话就会死掉,等好长时间都没有反应,但是如果5万条的话就没问题,不知道ListBox是不是限制显示条数的?我用的Delphi5,WindowsXP系统
 
Integer最大数的限制.估计你用不完.
每查一条数据就重画一次,你的时间主要花在重画上面了.
用下面的方式就快多了.
var
I : Integer;
begin
ListBox1.Items.begin
Update;
try
for I := 0 to 60000do
ListBox1.Items.Add(IntToStr(I));
finally
ListBox1.Items.EndUpdate;
end;

end;
 
integer占4个字节 表示范围:-2147483648~ 2147483648
你用的完吗
同意楼上的说法
 
ListBox1.Items.begin
Update;
.................
ListBox1.Items.EndUpdate;
 
MaxListSize = Maxint div 16
 
TStringItemList = array[0..MaxListSize] of TStringItem;
 
To 楼主:
1、首先,程序死掉跟 ListBox 的什么“条数限制”没有任何狗屁关系(我的机器上测试就没问题,再说如果有条数限制 Delphi 会作出提示),因为你没有对 ListBox 做任何优化,重画操作花去了大部分时间。
2、我很惊讶到现在还有不知道 ListBox 虚拟显示的!begin
Update 和 EndUpdate 虽然可以在一定程度上提高响应速度(由 5000ms 提高到 500ms),但是还是很有限,虚拟显示可以更快。
首先把 ListBox1 的 Style 设置为 lbVirtual,然后:
type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ListBox1Data(Control: TWinControl;
Index: Integer;
var Data: String);
procedure Button1Click(Sender: TObject);
private
FMemSL: TStringList;
procedure FillMemSL;
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FillMemSL;
var
i: Integer;
begin
FMemSL.Clear;
for i := 0 to 59999do
FMemSL.Add(IntToStr(i));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FMemSL := TStringList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FMemSL.Free;
end;

procedure TForm1.ListBox1Data(Control: TWinControl;
Index: Integer;
var Data: String);
begin
Data := FMemSL.Strings[Index];
end;

procedure TForm1.Button1Click(Sender: TObject);
var
dw: DWORD;
begin
dw := GetTickCount;
FillMemSL;
ListBox1.Count := FMemSL.Count;
dw := GetTickCount - dw;
ShowMessage(IntToStr(dw) + ' ms');
end;

一般 60 万条的记录单核 CPU 耗时 300 多毫秒,双核的还要快一些;至于 6 万条的记录,更是小 Case,只需要 70 多毫秒。以上是在循环中代码相同的条件下测试的。
 
上面的方法确实很快。
 
Delphi5不行。Delphi7中试了,果然超快。600万条数据只要2.8秒。
 
接受答案了.
 
后退
顶部