面向工具的编程东西的特点之一就是要提高代码重用性(Reuse),宝兰的BCB虽然可以实现这一成果。我们都知道,在BCB中,大部门措施代码都直接或间接的对应着一个事件,此措施称为事件处理惩罚句柄,它实际上就是一个进程。从应用措施的工程到窗口、组件和措施,BCB强调的是其开拓进程中每一条理的重用性,可以充实操作已编写过的代码来淘汰事情量,更会使你的措施变得美妙。代码段间的共享都跟产生该事件的控件有关有关,需要按照控件范例做出相应的处理惩罚,这时就要用到Sender参数。
每个函数的开头都有形如:
void _fastcall TForm1::Button1Click(TObject *Sender)
个中的Sender是一个TObject范例的参数,它汇报BCB哪个控件吸收到这个事件并挪用相应的处理惩罚进程。我们可以编写一个单一的事件处理惩罚句柄,通过Sender参数和if语句可能case语句共同,来处理惩罚多个组件。在Delphi中可以用IS来测试Sender范例,可能用AS举办范例转换,BCB我们只在用dynamic_cast来举办上面两个事情,下面把dynamic_cast的用法说明一下。
dynamic_cast 可以把某种工具强制转成另一个类,这里所谓的强制仍有其范围,也就是说,假如类转不外来,那么系统将不会举办转换操纵的。若范例转换无法乐成则返回一个值是0的指针。若参数T是一个参考范例,而类的转换又失败了,系统将会丢出一个异常处理惩罚信息:Bad_cast。但你安心这不会导致系统死机,所以可以安心利用。其程式:
dynamic_cast <T> (ptr)
T参数必然要是一个指针、void* 、或是已经界说过的类,而ptr参数则必需是一个指针(pointer) 或是一个引用(reference)。假如T的范例是void*,那么ptr则是一个可以会见最下面类里的任何成员,虽然这样的类将不行以是基本类。
1.举办判定
我们用dynamic_case来测试Sender,以便找到挪用这个事件的处理惩罚句柄或组件的范例。如,我们将窗口中的编辑框和标签的Click事件的处理惩罚句柄都指向窗口的xxx函数(其实你只要先把一个控件的Click事件定名为xxx,并在个中写上共享代码,其它控件的Click事件都指向xxx就行了),本例中的编辑框和标签对Click事件将有差异的回响,代码如下:
void __fastcall TForm1::xxx(TObject *Sender)
{
if(dynamic_cast<TEdit *>(Sender))
ShowMessage("This is a editbox");
if(dynamic_cast<TLabel *>(Sender))
ShowMessage("This is a label");
}
虽然若是多个同类组件,只是想共用一个事件,那要比这简朴多了。举个例子,若你的许多编辑框(Edit),你想在输入某一项的时候先把这一项清空,你只要写一个OnEnter事件就可以了:
void __fastcall TForm1::Edit1Enter(TObject *Sender)
{
TEdit *Edittemp=(TEdit*)(Sender);//把差异的编辑框统一起来
Edittemp->Text="";
}
其它的Edit组件的OnEnter事件都指向Edit1Enter,这样就行了,试一下,是不是鼠标放在编辑框里一点就清空了J其实这里只是把差异的编辑框(Sender清楚是那一个编辑框)统一起来,好用一个配合的事件来处理惩罚。你在同一组件共用同一事件时必然要留意这一点。
2.强制举办范例转换
将若干担任同一父类的子类强制转换成该父类。如窗口中有一个TEdit类控件和一个TMemo控件,它们实际上都担任于TCustomEdit类,假如你要为二者的某一事件提供同样的处理惩罚,可以将二者的事件句柄都指向自界说的函数yyy,我们这里仍然是在OnEnter事件中(虽然你完全可以在其它事件中完成):
void __fastcall TForm1::yyy(TObject *Sender)
{
dynamic_cast<TCustomEdit &>(*Sender).Text="This is some demo text";
}
或以下的名目:
void __fastcall TForm1::yyy(TObject *Sender)
{
dynamic_cast<TCustomEdit* >(Sender)->Text="This is some demo text";
}
留意二者的区别,这其实这正是“.”与“->”的差异之处,仔细咀嚼一下,你会清楚的。
上面的两个程式均是先把TEdit类和TMemo类均强制转换成TCustomEdit类,再对其父类的属性举办赋值。
利用Sender参数可以通过单一函数段处理惩罚多类组件,真正浮现了BCB的面向工具的重用性。
(以上程式以上XP系统、BCB6中编译通过)
本来的文章写时有了一些错误,这里向各人说声对不起,更要感激一些热心网友的指正J
但同时我严正声明本文除了CSDN与CCRUN外没有同意过其它任何人或网站利用。但“BCB好手进阶(十)用Sender参数实现代码重用 nxyc_twz(原作)”,竟然错得和我一样,而且每个字都不差,我但愿你能果真向我及体贴我的网友们致歉,不然我将保存向CSDN投诉你的权利L
——————
作者:ch_builder
信箱:ch_builder@163.com
QQ:116001522