BCB高手进阶
(十)用Sender参数实现代码重用
面向对象的编程工具的特点之一就是要提高代码重用性(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的指针,失败则丢出一个异常处理信息:Bad_cast,但你放心不会导致系统死机,所以可以放心使用。其程式:
dynamic_cast <T> (ptr)
T参数一定要是一个指针、void 、或是已经定义过的类,而ptr参数则必须是一个指针(pointer) 或是一个引用(reference)。如果T的类型是void,那么ptr则是一个可以访问最下面类里的任何成员,当然这样的类将不可以是基础类。
1.进行判断
我们用dynamic_case来测试Sender,以便找到调用这个事件的处理句柄或组件的类型。如,并窗口编辑框和标签的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”);
}
2.强制进行类型转换
将若干继承同一父类的子类强制转换成该父类。如窗口中有一个TEdit类控件和一个TMemo控件,它们实际上都继承于TCustomEdit类,如果你要为二者的某一事件提供同样的处理,可以将二者事件句柄都指向自定义的函数yyy:
void _fastcall TForm1::yyy(Tobject *Sender)
{
dynamic_cast<TCustomEdit *>(Sender).text=”This is some demo text”;
}
在这里,先把TEdit类和TMemo类均强制转换成TCustomEdit类,再对其父类的属性进行赋值。
使用Sender参数可以通过单一函数段处理多类组件,真正体现了BCB的面向对象的重用性。