有什么类似listview的控件,请推荐您觉得最好的
有什么类似listview的控件,请推荐您觉得最好的
楼主leonpard(猪哥哥)2002-05-14 14:32:35 在 C++ Builder / 基础类 提问 能告诉下载地址吗?或者 leonpard@163.com
ListView加载和排序太慢了,而且不能修改里面的每列的内容!!! 问题点数:20、回复次数:28Top
1 楼Wingsun(孙春阳)回复于 2002-05-14 15:34:49 得分 0
怎么会呢,速度的问题你可以看看专题中的相关文章,改变每一列的内容我看不懂,难道
Item->SubItems->Stirngs="";
不行Top
2 楼leonpard(猪哥哥)回复于 2002-05-14 18:43:06 得分 0
难道你可以使用鼠标点击选中修改吗?Top
3 楼wangxd(东东)回复于 2002-08-05 15:30:47 得分 0
能Top
4 楼max_wzg(暴走-银狼)回复于 2002-08-05 16:00:26 得分 0
今晚给你Top
5 楼max_wzg(暴走-银狼)回复于 2002-08-05 22:49:06 得分 10
好了我来了:)
采用常规方法处理ListView,在数据量大时无论是还是用了BeginUpdata和EndUpdata()还是处理WM_EraseBkgnd信息都不会得到理想的效果,那答案是什么呢?
嗯,采用所谓Virtual ListView。
说起来很神秘,其实点通了很简单。
在于把ListView->OwnerData设为true,然后直接设置
ListView->Items->Count为数据总数,实际的数据可以保在任意其它速度较快且可直接索引的容器里(如STL中的vector),然后关键是在OnData事件中写入代码通过Item->Index从容器中(如vector)取出数据,然后用
Item->Caption = ???;
Item->SubItems->Add(???);
Item->SubItems->Add(???);
来动态的写入数据到ListView用于UI显示,如此Virtual ListView即完成.
一个完整的简单例子如下:
/*Unit1.h*/
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <vector>
using namespace std;
//---------------------------------------------------------------------------
struct ListViewData
{
AnsiString Caption;
AnsiString SubItems1;
AnsiString SubItems2;
AnsiString SubItems3;
};
class TForm1 : public TForm
{
__published: // IDE-managed Components
TListView *ListView1;
void __fastcall ListView1Data(TObject *Sender, TListItem *Item);
private: // User declarations
vector<ListViewData*> m_lvDataVector;
public: // User declarations
__fastcall TForm1(TComponent* Owner);
__fastcall ~TForm1();
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
/*unit1.cpp*/
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
ListView1->OwnerData = true;
const int iListViewCount = 5000;
ListView1->Items->Count = iListViewCount;
for(int i = 0; i < iListViewCount; ++i) {
ListViewData *plvData = new ListViewData;
plvData->Caption = "Caption" + AnsiString(i);
plvData->SubItems1 = "SubItems1" + AnsiString(i);
plvData->SubItems2 = "SubItems2" + AnsiString(i);
plvData->SubItems3 = "SubItems3" + AnsiString(i);
m_lvDataVector.push_back(plvData);
}
}
__fastcall TForm1::~TForm1()
{
int iCount = ListView1->Items->Count;
for(int i = 0; i < iCount; ++i) {
ListViewData *plvData = m_lvDataVector;
delete plvData;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListView1Data(TObject *Sender, TListItem *Item)
{
ListViewData *plvData = m_lvDataVector;
Item->Caption = plvData->Caption;
Item->SubItems->Add(plvData->SubItems1);
Item->SubItems->Add(plvData->SubItems2);
Item->SubItems->Add(plvData->SubItems3);
}
//---------------------------------------------------------------------------
速度很快,5000条数据只要1秒左右.
Top
6 楼wyb_45(小兵)回复于 2002-08-15 11:02:39 得分 0
Raize控件可以替代BCB的标准控件,功能更强,更好Top
7 楼yeeeye(天)回复于 2002-08-15 11:18:21 得分 0
hi,max_wzg(暴走-银狼)
我用你这个程序,run的时候出错,这句
ListViewData *plvData = m_lvDataVector;
有问题,说什么内存访问出错
到底怎么回事啊?Top
8 楼max_wzg(暴走-银狼)回复于 2002-08-30 13:23:21 得分 0
to yeeeye(天)
你大概修改了上面的程序,数据插入操作没有在TForm1::TForm1中进行,
原因出在OnData事件的激发条件上,OnData事件的Item->Index会出现大
于ListView1->Items->Count的情况,同时也大于lvDataVector.size(),
这时m_lvDataVector自然就出错了,这是上面的程序应该
考虑面没有考虑的,应该写成:
void __fastcall TForm1::ListView1Data(TObject *Sender, TListItem *Item)
{
if(Item->Index > m_lvDataVector.size())
return;
ListViewData *plvData = m_lvDataVector;
Item->Caption = plvData->Caption;
Item->SubItems->Add(plvData->SubItems1);
Item->SubItems->Add(plvData->SubItems2);
Item->SubItems->Add(plvData->SubItems3);
}Top
9 楼almser(苏格拉底)回复于 2002-08-30 13:46:12 得分 0
好方法Top
10 楼yuliangpei(踏雪无痕)回复于 2002-08-30 16:23:25 得分 10
兄弟:
你的程序想法及效果,可以说很完美了。但是完美之中还有一点小小的瑕疵,此处应该是这样的:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
ListView1->OwnerData = true;
const int iListViewCount = 5000;
for(int i = 0; i < iListViewCount; ++i) {
ListViewData *plvData = new ListViewData;
plvData->Caption = "Caption" + AnsiString(i);
plvData->SubItems1 = "SubItems1" + AnsiString(i);
plvData->SubItems2 = "SubItems2" + AnsiString(i);
plvData->SubItems3 = "SubItems3" + AnsiString(i);
m_lvDataVector.push_back(plvData);
}
ListView1->Items->Count = iListViewCount;
}
我以为是不是先来个FOR循环。共同进步!!!!!!Top
11 楼pzoon(杀死日本人)回复于 2002-09-22 18:00:21 得分 0
ListView加载和排序太慢了,而且不能修改里面的每列的内容!!!
怎么可能呢,我做过这个,很好用的,你看以下帮助,有例子Top
12 楼huzhangyou(信仰(http://www.libing.net.cn))回复于 2002-09-28 22:05:59 得分 0
不错
呵呵
Top
13 楼leonpard(猪哥哥)回复于 2002-09-29 11:59:40 得分 0
我的意思是用鼠标点击选中,然后修改,象stringgrid那样Top
14 楼xinqc(新)回复于 2002-10-21 14:26:07 得分 0
应该不能在界面上修改每列的内容,去看看有没有控件吧Top
15 楼Sword_Light(三尺水)回复于 2002-12-12 12:09:07 得分 0
ListView控件本来就很好吗!速度慢主要是你添加数据的方法不太好,不应该一次性地将所有的数据都添加进去,应该是显示多少,添加多少,这样速度就快了,同样道理,TreeView控件也是这个道理 :)Top
16 楼cker(〖烟波浩淼三千里、人鬼殊途五百年〗)回复于 2002-12-14 13:31:33 得分 0
inplace edit么。
没什么,自己放一个edit动态调节位置和大小就可以就地编辑了Top
17 楼myy()回复于 2002-12-14 18:30:46 得分 0
TVirtualTree相当于TTreeView+TListView+ (TStringGrid 或 TDrawGrid),底图,节点级的Checked,Disabled,Visibled,HotTrack...,节点遍历,保存数据到流,到文件(rtf,html,txt...)
剪贴板支持,ole & vcl拖放支持,打印,排序,单元格编辑,Unicode支持,精细的外观和行为定制,太多太多功能,尤其在效率和图形方面,相当不错(具体可见help或demo).一旦拥有,别无所求!
http://www.delphi-gems.com/VirtualTreeview/VT.phpTop
18 楼thinker(老了老了)回复于 2002-12-16 14:19:56 得分 0
to max_wzg(暴走-银狼):
采用这个方法,很多ListView的事件和方法就不可用了.
比如:排序,FindCaption等,不知道老兄是否有别的办法解决?Top
19 楼lingyunfeipu(凌云)回复于 2002-12-16 14:34:39 得分 0
好像checkbox 也不能用了Top
20 楼max_wzg(暴走-银狼)回复于 2002-12-16 15:16:20 得分 0
排序,FindCaption等当然就要对自己的数据(这里是ListViewData)进行了。Top
21 楼leonpard(猪哥哥)回复于 2002-12-16 16:10:02 得分 0
好象都得自己搞定是不是。Top
22 楼lingyunfeipu(凌云)回复于 2002-12-16 16:37:59 得分 0
能告诉我怎样显示checkbox 吗?
Top
23 楼leonpard(猪哥哥)回复于 2002-12-17 11:33:25 得分 0
to lingyunfeipu:
ListView本来就有一个属性叫CheckBox,设为true就可以了Top
24 楼lingyunfeipu(凌云)回复于 2002-12-17 13:19:26 得分 0
我试过了,设为true 但是 CheckBox却显示不出来
Top
25 楼leonpard(猪哥哥)回复于 2002-12-17 14:11:05 得分 0
不会吧????Top
26 楼hjhwfw(wfw)回复于 2002-12-19 16:34:01 得分 0
能否讨论一下ListView的Click事件?为什么在ListView中选择多个图标,在没有放开鼠标前将鼠标移出ListView,click事件就不执行??怎样让click执行??Top
27 楼xin_ni(心尘)回复于 2002-12-19 19:39:09 得分 0
Click是由mousedown和mouseup两个事件组成的嘛。在别的地方放开鼠标,click事件当然不执行了。Top
-
相关文章
