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

關於ListView的排序

答題得分者是:RedSnow
Blueberrug
一般會員


發表:14
回覆:50
積分:17
註冊:2005-05-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-11-01 18:51:05 IP:220.130.xxx.xxx 未訂閱
大家好: 請問各位關於ListView排序, 目前我ListView顯示五行, 其中一行我故意弄成粗體字型顯示, 但經過排序之後, 粗體字沒有跟著一起排序 原本是顯示在第五行的資料為粗體 排序過後原本第五行的資料跑到第二行了。 但卻沒有顯示為粗體字型, 反而還停留再第五行為粗體, 請問各位大大要怎麼解決才好呢?    
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "ListViewColors.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TStringList *Index;
bool Test = false;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void __fastcall TForm1::FormCreate(TObject *Sender)
{
  Index = new TStringList;
  TListColumn *pCol;
  pCol = ListView1->Columns->Add();
  pCol->Caption = "1";
  pCol->Width = 50;
  pCol = ListView1->Columns->Add();
  pCol->Caption = "2";
  pCol->Width = 50;
  pCol = ListView1->Columns->Add();
  pCol->Caption = "3";
  pCol->Width = 150;
  pCol = ListView1->Columns->Add();
  pCol->Caption = "4";
  pCol->Width = 150;      TListItem *pItem1;
  for (int i=6; i>0; i--)
  {
    Index->Add(IntToStr(i));
    pItem1 = ListView1->Items->Add();
    pItem1->ImageIndex = i;
    pItem1->Caption = "";
    pItem1->SubItems->Add(IntToStr(i));
    pItem1->SubItems->Add("Index" IntToStr(i));
    pItem1->SubItems->Add("測試" IntToStr(i));
  }      Index->SaveToFile(ExtractFilePath(Application->ExeName)   "a.txt");    }
//---------------------------------------------------------------------------    void __fastcall TForm1::ListView1CustomDrawSubItem(TCustomListView *Sender,
      TListItem *Item, int SubItem, TCustomDrawState State,
      bool &DefaultDraw)
{
  if ( (StrToInt(Index->Strings[Item->Index])) == 2)
  {
    ListView1->Canvas->Font->Style = TFontStyles() << fsBold;
    ListView1->Canvas->Font->Size = 10;
  }
}
//---------------------------------------------------------------------------    void __fastcall TForm1::ListView1ColumnClick(TObject *Sender,
      TListColumn *Column)
{
  Test = !Test;
  ListView1->Tag = Column->Index;//將選擇之column index寫入Tag
  ListView1->CustomSort(NULL, Test); //執行sort , 0為升冪1為降冪
}
//---------------------------------------------------------------------------    void __fastcall TForm1::ListView1Compare(TObject *Sender, TListItem *Item1,
      TListItem *Item2, int Data, int &Compare)
{
  if (ListView1->Tag == 0)  //選first column直接用caption
    Compare = CompareText(Item1->Caption, Item2->Caption);
  else
  {
    int id =ListView1->Tag-1; //取得要sort之subitem之index
    Compare = CompareText(Item1->SubItems->Strings[id],Item2->SubItems->Strings[id]);
  }
  if (Data==1)  //若是要Descending
    Compare = -Compare;
}
//---------------------------------------------------------------------------    void __fastcall TForm1::ListView1Click(TObject *Sender)
{
  if (ListView1->SelCount==0)
    return;
  
  int MailIndex = ListView1->Selected->Index;
  Index->Strings[MailIndex] = 0;
  Index->SaveToFile(ExtractFilePath(Application->ExeName)   "a.txt");      
}
//---------------------------------------------------------------------------
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-11-01 20:39:42 IP:61.217.xxx.xxx 未訂閱
Blueberrug 您好:    您在 ListView1 的 CustomDrawSubItem() 處理程序內所比對的對象是名為 Index 的 TStringList,而不是 ListView1 的 Item,在 ListView1 排序後, Index 並未做相同的排序動作,兩者的索引內容自然有異,請直接使用該處理程序傳入的 Item 來做檢查比對的動作,這樣子就不會產生混淆了。      7 天天敲鍵盤 v 時時按滑鼠 8
系統時間:2024-04-28 13:48:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!