zoukankan      html  css  js  c++  java
  • (sender as TButton).some 和 TButton(sender).some 的区别是什么?

    (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 没有关系,编译照样不通过。

  • 相关阅读:
    个人理解的块状格式化上下文
    行框与浮动与清除浮动
    关于offset,scroll,position
    C++常用字符串操作和UTF-8和GBK之间的转换以及判定(转)
    MFC使用LoadBitmap方法加载位图文件失败解决方案(转)
    MFC在子线程中创建窗口(PostMessage方法)
    MFC线程间消息传递(转)
    MFC对话框常用操作文章收藏
    C++ 跨dll传递string类型参数执行出错问题
    C++ windows API函数末尾A和W的意义(转)
  • 原文地址:https://www.cnblogs.com/jijm123/p/9743669.html
Copyright © 2011-2022 走看看