当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

<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++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .