【BCB】【問題】 ListView 內的 Column 排序 |
答題得分者是:chtai
|
boyman
一般會員 ![]() ![]() 發表:8 回覆:13 積分:9 註冊:2004-05-14 發送簡訊給我 |
|
chtai
高階會員 ![]() ![]() ![]() ![]() 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
|
boyman
一般會員 ![]() ![]() 發表:8 回覆:13 積分:9 註冊:2004-05-14 發送簡訊給我 |
|
chtai
高階會員 ![]() ![]() ![]() ![]() 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
引言:double ans2 = int(ans*100)/100.0; if (ans2 >= 0) { TListItem *anslist; anslist = ListView1->Items->Add(); anslist-> Caption = ListBox1->Items->Strings[i]; anslist->SubItems->Add(FloatToStr(ans2) "%"); anslist->SubItems->Add(IntToStr( ans )); } 然後改成這樣 void __fastcall TForm1::ListView1Compare(TObject *Sender, TListItem *Item1, TListItem *Item2, int Data, int &Compare) { int id =ListView1->Tag; // 沒有 -1 喔 Compare = CompareText(Item1->SubItems->Strings[id],Item2->SubItems->Strings[id]); if (Data==1) //若是要Descending Compare = -Compare; } 目前我只想到這個方法 就是你偷偷把ans也放進SubItems裡頭 (當然你可以把width調成0,讓使用者看不見) 然後當使用者按了 相似度 時 你排序的對象其實是ans,這樣就可以了
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
boyman
一般會員 ![]() ![]() 發表:8 回覆:13 積分:9 註冊:2004-05-14 發送簡訊給我 |
|
chtai
高階會員 ![]() ![]() ![]() ![]() 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
引言: 先感謝chtai兄的回答~ 試了之後出現boyman你好 會出現這個錯誤是因為你用了錯誤的index 我想大概是以下這行的id出了問題 Compare = CompareText(Item1->SubItems->Strings[id],Item2->SubItems->Strings[id]); 我的想法是另存實際的數值在SubItems裡頭,而id則是該SubItems的index 至於id的值則依您程式的寫法而做適當調整。 (反正就是當你發現按了"相似度"時,去排序"實際數值"就是了) 至於如何直接對"相似度"做排序, sorry,我知道的不夠多,找不到有哪個函式可以用 若有哪位仁兄知道的,還請告知,我也想學起來 :)
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
boyman
一般會員 ![]() ![]() 發表:8 回覆:13 積分:9 註冊:2004-05-14 發送簡訊給我 |
|
jest0024
高階會員 ![]() ![]() ![]() ![]() 發表:11 回覆:310 積分:224 註冊:2002-11-24 發送簡訊給我 |
|
boyman
一般會員 ![]() ![]() 發表:8 回覆:13 積分:9 註冊:2004-05-14 發送簡訊給我 |
引言: 你所調用的是屬於「文字」的比對,但是你想要的結果是「數字」的比對!! 1.文字比對 是由第1個字串(Byte)往後比對 2.數字比對 依造數字本身的(Byte)比對 才會造成你想要的結果不一。 #要做成你想要的結果,是先把"6.25%"字串轉型成浮點數值再比對看看唄 學而時習之不亦樂乎!不知道jest0024兄指的文字比對是指"CompareText"這個, 還是傳值的那個? 小弟有試過直接將算出來的ans值(也就是沒有加FloatToStr)加進去Column, 排列的結果是一樣的。 小弟查help有查到"CompareValue",是這個嗎?有看沒有懂 @@ 發表人 - boyman 於 2004/05/28 23:18:08 |
jest0024
高階會員 ![]() ![]() ![]() ![]() 發表:11 回覆:310 積分:224 註冊:2002-11-24 發送簡訊給我 |
1.文字比對 "1234" "567" ============ 由前向後比對.5比1大.. 2.數字比對 "1234" "567" ======== 由整個Byte比對.1234比567大 3.CompareText之類是屬於文字的比對!! 4.文字轉換 首先"1234.56%"為字串,先得把"%"替除成"1234.56" s = "1234.56%" s = s.substring(1,s.length-1) 再將"1234.56"轉為數字 f = StrToFloatDef(s,0); 再使用f這個值比對!!大致類似如此,C不熟..SORRY! 5. 這兒的比對法要使用數字的比對,非文字的比對!! Compare = CompareText(Item1->SubItems->Strings[id],Item2->SubItems->Strings[id]);學而時習之不亦樂乎! 發表人 - jest0024 於 2004/05/29 07:42:33 |
boyman
一般會員 ![]() ![]() 發表:8 回覆:13 積分:9 註冊:2004-05-14 發送簡訊給我 |
|
jest0024
高階會員 ![]() ![]() ![]() ![]() 發表:11 回覆:310 積分:224 註冊:2002-11-24 發送簡訊給我 |
|
boyman
一般會員 ![]() ![]() 發表:8 回覆:13 積分:9 註冊:2004-05-14 發送簡訊給我 |
|
yjh0225
一般會員 ![]() ![]() 發表:7 回覆:7 積分:2 註冊:2003-10-13 發送簡訊給我 |
修改一下前面大大寫的程式碼,讓可以使用數值的欄位採用數值比對 if (ListView1->Tag == 0) //選first column直接用caption
Compare = CompareText(Item1->Caption, Item2->Caption);
else
{
int id = ListView1->Tag - 1; //取得要sort之subitem之index
//數值欄位要使用數值比對
if(id != 0)
{
Compare = CompareText(Item1->SubItems->Strings[id],Item2->SubItems->Strings[id]);
}
else
{
Compare = CompareValue(StrToFloat(Item1->SubItems->Strings[id].SubString(1,Item1->SubItems->Strings[id].Length() - 2)),StrToFloat(Item2->SubItems->Strings[id].SubString(1,Item2->SubItems->Strings[id].Length() - 2)));
}
}
if (Data==1) //若是要Descending
Compare = -Compare;
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |