<b>BCB顶用Sender参数实现代码重用</b>[VC/C++编程]
本文“<b>BCB顶用Sender参数实现代码重用</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
面向对象的编程工具的特点之一就是要提高代码重用性(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
以上是“<b>BCB顶用Sender参数实现代码重用</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |