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


     https://blog.csdn.net/jl_tiny/article/details/24376661

    Delphi中的Sender:TObject对象解析

    procedure TForm1.Button1Click(Sender: TObject);

    begin

    end;

    解析:Procedure是过程,TForm是窗体类,加上数字就是某个窗体,像TForm1就是Form1窗体。

    Button1是你的按钮控件的名称,Button1Click就是按钮的单击事件,(Sender:Tobject)就是发送消息到对象,这里默认为本窗体。

    Sender的类型是Tobject,是Tobject的派生类。

    Delphi中Sender对象

    1.Sender的定义:

    每一个事件处理里面至少都有一个Sender参数。比如:

    procedure TForm1.Button1Click(Sender:TObject);

    begin

    ...

    end;

    Sender的含义就是代表调用TForm1.Button1Click这个过程的控件.

    由于Sender是TObject,所以任何object都可以赋给Sender.当你点击BUTTON1时,会产生一个Button1Click事件,系统会把Button1传递给Button1Click过程作为参数,也就是所说的Sender.

    2.Sender的用法:

    <1>.由于Sender代表了调用所在过程的控件,那么你就可以直接把它拿来当那个控件用,不过如果要用属性的话,最好写成(Sender as 控件名).控件属性:=... 例如:

    procedure TForm1.Edit1Click(Sender: TObject);

    begin

    with Sender as TEdit do

    begin

    text:=’hello’;

    end;

    end;

    再比如:

    Procedure   TForm1.Button1Click(Sender:TObject);

    begin

          if   Sender   is   TButton   then

                showmessage((Sender   as   TButton).Caption)

          else

                showmessage( '没有Sender ')

    end;

    如果你这样调用

    Procedure   TForm1.button2.click(sender:Tobject);

    begin

          Button1Click(nil);

    end;

    则返回 '没有Sender '

    而如果你这样调用

    Procedure   TForm1.button2.click(sender:Tobject);

    begin

          Button1Click(sender);

    end;

    则显示:button2

    <2>.如果在两个事件中处理同样的事情,那么可以利用Sender来省去重写同样的过程。例如:

    Procedure TForm1.Button1Click(Sender:TObject);

    begin

    do same sth.....;

    if Sender=Button1 then

    do sth....;

    if Sender=Button2 then

    do other sth....;

    end;

    procedure TForm1.Button2Click(Sender:TOBJect);

    begin

    Button1Click(Button2);

    end;

    3.Sender参数的两个用途

    Sender是一个TObject类型的参数,它告诉Delphi哪个控件接收这个事件并调用相应的处理过程。

    你可以编写一个单一的事件处理句柄,通过Sender参数和IF…THEN…语句或者CASE语句配合,来处理多个构件。

    发生事件的构件或控件的值已经赋给了Sender参数,该参数的第一个用途用途就在于:可以使用保留字IS来测试Sender,

    以便找到调用这个事件处理句柄的构件或控件的类型。

    例如,将表单中编辑框和标签的Click事件的处理句柄都指向表单的xxx过程,编辑框和标签对Click事件有不同的反应:

      procedure TForm1 xxx(Sender:TObject);

      begin

      if(sender is Tedit) then

      showmessage(′this is a editbox′);

      if(sender is Tlabel) then

      showmessage(′this is a label′);

      end;

    Sender参数的第二个用途是结合AS操作符进行类型转换,将若干个派生于某一父类的子类强制转换成该父类。

    例如表单中有一个TEdit类控件和一个TMemo控件,它们实际上都派生于TcustomEdit类,

    如果你要为二者的某一事件提供同样处理,可以将二者事件句柄都指向自定义的过程yyy:

      Procedure TForm1.yyy(Sender:TObject);

      begin

      (sender as TcustomEdit).text:=′This is some demo text′;

      end;

    在过程中,AS操作符将TEdit类和TMemo类均强制转换成TcustomEdit类,再对TcustomEdit类的属性赋值。注意这种转换必须符合Delphi中类的层次关系。

      

    总而言之,使用Sender参数可以通过单一过程段处理多类控件,真正体现了Delphi面向对象的重用性。

  • 相关阅读:
    HTML5画图板PhoneGap移植
    简易WCF负载均衡方案
    坑爹的“类型初始值设定项引发异常”
    关于for循环中变量定义的位置
    有道云笔记open api sdk for .net α版
    SL/WPF仿WIN8进度条
    HTML5做个画图板
    Google搜索命令“site:”运算符高级使用技巧:
    ubuntu系统托盘不显示ibus输入法图标(语言栏输入法)的解决方法:
    DOS中如何删除文件夹~
  • 原文地址:https://www.cnblogs.com/bjxsky/p/9777123.html
Copyright © 2020-2023  润新知