国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

ListView的排序

2019-11-17 05:20:23
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  ---- 列表框控件在應(yīng)用程序中的使用率很高,在windows中經(jīng)常見(jiàn)到,它有四種常見(jiàn)的式樣,分別具有顯示大圖標(biāo),小目標(biāo),含有圖標(biāo)的多列列表,含有列標(biāo)頭的列表。我們也經(jīng)常見(jiàn)到一些擴(kuò)展功能,例如我們?cè)谫Y源治理器中的文件列表框中,在選用具體資料察看時(shí),用鼠標(biāo)單擊列標(biāo)頭,如大小,則所列文件按大小排序;單機(jī)日期,則按文件日期進(jìn)行排序.這一功能增強(qiáng)了應(yīng)用程序的可用性,使操作更直觀、方便。筆者在以Borland C++Builder 3.0(以下簡(jiǎn)稱(chēng)BCB)作為開(kāi)發(fā)平臺(tái)實(shí)現(xiàn)這一功能時(shí)發(fā)現(xiàn),僅通過(guò)設(shè)定列表框控件的屬性值的方法,只能根據(jù)項(xiàng)目的首列加以排序,不能根據(jù)子項(xiàng)目(SubItems)排序。因此,我們需要編寫(xiě)自己的代碼以完成這一功能。
---- 以下描述如何在BCB開(kāi)發(fā)平臺(tái)上為列表框添加列標(biāo)頭點(diǎn)擊排序功能,當(dāng)我們點(diǎn)擊的次數(shù)為奇數(shù)時(shí),所列內(nèi)容以降序排列;當(dāng)我們點(diǎn)擊的次數(shù)為偶數(shù)時(shí),所列內(nèi)容以升序排列。
---- 首先將一個(gè)列表框控件安放在Form上,并將其名稱(chēng)設(shè)為L(zhǎng)istView1。然后在其中添加若干項(xiàng)目作為試驗(yàn)對(duì)象。方法為:用鼠標(biāo)右鍵單擊控件,在彈出的對(duì)話框中選擇Columns Editor用來(lái)添加列和子列;再選Items Editor用來(lái)添加項(xiàng)目(包含子列和主列上的內(nèi)容)。
---- 為了顯示出子項(xiàng)目?jī)?nèi)容,需要在Object Inspector中修改ListView屬性值,將ViewStyle設(shè)置為vsReport。另外,還必須將SortType設(shè)置為None,以使我們的排序程序起作用。這樣,程序的外觀已經(jīng)符合需要,下面應(yīng)該增加排序功能的代碼了。為此需要添加類(lèi)的方法到源代碼中。添加位置為:

void __fastcall TForm1::ListView1ColumnClick
(TObject *Sender,
TListColumn *Column)
---- 在該方法的傳遞參數(shù)中,指向TListColumn類(lèi)型的指針Column中含有用戶所點(diǎn)擊的列的信息。
---- 下面先定義變量:
int i,m,n,j;
static bool od=true;
od=!od;
---- od代表用戶點(diǎn)擊的次數(shù),奇數(shù)時(shí)為true,偶數(shù)時(shí)為false。注重此處od的存儲(chǔ)類(lèi)型設(shè)定為static,可以保證其數(shù)值的連續(xù)性。用n記錄用戶點(diǎn)擊的列號(hào),m記錄列表框中的總項(xiàng)目數(shù)。
n=Column- >Index;
m=ListView1- >Items- >Count;
---- 在列表框中臨時(shí)添加一個(gè)項(xiàng)目作為排序中交換用的臨時(shí)空間。
ListView1- >Items- >Add();
---- 當(dāng)用戶點(diǎn)擊第一列列標(biāo)頭時(shí),排序按ListView1- >Items- >Item[i]- >Caption進(jìn)行,與其它列不同,所以要單獨(dú)進(jìn)行排序。
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;
}
---- 點(diǎn)擊其它列時(shí),需要將所點(diǎn)擊的列內(nèi)容從ListView1- >Items- >Item[i]- > SubItems- >Text中抽出,并參照其進(jìn)行排序。子項(xiàng)目在存儲(chǔ)中,形式為_(kāi)子項(xiàng)目1/r/n子項(xiàng)目2/r/n子項(xiàng)目3/r/n...子項(xiàng)目N/r/n_。為抽取其中某一子項(xiàng)目,需編寫(xiě)如下函數(shù),并將其放于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);
}
---- 有了此函數(shù)以后,只需將上面的ListView1- >Items- >Item[i]- >Caption更換為sg(ListView1- >Items- >Item[i]- >SubItems- >Text,n-1)即可完成對(duì)此項(xiàng)目的點(diǎn)擊排序功能。
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))
// ...以下從略
最后,刪除臨時(shí)的交換項(xiàng)目。
ListView1- >Items- >Delete(m);
---- 編譯運(yùn)行程序后,即會(huì)看到我們預(yù)期的結(jié)果。另外,本程序是按照字符串方式進(jìn)行排序的,假如需要按照數(shù)字或其它方式排序,只需進(jìn)行相應(yīng)的類(lèi)型轉(zhuǎn)換即可。理解本程序后,讀者即把握了對(duì)ListView控件編程的一條基本思路,對(duì)今后使用BCB以及對(duì)windows編程起到良好作用。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 襄樊市| 观塘区| 富阳市| 房产| 长汀县| 游戏| 安宁市| 道孚县| 邯郸县| 隆昌县| 澄江县| 青龙| 林西县| 保定市| 勐海县| 安徽省| 龙井市| 景德镇市| 邹平县| 二连浩特市| 永泰县| 荆门市| 开原市| 乌兰浩特市| 沂水县| 宜黄县| 洛隆县| 永嘉县| 东平县| 嘉黎县| 汉中市| 安顺市| 朝阳县| 西青区| 彩票| 临邑县| 楚雄市| 鹿泉市| 迁西县| 黑山县| 庆元县|