| 订阅 | 在线投稿
分享
 
 
 

BCB中用Sender参数实现代码重用(修正版)

来源:互联网网民  宽屏版  评论
2008-06-01 01:47:43

面向对象的编程工具的特点之一就是要提高代码重用性(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

 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
面向对象的编程工具的特点之一就是要提高代码重用性(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
󰈣󰈤
 
 
 
>>返回首页<<
 
 热帖排行
 
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
©2005- 王朝网络 版权所有