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中类的层次关系。 

  • 相关阅读:
    一键复制文本框内容代码、
    改掉这些坏习惯,你不再是菜鸟
    使用cookie保存页面登录信息
    二维数组转换成一维数组
    jQuery选择器总结
    cookie 和session 的区别详解
    PHP扫雷(转载)。
    PHP简易计算器方法2
    PHP简易计算器方法1
    业务逻辑的存储过程(添加学生的案例)(自动编号)
  • 原文地址:https://www.cnblogs.com/jijm123/p/10529523.html
Copyright © 2011-2022 走看看