在C++Builder5.0中实现ListView的列标头点

2022-07-04 19:11

文档管理软件,文档管理系统,知识管理系统,档案管理系统的技术资料:
列表框控件在C++Builder应用程序中的使用率很高,例如我们经常使用的资源管理器,它有四种常见的式样:显示大图标,小目标,含有图标的多列列表,含有列标头的列表。我们也经常见到一些扩展功能,例如我们在资源管理器中的文件列表框中,在选用详细资料察看时,用鼠标单击列标头,如大小,则所列文件按大小排序;单机日期,则按文件日期进行排序.这一功能增强了应用程序的可用性,使操作更直观、方便。
在C++Builder中只能根据项目的首列加以排序,不能根据子项目(SubItems)排序。如果需要根据子项目(SubItems)排序,则必须要自己写代码来实现。
以下描述如何在C++Builder5.0上为列表框添加列标头点击排序功能。
首先新建一个窗体,其名称为Form1,在窗体添加一个列表框控件,其名称为ListView1。
修改ListView1属性值,
将ViewStyle设置为vsReport。
将SortType 设置为None。
双击ListView1,添加列和子列。在例子中,我们添加4个列标头,Caption属性分别是:TEST1,TEST2,TEST3,TEST4。
单击ListView1的Items属性,通过NEW ITEM, NEW SUBITEM 来添加子列和主列上的内容。我们可以随意
填入一些内容。以便排序。
分别在ListView1ColumnClick,ListView1Compare 事件中添加以下代码:
void __fastcall TForm1::ListView1ColumnClick(TObject *Sender,TListColumn *Column)
{
Screen->Cursor=crHourGlass;
ColumnToSort = Column->Index;
ListView1->CustomSort(NULL,ColumnToSort);
Screen->Cursor=crDefault;
}
void __fastcall TForm1::ListView1Compare(TObject *Sender, TListItem *Item1,
TListItem *Item2, int Data, int &Compare)
{
AnsiString a,a1,a2,a3,b,b1,b2,b3;
if (ColumnToSort==0)
Compare = CompareText(Item1->Caption,Item2->Caption);
else
{
/*
点击其它子列时,需要将所点击的列内容从Item1->SubItems[i].Text中抽出,并参照其进行排序。子列的内容在存储中,形式为 :子项目1\r\n子项目2\r\n子项目3\r\n...子项目N\r\n。
我们抽取其中各个子项目,存放到变量 a1,a2,a3,b1,b2,b3 中,编写如下代码:
*/
a=Item1->SubItems[0].Text;
b=Item2->SubItems[0].Text;
a1=a;
b1=b;
a1.Delete(a1.AnsiPos("\r\n"),a1.Length() - a1.AnsiPos("\r\n"));
b1.Delete(b1.AnsiPos("\r\n"),b1.Length() - b1.AnsiPos("\r\n"));
a1.Delete(a1.Length(),1);
b1.Delete(b1.Length(),1);
a2=a;
b2=b;
a2.Delete(1,a2.AnsiPos("\r\n"));
b2.Delete(1,b2.AnsiPos("\r\n"));
a2.Delete(a2.AnsiPos("\r\n"),a2.Length() - a2.AnsiPos("\r\n"));
b2.Delete(b2.AnsiPos("\r\n"),b2.Length() - b2.AnsiPos("\r\n"));
a2.Delete(a2.Length(),1);
b2.Delete(b2.Length(),1);
a3=a;
b3=b;
a3.Delete(1,a3.AnsiPos("\r\n"));
b3.Delete(1,b3.AnsiPos("\r\n"));
a3.Delete(1,a3.AnsiPos("\r\n"));
b3.Delete(1,b3.AnsiPos("\r\n"));
a3.Delete(a3.Length(),1);
b3.Delete(b3.Length(),1);
switch (ColumnToSort){
case 1: { Compare =CompareText(a1,b1); break;}
case 2: { Compare =CompareText(a2,b2); break;}
case 3: { Compare =CompareText(a3,b3); break;}
default : { Compare =CompareText(a1,b1); break;}
}
}
}
编译,即可实现列标头点击排序功能的效果。
有兴趣的读者还可以把代码稍微修改,就可以实现单击以降序排列,双击以升序排列。