zoukankan      html  css  js  c++  java
  • Delphi中的Sender:TObject对象解析

    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面向对象的重用性。

  • 相关阅读:
    heat模板
    Leetcode812.Largest Triangle Area最大三角形面积
    Leetcode812.Largest Triangle Area最大三角形面积
    Leetcode811.Subdomain Visit Count子域名访问计数
    Leetcode811.Subdomain Visit Count子域名访问计数
    Leetcode806.Number of Lines To Write String写字符串需要的行数
    Leetcode806.Number of Lines To Write String写字符串需要的行数
    Leetcode819.Most Common Word最常见的单词
    Leetcode819.Most Common Word最常见的单词
    Leetcode783.Minimum Distance Between BST Nodes二叉搜索树结点最小距离
  • 原文地址:https://www.cnblogs.com/Little-Star/p/7366949.html
Copyright © 2011-2022 走看看