想了很多种解决办法但都没有解决,不知那位大侠有解决过此问题的,此闪定要解决,因为对方不接受添加数据时闪,用过的办法有
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.   

    那就不用LISTVIEW,用其它控件囉
      

  2.   

    listview1.Clear;放在 BeginUpdate 和 EndUpdate之間
      

  3.   

    为啥我用beginupdate就一点都不闪呢?
      

  4.   

    还是楼主代码有问题,你给出的代码可能不完整,看不到本质问题,beginupdate应该是好使的
      

  5.   

    闪是因为你添加数据过多。
    你是不是把数据库里目录的所有数据都添加了?
    建议在运行开始时只添加第0层和第一层的。然后在onexpanding中再添加数据,可解决
      

  6.   

      ListView1.DoubleBuffered := True;
      

  7.   

    用virtuallistview方式做啊!
    demo里有例子。
      

  8.   

    一个方法是添加Item前BeginUpdate完成后EndUpdate
    另一个方法就是将listview的ownerData设置为true,然后在onData中填入数据,也就是VirutalListView方式。
      

  9.   

    3、采用BeginUpdate和EndUpdate方法也不行 
    begin 
      listview1.Clear; 
      
      begin 
          listview1.Items.BeginUpdate ; 
          //添加item项 
          listview1.Items.EndUpdate; 
      end;  
    end; //添加item项 不知道楼主的项是指全部的Item项还是部分项,如果是部分的话是不行的。
      

  10.   

    1.设置ListView的OwnerData属性为True
    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.对楼主来说,这样做可以不闪,因为它的速度快和刷新机制决定了只会刷新一次,不会频繁刷新显示
        而楼主的做法每添加一次数据都会刷新显示