想了很多种解决办法但都没有解决,不知那位大侠有解决过此问题的,此闪定要解决,因为对方不接受添加数据时闪,用过的办法有
1、窗体更新锁定,也不行,代码如下
begin
listview1.Clear;
LockWindowUpdate(listview1.Handle);//这里锁定刷新窗体
for i:=0 to 2000 do
begin
//添加item项
end;
LockWindowUpdate(0);//解除锁定
end;2、通过Panel上放一个listview然后设置panel1.DoubleBuffered:=false;也不行
begin
listview1.Clear;
panel1.DoubleBuffered:=false;
begin
//添加item项
end;
panel1.DoubleBuffered:=true;
end;3、采用BeginUpdate和EndUpdate方法也不行
begin
listview1.Clear;
begin
listview1.Items.BeginUpdate ;
//添加item项
listview1.Items.EndUpdate;
end;
end;4、采用修改的方法好点,标题不会闪(不过闪的问题用一个wait等待几毫的方法可以解决,只是这里不用这个等待就解决了 标题不闪的问题了),但第二行还是会闪,先把数据放一个数组中
begin
for i:=0 to 200 do
begin
if i=0 then
begin
liststr[0].ItemNumber:=edit1.Text;
liststr[0].ItemMessage:=edit2.Text;
end else
begin
liststr[i].ItemNumber:=listview1.Items.Item[i-1].Caption;
liststr[i].ItemMessage:=listview1.Items.Item[i-1].SubItems.Strings[0];
end;
end; For m:=0 to listview1.Items.Count-1 do
begin
listview1.Items.Item[m].Caption:= liststr[m].ItemNumber;
listview1.Items.Item[m].SubItems.Strings[0]:= liststr[m].ItemMessage;
end;
end;
1、窗体更新锁定,也不行,代码如下
begin
listview1.Clear;
LockWindowUpdate(listview1.Handle);//这里锁定刷新窗体
for i:=0 to 2000 do
begin
//添加item项
end;
LockWindowUpdate(0);//解除锁定
end;2、通过Panel上放一个listview然后设置panel1.DoubleBuffered:=false;也不行
begin
listview1.Clear;
panel1.DoubleBuffered:=false;
begin
//添加item项
end;
panel1.DoubleBuffered:=true;
end;3、采用BeginUpdate和EndUpdate方法也不行
begin
listview1.Clear;
begin
listview1.Items.BeginUpdate ;
//添加item项
listview1.Items.EndUpdate;
end;
end;4、采用修改的方法好点,标题不会闪(不过闪的问题用一个wait等待几毫的方法可以解决,只是这里不用这个等待就解决了 标题不闪的问题了),但第二行还是会闪,先把数据放一个数组中
begin
for i:=0 to 200 do
begin
if i=0 then
begin
liststr[0].ItemNumber:=edit1.Text;
liststr[0].ItemMessage:=edit2.Text;
end else
begin
liststr[i].ItemNumber:=listview1.Items.Item[i-1].Caption;
liststr[i].ItemMessage:=listview1.Items.Item[i-1].SubItems.Strings[0];
end;
end; For m:=0 to listview1.Items.Count-1 do
begin
listview1.Items.Item[m].Caption:= liststr[m].ItemNumber;
listview1.Items.Item[m].SubItems.Strings[0]:= liststr[m].ItemMessage;
end;
end;
你是不是把数据库里目录的所有数据都添加了?
建议在运行开始时只添加第0层和第一层的。然后在onexpanding中再添加数据,可解决
demo里有例子。
另一个方法就是将listview的ownerData设置为true,然后在onData中填入数据,也就是VirutalListView方式。
begin
listview1.Clear;
begin
listview1.Items.BeginUpdate ;
//添加item项
listview1.Items.EndUpdate;
end;
end; //添加item项 不知道楼主的项是指全部的Item项还是部分项,如果是部分的话是不行的。
2.不直接添加数据,只在显示的时候显示,即在ListView的OnData事件中进行控制
比如我的ListView有三列:一为编号、二为名称、三为数据值,分别对应数据库ADOQuery1
中的三列ID、Name、Val。
procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
begin
ADOQuery1.RecNo:=Item.Index+1;//根据待显示的行的Index值设置数据库的当前记录
Item.Caption:=ADOQuery1.FieldByName('ID').AsString;//编号列,注意此死是用Caption赋值
//因为其是第一列
Item.SubItems.Add(ADOQuery1.FieldByName('Name').AsString );
//名称列
Item.SubItems.Add(ADOQuery1.FieldByName('Val').AsString );
//数值列
end;
3.在调用显示前需要先将数据设置好,即正确打开ADOQuery的数据集
4.显示记录,只需要设置ListView的显示行数即可显示。
即ListView1.Items.Count:=ADOQuery1.RecordCount;
5.这种做法的好处:
a.速度快,因为不用OwnerData方法添加的数据,其ListView在显示的时候需要在内存中保留
备份,这就需要拷贝数据,影响了速度;而使用OwnerData方法时,只需要显示文字,其原始数据
仍然保存在数据库控件中,这就能够提高速度,并且这种方法取数据是根据当前显示来自动取数的,
即只会显示屏幕上显示的,如果用户拖动滚动条时,才会再次取数据,速度更加快。经测试,显示
几万条数据也只需要短短的一两秒,其速度与DBGrid的速度相当。
b.编程方便,不需要显式添加Item,只需要对在OnData函数中的Item参数进行设置即可,这就允许用户
自由控制,比如多显示两行,最后一行显示统计类信息等
c.对楼主来说,这样做可以不闪,因为它的速度快和刷新机制决定了只会刷新一次,不会频繁刷新显示
而楼主的做法每添加一次数据都会刷新显示