ListView快速拷贝的问题(50分)

  • 主题发起人 主题发起人 yangzhengling
  • 开始时间 开始时间
Y

yangzhengling

Unregistered / Unconfirmed
GUEST, unregistred user!
两个ListView,其中一个数据有几万条,要
求快速拷贝到另外一个空的ListView中(都为vsReport模式的)
谢谢!
 
to yangzhengling:
>>其中一个数据有几万条
先不要说怎样快速拷贝,仅从上面这句话就能看出你使用ListView控件效率很低,几万条???
我的老天!放谁身上也受不了啊!
老大,你记住我这句话:在数据很多的情况下,要想提高ListView控件的效率,就绝对不能一次性
的装入太多数据,用多少,装多少,这才行。具体来说,就是将ListView的OwnerData属性设为true,
然后充分利用OnData和OnDataHint这两个事件,尤其是OnDataHint非常有用,一些负担很重的工作
都放在这里来做,具体请看Delphi或C++Builder自带的VirtualListView例子。
针对你的问题,如果是我,第一个ListView我就不可能把它装几万条数据,数据放在外面,第二个
ListView与第一个公用就可以了,根本不拷贝。
 
极有道理!因为是从二进制文件中取数据流,想图简单,一次都扔在ListView中,然后
查找的显示在另一个ListView中,实际也是不可行的。
对于这种情况有什么好的建议吗?
 
对于二进制文件的读取,就用TStream之类的就可以,我不用多说了。关键是ListView的处理,步骤如下:
(你将问题提在C++Builder版中,我就用C++Builder代码了)
首先,ListView1->OwnerData = true;
然后,计算一个这些二进制数据如果全部添加到ListView控件
中共需要多少行告诉ListView,具体就是:ListView1->Items->Count = 你计算出来的行数 ;
接下来是OnData和OnDataHint事件处理代码部分
//---------------------------------------------------------------------------
void __fastcall TForm1::ListView1Data(TObject *Sender, TListItem *Item)
{
if( Item->Index < 你计算出来的行数 )
{
Item->Caption = 第一项 ;
Item->SubItems->Add( 第二项 ) ;
Item->SubItems->Add( 第三项 ) ;
......
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListView1DataHint(TObject *Sender,
int StartIndex, int EndIndex)
{
if( (StartIndex < 你计算出来的行数) &amp;&amp;
(EndIndex < 你计算出来的行数) )
{
//处理代码
//这个事件的意思是当ListView控件中的内容发生变化时,就触发这个事件
//比如:有些项的值不是现成的,而是要经过复杂的计算,才得到的
//就应该放在这来处理,因为一次处理几十个这样的项比一次处理几万个这样的项速度不知要
//快多少倍!!这就是为什么说负荷重的工作要在这里完成的道理
//所以说,这里处理的好将极大的提升ListView的显示速度
//我估计,如果你在二进制数据的读取处理上做得很好的话,用上面的方法在ListView的显示上只
//需要零点几秒钟
}
}
//---------------------------------------------------------------------------
如果我上面说的这些你还没完全明白的话,你最好去看看VirtualListView这个例子程序,(这个例子
稍微难懂一点是因为里面用了底层的Shell接口)
 
再问一下,
现在我的处理模式是先用两个TStringList读出要查询所有的数据的两个元素,
做为索引,根据用户输入的查找数据在这两个TStringList循环检索出对应的
Index,再到文件中去调出对应Index的所有数据,每次显示200条。
请各位讨论一下这种方法的可行性,或可以优化的地方。
可能太罗索,还请见谅啦 [:)]
 
时间太久,强制结束。
 
后退
顶部