(sender as TButton).some 和 TButton(sender).some 的区别是什么?

(Sender as TButton) 与 TButton(Sender) 都是 Typecasting,只是语法不同
罢了, 因此, 写成 (Sender as TButton).Caption := 'Test';或者 
TButton(Sender).Caption := 'Test';
结果都一样
针对个别物件个别事件写事件处理程序, 并不需判定 Sender为何, 因为很明
显的 Sender便是这个正在撰写的物件, 但是在多个物件共用一个事件处理程序的情况下,Sender 是谁(谁发生OnClick事件)的判断就有其必要性
if Sender = Button1 的写法是直接判定Sender是不是 Button1这个物件, 但是如果按钮有 64 个, 写 64 个 if叙述恐怕会累死人的...
因此, 以类别的判定取代个别物件的副本(instance)的判定, 应是比较简明的
作法, 於是, 我们可以写成 Sender is TButton, 为真时, 以上述型别转换的方式 --- TButton(Sender).XXXX 撰写, 就可以大辐简化程式,
毕竟,同属 TButton 的物件, 都有相同的属性(属性值不一定相同), 不是吗?
值得注意的是, Sender is (Class Name) 的 Class Name 判断是会牵涉到父阶的继承关系的, 例如: Button1 是Button,Button2是 TBitBtn, 这样的话:Button1 is TButton 为真, Button2 is TButton 也是真, 因为TBitBtn 继承自TButton, 也就是说, 球是球, 篮球也是球. 应用这个观念, 下列的程式:
if ActiveControl is TDBEdit then
(ActiveControl as TDBEdit).CutToClipboard
else
if ActiveControl is TDBMemo then
(ActiveControl as TDBMemo).CutToClipboard;
如果改成:
if ActiveControl is TCustomMemo then
TCustomMemo(ActiveControl).CutToClipboard;
程序的执行效率就更好了, 因为 TDbEdit 与 TDbMemo 的共同父阶是 
TCustomMemo, 而 TCustomMemo
也有 CutToClipboard 方法

有没有试一下我的例子,就知道了。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TA = class
public
procedure Test;
end;

TB = class(TA)
public
procedure Test;
procedure Test1;
procedure Test2;
end;

TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TA.Test;
begin
Showmessage('Call TA.test');
end;

procedure TB.Test;
begin
Showmessage('Call TB.test');
end;

procedure TB.Test1;
begin
(self as TA).test;
end;

procedure TB.Test2;
begin
TA(self).test;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin

with TB.Createdo
begin
test1;
free;
end;

{
with TB.Createdo
begin
test2;
free;
end;
}
end;

end.

www:
如果sender 与 TButton 没有关系,编译照样不通过。

(sender as TButton).some 和 TButton(sender).some 的区别是什么?的更多相关文章

  1. checkBox1_CheckedChanged(object sender, EventArgs e)和checkBox1_CheckStateChanged(object sender, EventArgs e)不同

    using System; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms ...

  2. 关于 Delphi 中的Sender和易混淆的概念(转)

    /////////////////////////////////////////////////////// Delphi 中Sender对象的定义///////////////////////// ...

  3. OnClick事件的Sender参数的前世今生——TWinControl.WinProc优先捕捉到鼠标消息,然后使用IsControlMouseMsg函数进行消息转发给图形子控件(意外发现OnClick是由WM_LBUTTONUP触发的)

    这是一个再普通不过的Button1Click执行体: procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage('I am B ...

  4. Delphi中的Sender:TObject对象解析

    Delphi中的Sender:TObject对象解析 procedure TForm1.Button1Click(Sender: TObject); begin end; 解析:Procedure是过 ...

  5. Delphi中Sender对象的知识

    Sender是一个TObject类型的参数,它告诉Delphi哪个控件接收这个事件并调用相应的处理过程.你可以编写一个单一的事件处理句柄,通过Sender参数和IF…THEN…语句或者CASE语句配合 ...

  6. Delphi中的Sender:TObject对象解析转载

    https://blog.csdn.net/jl_tiny/article/details/24376661 Delphi中的Sender:TObject对象解析 procedure TForm1.B ...

  7. 传智播客--WPF基础视频学习--sender解释(小白内容)

    sender是激发该事件的对象,如果用在Button的双击点击事件上的话,就是只当前点击的对象 用例子来说明一下,有两个Button控件,分别为1和2,同时绑定一个Button_Click事件 pri ...

  8. 关于(object sender, EventArgs e)

      sender是事件源 就是指发起这个事件的对象(控件)//表示触发事件的那个控件比如说你按下按钮,那么sender就是按钮 又如:textboxchange,sender就是该textbox,在事 ...

  9. .net控件事件中的Sender

    private void button2_Click(object sender, RoutedEventArgs e) { } 最近看WPF内容,回顾下.net大家天天都在用,却不是十分关注的一个对 ...

随机推荐

  1. UNIX故障--sun m4000服务器故障硬盘更换案例

    一.故障诊断 查看messages日志c0d0t0这块盘不断报错,类型为:retryable,如下: root@gdhx # more /var/adm/messages Aug  5 16:43:0 ...

  2. WPF 应用程序资源、内容和数据文件

    MSDN相关介绍: http://msdn.microsoft.com/zh-cn/library/aa970494(v=vs.100).aspx 内容文件(Content Files)内容文件简单的 ...

  3. 怎么判断ThreadPool线程池里的任务都执行完毕

    在下面 链接中做方便的应该是第三种方法(他也推荐了),但是第三种方法有个小问题,就是 : WaitHandle.WaitAll(_ManualEvents); 中的_ManualEvents最大为64 ...

  4. 一个CookieContainer的拓展类

    最近项目中需要频繁用到服务器返回的Cookie,由于项目采用的是HttpClient,并且用CookieContainer自动托管Cookie,在获取Cookie的时候不太方便.所以就写了个拓展类. ...

  5. C#中Mutex的用法

    C#中Mutex是互斥锁,位于System.Threading 命名空间中. 顾名思义,它是一个互斥的对象,同一时间只有一个线程可以拥有它,该类还可用于进程间同步的同步基元. 如果当前有一个线程拥有它 ...

  6. 11gR2RAC更换CRS磁盘组文档

    磁盘(pv)准备     在生产环境中,提前从存储上划分一些磁盘挂载到RAC系统的两个节点上(node1,node2).     新增加磁盘组为(hdisk14--hdisk24) 1.1磁盘使用规划 ...

  7. 关联分析FPGrowth算法在JavaWeb项目中的应用

    关联分析(关联挖掘)是指在交易数据.关系数据或其他信息载体中,查找存在于项目集合或对象集合之间的频繁模式.关联.相关性或因果结构.关联分析的一个典型例子是购物篮分析.通过发现顾客放入购物篮中不同商品之 ...

  8. 三分钟小课堂-----------------docker(三)增删改查命令

    主要为docker容器的增删改查命令 1  创建容器: docker run   -it   --name 别名  image_name   /bin/bash --name 别名 -d 后台 -t ...

  9. C 数据类型 常量 变量

    一 数据类型 1. 什么是数据 生活中时时刻刻都在跟数据打交道 比如体重数据 血压数据 股价数据等 在我们使用计算机的过程中 会接触到各种各样的数据 有文档数据 图片数据 视频数据 还有聊QQ时产生的 ...

  10. 初学Direct X(8) ——碰撞检测

    初学Direct X(8) --碰撞检测 真正让一个游戏鹤立鸡群的是程序对碰撞的响应有多好,这里介绍两种检测的方法: 1) 基于边框的碰撞检测 2) 基于距离的碰撞检测 1. 基于边框的碰撞检测 1. ...