全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4394
推到 Plurk!
推到 Facebook!

【BCB】【問題】 ListView 內的 Column 排序

答題得分者是:chtai
boyman
一般會員


發表:8
回覆:13
積分:9
註冊:2004-05-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-27 21:37:57 IP:219.68.xxx.xxx 未訂閱
小弟是初入BCB的新手,請多指教:    小弟要在ListView內的一個Column排序, 參照了 ccchen版主 這篇的方法: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=23825    小弟要的是由100排至0,但排出來的順序卻怪怪的  < src="http://members.at.infoseek.co.jp/boyman/sort.gif"> 謝謝~ 發表人 - taishyang 於 2004/05/27 22:26:47
chtai
高階會員


發表:68
回覆:238
積分:116
註冊:2004-05-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-27 22:52:03 IP:140.113.xxx.xxx 未訂閱
boyman你好: 不知你的code是怎麼寫的呢? 是否願意放出來讓大家幫你看看呢? 因為小弟我照著ccchen大哥的做法是完全沒問題的阿~
------
My Web: http://nelson.csie.us
My Blog: http://blog.nelson.csie.us
boyman
一般會員


發表:8
回覆:13
積分:9
註冊:2004-05-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-27 23:14:11 IP:219.68.xxx.xxx 未訂閱
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) "%");
} 
這是傳值的部分,listview的部分和 ccchen版主的一樣。
chtai
高階會員


發表:68
回覆:238
積分:116
註冊:2004-05-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-27 23:50:51 IP:140.113.xxx.xxx 未訂閱
引言:
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-28 00:44:22 IP:219.68.xxx.xxx 未訂閱
先感謝chtai兄的回答~    試了之後出現 < src="http://members.at.infoseek.co.jp/boy01man_pic/error.png"> 若小弟想改成直接用相似度由大排至小秀出在listview的話, 會不會比較好做呢?
chtai
高階會員


發表:68
回覆:238
積分:116
註冊:2004-05-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-28 01:02:10 IP:140.113.xxx.xxx 未訂閱
引言: 先感謝chtai兄的回答~ 試了之後出現 < src="http://members.at.infoseek.co.jp/boy01man_pic/error.png"> 若小弟想改成直接用相似度由大排至小秀出在listview的話, 會不會比較好做呢?
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-05-28 15:38:03 IP:219.68.xxx.xxx 未訂閱
最後小弟弄成縮圖,並直接排列,而值的部分,就不取%比了, 好像弄成%比的排序,就會怪怪的,都會是以最前面的數字來排列 @@||| 感謝 chtai兄的回覆~ 發表人 - boyman 於 2004/05/28 15:39:25 發表人 - boyman 於 2004/05/28 15:40:22
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-05-28 16:56:32 IP:61.60.xxx.xxx 未訂閱
你所調用的是屬於「文字」的比對,但是你想要的結果是「數字」的比對!! 1.文字比對 是由第1個字串(Byte)往後比對 2.數字比對 依造數字本身的(Byte)比對 才會造成你想要的結果不一。 #要做成你想要的結果,是先把"6.25%"字串轉型成浮點數值再比對看看唄 學而時習之不亦樂乎!
boyman
一般會員


發表:8
回覆:13
積分:9
註冊:2004-05-14

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-05-28 23:16:47 IP:219.68.xxx.xxx 未訂閱
引言: 你所調用的是屬於「文字」的比對,但是你想要的結果是「數字」的比對!! 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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-05-29 07:38:01 IP:61.60.xxx.xxx 未訂閱
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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-05-29 10:13:15 IP:219.68.xxx.xxx 未訂閱
謝謝jest0024兄的詳細說明  那請問傳過去 >
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-05-29 13:27:10 IP:210.66.xxx.xxx 未訂閱
引言: 謝謝jest0024兄的詳細說明 那請問傳過去 > < face="Verdana, Arial, Helvetica"> 要做的事只有把字串轉為數值兒以用什麼函式比呢?!數值比對要什麼函數嗎!? Compare = (i-j); //頂多再加個轉型八!! ps.我電腦只灌Delphi,並沒BCB所以不能給泥範例,拍謝... ABCD分開看的懂,連起來像鬼劃符~~!!! 發表人 - jest0024 於 2004/05/29 13:28:21
boyman
一般會員


發表:8
回覆:13
積分:9
註冊:2004-05-14

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-05-29 14:15:11 IP:219.68.xxx.xxx 未訂閱
引言: 要做的事只有把字串轉為數值兒以用什麼函式比呢?!數值比對要什麼函數嗎!? Compare = (i-j); //頂多再加個轉型八!! ps.我電腦只灌Delphi,並沒BCB所以不能給泥範例,拍謝... ABCD分開看的懂,連起來像鬼劃符~~!!!
原來這樣就能排列出來了 ,已經成功用出來了,非常感謝jest0024兄~ 不過,分數已經先給chtai兄了,真抱歉
yjh0225
一般會員


發表:7
回覆:7
積分:2
註冊:2003-10-13

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-08-09 11:46:51 IP:211.72.xxx.xxx 未訂閱
修改一下前面大大寫的程式碼,讓可以使用數值的欄位採用數值比對 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;
系統時間:2024-04-19 14:44:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!