一、ListView的運用。
1,使ListView支持排序功能
使用步驟:
a,添加ListView的OnColumnClick事件的處理函數(代碼隨後奉上)
b,添加ListView的OnCompare事件的處理函數(代碼隨後奉上)
c,爲各列設置好合適的Tag屬性即可。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//listview的Tag屬性用於做爲排序標誌使用
//值爲0時,表示listview未進行排序,否則其值爲進行排序的列的地址,
//負值爲降序,正值爲升序
void __fastcall TfrmMain::ListViewColumnClick(TObject *Sender, TListColumn *Column)
{
TCustomListView* lpListView = dynamic_cast<TCustomListView*>(Sender);
if(!lpListView)
return;
int newTag = reinterpret_cast<int>(Column);
if(abs(lpListView->Tag) == newTag) //點擊已用於排序的列,反序該列
newTag = -lpListView->Tag;
lpListView->Tag = newTag; //表示對第Tag列進行排序
lpListView->AlphaSort();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//列的Tag用於表示該列將按什麼類型的數據進行排序:
//1,整型;2,字符串型;3,日期時間型;4,字符串長度;其它,無須排序。
void __fastcall TfrmMain::ListViewCompare(TObject *Sender,TListItem *Item1, TListItem *Item2, int Data, int &Compare)
{
TCustomListView* lpListView = dynamic_cast<TCustomListView*>(Sender);
if(!lpListView)
return;
try
{
assert(reinterpret_cast<TCustomListView*>(lpListView->Tag));
TListColumn *Column = reinterpret_cast<TListColumn *>(abs(lpListView->Tag));
AnsiString str1, str2;
if(0 == Column->Index)
{
str1 = Item1->Caption;
str2 = Item2->Caption;
}
else
{
str1 = Item1->SubItems->Strings[Column->Index-1];
str2 = Item2->SubItems->Strings[Column->Index-1];
}
if(str1 == str2)
{
Compare = 0;
return;
}
///////////////////////////////////////////////////////////////////////////////////////////////
//在switch內部增加一些try...catch語句用以處理當相應項爲空或爲非法字符時,比較結果仍可接受。
//如果你可以確保listview中以整型方式及日期方式比較的項不會爲空項或格式非法,你就可以去掉以
//try...catch語句以提高效率。
switch(Column->Tag) //對第一列進行排序
{
case 1: //該列化爲整型變量進行排序
try{StrToInt(str1);}catch(...){Compare = -1; return;}
try{StrToInt(str2);}catch(...){Compare = 1; return;}
Compare = CompareValue(StrToInt(str1),StrToInt(str2));
break;
case 2: //該列以字符串方式排序
Compare = CompareText(str1, str2);
break;
case 3: //該列以日期時間型進行排序
try{TDateTime(str1);}catch(...){Compare = -1; return;}
try{TDateTime(str2);}catch(...){Compare = 1; return;}
Compare = CompareDateTime(TDateTime(str1), TDateTime(str2));
break;
case 4: //該列以字符串長度進行排序
Compare = CompareValue(str1.Length(),str2.Length());
break;
default: //該列無須排序
Compare = 0;
break;
}
if(lpListView->Tag < 0) //已經是正序,現在反序
Compare = -Compare;
}catch(...)
{
lpListView->Tag = 0; //清除排序標誌
throw AnsiString("排序過程中出現異常");
}
}
2,設置行高
爲ListView設置SmallImages屬性,對這個SmallImages屬性的高、寬進行設置即可。
二、處理因用戶輸入非法數據(如:不匹配EditMask)而導致的異常
a,寫一個異常處理器函數,如:
void __fastcall TfrmMain::MyException(TObject* Sender,Exception* E);
void __fastcall MyException(TObject* Sender,Exception* E)
{
if(E是我要處理的異常類型)
{
//進行我的處理
return;
}
Application->ShowException(E); //調用缺省的異常處理
}
b,設置我的異常處理函數爲應用程序的異常處理函數
void __fastcall TfrmMain::FormCreate(TObject *Sender)
{
Application->OnException = MyException;
}
三、安裝控件的時候可能會出現的問題的解決辦法
1,安裝控件時出現以下編譯錯誤:
/*說明:本知識自接來自以下網頁http://tomore.com/topic.php?tid=1123,我只做了中文化,並適當做了精簡*/
[Pascal Fatal Error] : File not found: 'DesignIntf.dcu'
[Pascal Fatal Error] : File not found: 'DesignEditors.dcu'
解決方法:
a. 在安裝包時顯示的包管理器窗口的樹控件中選擇Requires結點,右擊後顯示的菜單中選ADD,在ADD窗口中輸入DesignIDE.bpi,按OK關閉窗口.
b. Project->Edit Option Source.
c. 在顯示的編輯窗口中,修改PFLAGS結點:添加-LU開關,值爲DesignIde,大概如下:
<PFLAGS value="-$YD -$W -$O- -v -JPHNE -M -LUDesignIde"/>