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

烦恼貔貅

烦恼貔貅

2016-02-19 18:00

最近很多朋友喜欢上设计,但是大家却不知道如何去做,别担心有图老师给你解答,史上最全最棒的详细解说让你一看就懂。
    面向对象的编程工具的特点之一就是要提高代码重用性(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_castTEdit *(Sender))
  
        ShowMessage("This is a editbox");
  
        if(dynamic_castTLabel *(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_castTCustomEdit &(*Sender).Text="This is some demo text";
  
  }
  
  或以下的格式:
  
  void __fastcall TForm1::yyy(TObject *Sender)
  
  {
  
      dynamic_castTCustomEdit* (Sender)-Text="This is some demo text";
  
  }
  
  注重二者的区别,这其实这正是“.”与“-”的不同之处,仔细品味一下,你会清楚的。
  
  上面的两个程式均是先把TEdit类和TMemo类均强制转换成TCustomEdit类,再对其父类的属性进行赋值。
  
  使用Sender参数可以通过单一函数段处理多类组件,真正体现了BCB的面向对象的重用性。
  
  (以上程式以上XP系统、BCB6中编译通过)
  
  
  原来的文章写时有了一些错误,这里向大家说声对不起,更要感谢一些热心网友的指正J
  
  但同时我严正声明本文除了CSDN与CCRUN外没有同意过其它任何人或网站使用。但“BCB高手进阶(十)用Sender参数实现代码重用    nxyc_twz(原作)”,竟然错得和我一样,并且每个字都不差,我希望你能公开向我及关心我的网友们道歉,否则我将保留向CSDN投诉你的权利L
  
展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
BCB中用Sender参数实现代码重用(修正版)

BCB中用Sender参数实现代码重用

编程语言 网络编程
BCB中用Sender参数实现代码重用

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

用PHP实现小型站点广告管理(修正版)

PHP
用PHP实现小型站点广告管理(修正版)

《巫师》格斗系统初解 修正版

电脑网络
《巫师》格斗系统初解 修正版

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

javascript实现划词标记划词搜索功能修正版

Web开发
javascript实现划词标记划词搜索功能修正版

JDOM操作XML文件(法老修正版)

Web开发
JDOM操作XML文件(法老修正版)

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

关于 MD5 的一些知识

关于 MD5 的一些知识

HTML技巧:CSS的优先权

HTML技巧:CSS的优先权
下拉加载更多内容 ↓