手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

ListView的排序

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
---- 列表框控件在应用程式中的使用率很高,在windows中经常见到,他有四种常见的式样,分别具备显示大图标,小目标,含有图标的多列列表,含有列标头的列表。我们也经常见到一些扩展功能,例如我们在资源管理器中的文档列表框中,在选用周详资料察看时,用鼠标单击列标头,如大小,则所列文档按大小排序;单机日期,则按文档日期进行排序.这一功能增强了应用程式的可用性,使操作更直观、方便。笔者在以Borland C Builder 3.0(以下简称BCB)作为研发平台实现这一功能时发现,仅通过设定列表框控件的属性值的方法,只能根据项目的首列加以排序,不能根据子项目(SubItems)排序。因此,我们需要编写自己的代码以完成这一功能。
---- 以下描述如何在BCB研发平台上为列表框添加列标头点击排序功能,当我们点击的次数为奇数时,所列内容以降序排列;当我们点击的次数为偶数时,所列内容以升序排列。
---- 首先将一个列表框控件安放在Form上,并将其名称设为ListView1。然后在其中添加若干项目作为试验对象。方法为:用鼠标右键单击控件,在弹出的对话框中选择Columns Editor用来添加列和子列;再选Items Editor用来添加项目(包含子列和主列上的内容)。
---- 为了显示出子项目内容,需要在Object Inspector中修改ListView属性值,将ViewStyle配置为vsReport。另外,还必须将SortType配置为None,以使我们的排序程式起作用。这样,程式的外观已符合需要,下面应该增加排序功能的代码了。为此需要添加类的方法到源代码中。添加位置为:

void __fastcall TForm1::ListView1ColumnClick
(TObject *Sender,
TListColumn *Column)
---- 在该方法的传递参数中,指向TListColumn类型的指针Column中含有用户所点击的列的信息。
---- 下面先定义变量:
int i,m,n,j;
static bool od=true;
od=!od;
---- od代表用户点击的次数,奇数时为true,偶数时为false。注意此处od的存储类型设定为static,能够确保其数值的连续性。用n记录用户点击的列号,m记录列表框中的总项目数。
n=Column- >Index;
m=ListView1- >Items- >Count;
---- 在列表框中临时添加一个项目作为排序中交换用的临时空间。
ListView1- >Items- >Add();
---- 当用户点击第一列列标头时,排序按ListView1- >Items- >Item[i]- >Caption进行,和其他列不同,所以要单独进行排序。
if (n==0)
{
for(i=0;i< m-1;i )
for(j=i 1;j< m;j )
if(od)
{
if(ListView1- >Items- >Item[i]- >Caption >
ListView1- >Items- >Item[j]- >Caption)
{
ListView1- >Items- >Item[m]=
ListView1- >Items- >Item[i];
ListView1- >Items- >Item[i]=
ListView1- >Items- >Item[j];
ListView1- >Items- >Item[j]=
ListView1- >Items- >Item[m];
}
}
else
{
if(ListView1- >Items- >Item[i]- >Caption<
ListView1- >Items- >Item[j]- >Caption)
{
ListView1- >Items- >Item[m]=
ListView1- >Items- >Item[i];
ListView1- >Items- >Item[i]=
ListView1- >Items- >Item[j];
ListView1- >Items- >Item[j]=
ListView1- >Items- >Item[m];
}
}
ListView1- >Items- >Delete(m);
return;
}
---- 点击其他列时,需要将所点击的列内容从ListView1- >Items- >Item[i]- > SubItems- >Text中抽出,并参照其进行排序。子项目在存储中,形式为_子项目1\r\n子项目2\r\n子项目3\r\n...子项目N\r\n_。为抽取其中某一子项目,需编写如下函数,并将其放于void __fastcall TForm1::ListView1ColumnClick前面即可。
#include < vcl/dstring.h >
AnsiString __stdcall sg(AnsiString str,int n)
{
int l,i;
AnsiString qq(str);
l=qq.Length();
AnsiString p(str);
char a[]="\r\n";
int j=0,k=0;
for(j=1;j< l;j )
{
i=1;
while(qq[j]!=a[0] && qq[j 1]!=a[1])
{
p[i ]=qq[j];
j ;
}
k ;
if((k-1)==n)
break;
}
p[i]=NULL;
return (p);
}
---- 有了此函数以后,只需将上面的ListView1- >Items- >Item[i]- >Caption更换为sg(ListView1- >Items- >Item[i]- >SubItems- >Text,n-1)即可完成对此项目的点击排序功能。
for(i=0;i< m-1;i )
for(j=i 1;j< m;j )
if(od)
{
if(sg(ListView1- >Items- >
Item[i]- >SubItems- >Text,n-1) >
sg(ListView1- >Items- >
Item[j]- >SubItems- >Text,n-1))
// ...以下从略
最后,删除临时的交换项目。
ListView1- >Items- >Delete(m);
---- 编译运行程式后,即会看到我们预期的结果。另外,本程式是按照字符串方式进行排序的,假如需要按照数字或其他方式排序,只需进行相应的类型转换即可。理解本程式后,读者即掌控了对ListView控件编程的一条基本思路,对今后使用BCB连同对windows编程起到良好作用。




文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS