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的指针。若参数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

时间: 2024-04-30 01:41:20

BCB中用Sender参数实现代码重用的相关文章

提高Java代码重用性的三个措施

措施一:改写类的实例方法 通过类继承实现代码重用不是精确的代码重用技术,因此它并不是最理想的 代码重用机制.换句话说,如果不继承整个类的所有方法和数据成员,我们无法 重用该类里面的单个方法.继承总是带来一些多余的方法和数据成员,它们总是 使得重用类里面某个方法的代码复杂化.另外,派生类对父类的依赖关系也使得 代码进一步复杂化:对父类的改动可能影响子类;修改父类或者子类中的任意一 个类时,我们很难记得哪一个方法被子类覆盖.哪一个方法没有被子类覆盖;最 后,子类中的覆盖方法是否要调用父类中的对应方法

prototype教程:使用JS接受URL参数的代码

初学prototype,发个JS接受URL参数的代码以下是HTML网页特效代码,点击运行按钮可查看效果: [Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]

MVC 设计模式带来更好的软件结构和代码重用

设计 模型-视图-控制器(MVC)是Xerox PARC在八十年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已被广泛使用.最近几年被推荐为Sun公司J2EE平台的设计模式,并且受到越来越多的使用 ColdFusion 和 PHP 的开发者的欢迎.模型-视图-控制器模式是一个有用的工具箱,它有很多好处,但也有一些缺点. MVC如何工作 MVC是一个设计模式,它强制性的使应用程序的输入.处理和输出分开.使用MVC应用程序被分成三个核心部件:模型.视图.控制器.它们各自处理自己的任

关于asp.net的代码重用

asp.net 在asp.net中我们通过添加组件类来实现代码重用在asp.net项目文件中添加组件类假如为conn.vb打开这个文件,这个文件是public class connend class这样我们有两种方式来进行代码重用一种方式为直接在class中写代码,一种为在外面定义一个namespaces如下(1)Public Class conn        Inherits System.ComponentModel.Component        Dim connstring As S

使用Attribute+Reflection来提高代码重用

这篇文章两个目的,一是开阔设计的思路,二是实例代码可以拿来就用. 设计的思路来源于<Effective c#>第一版Item 24: 优先使用声明式编程而不是命令式编程.特别 的地方是,希望提供多个属性的默认排序,而不仅仅只根据一个属性,另外一点是,优先调用对象属性 实现了的IComparable<T>接口,如果没有实现接口,才调用IComparable进行比较.排序类实现 泛型,得到类型安全. 总的思路:Attribute用来装饰我们想要获取元数据的类,使用Reflection来

持久化模式,第 2 部分: 提高代码重用和改进性能

简介 本系列包含两篇文章,第 1 部分 讨论了 Hibernate 和其他对象-关系映射(ORM)工具的几个基本最佳实践.通过使用通用基领域类 和接口.集中的审计和泛型数据访问对象(泛型 DAO),应用程序可以建立更紧凑且可维护的领域模型和持久化层. 通过应用 第 1 部分 中的概念,可以提供新的代码重用机会.在这个部分中,我们首先讨论如何使用 Hibernate 和多态性在领域模型 中集成行为.接下来,继续 第 1 部分 对泛型 DAO 的讨论.在应用程序中集成和使用泛型 DAO 之后,您可能

“前.NET Core时代”如何实现跨平台代码重用 ——程序集重用

除了在源代码层面实现共享("前.NET Core时代"如何实现跨平台代码重用 --源文件重用)之外,我们还可以跨平台共享同一个程序集,这种独立于具体平台的"中性"程序集通过创建一种名为"可移植类库(PCL: Portable Class Library)"项目来实现.为了让读者朋友们对PCL的实现机制具有充分的认识,我们先来讨论一个被我称为"程序集动态绑定"的话题. 目录 一.何谓程序集动态绑定? 二.程序集一致性 三.程序集

轮播图-如果一个页面有多个轮播,代码重用怎么考虑?

问题描述 如果一个页面有多个轮播,代码重用怎么考虑? 如题!!用的是swiper这个插件 各路大神求解脱啊 还有弱弱问一下 是不是一个页面多个轮播图很怪?? 解决方案 把轮播的代码封装成JS组件的方式. 解决方案二: 这有什么奇怪的,很多新闻和门户网站就有很多组轮播 解决方案三: 做成类的形式,new 实例出来,不用用过程式编程,这个不好控制作用域

【C/C++学院】0822-类型转换函数与构造转换函数/类的继承/类的继承以及区别/继承静态成员与静态函数//继承实现代码重用/单继承QT案例/多继承简介以及实战/Gpu编程

类型转换函数与构造转换函数 #include<iostream> class fushu { public: explicit fushu(int num)//避免隐式转换,引发歧义 { x = num; y = num; } void print() { std::cout << x << "+" << y << "i" << std::endl; } operator int(); //不支