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

  • 相关阅读:
    【python cookbook】【数据结构与算法】12.找出序列中出现次数最多的元素
    [转]ASP.NET MVC 5
    [转]ASP.NET MVC 5 学习教程:快速入门
    Using XSLT and Open XML to Create a Word 2007 Document
    如何在VS2010中更好的编写JavaScript代码
    [转]这五种方法前四种方法只支持IE浏览器,最后一个方法支持当前主流的浏览器(火狐,IE,Chrome,Opera,Safari)
    [转]C# 超高速高性能写日志 代码开源
    windows 2003 发布遇到问题---分析器错误消息: 未能加载类型“YWPT.MvcApplication”。
    将Oracle数据库转换为SQL Server
    SQLServer2008导出表数据为SQL脚本
  • 原文地址:https://www.cnblogs.com/Little-Star/p/7366949.html
Copyright © 2011-2022 走看看