一、ListView的运用。
1,使ListView支持排序功能
使用步骤:
a,添加ListView的OnColumnClick事件的处理函数(代码随后奉上)
b,添加ListView的OnCompare事件的处理函数(代码随后奉上)
c,为各列设置好合适的Tag属性即可。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//listview的Tag属性用于做为排序标志使用
//值为0时,表示listview未进行排序,否则其值为进行排序的列的地址,
//负值为降序,正值为升序
void __fastcall TfrmMain::ListViewColumnClick(TObject *Sender, TListColumn *Column)
{
TListView* lpListView = dynamic_cast<TListView*>(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)
{
TListView* lpListView = dynamic_cast<TListView*>(Sender);
if(!lpListView)
return;
try
{
assert(reinterpret_cast<int>(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(lvSecInfo->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;
}