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

Delphi中的Sender:TObject对象解析转载的更多相关文章

  1. Delphi中的Sender:TObject对象解析

    Delphi中的Sender:TObject对象解析 procedure TForm1.Button1Click(Sender: TObject); begin end; 解析:Procedure是过 ...

  2. Delphi处理事件函数中的Sender: TObject代表什么?

    下面这个按钮点击事件中,Sender代表谁? procedure Tsomain.ToolButton1Click(Sender: TObject); 是代表事件的拥有者吗? procedure TF ...

  3. 关于 Delphi 中的Sender和易混淆的概念(转)

    /////////////////////////////////////////////////////// Delphi 中Sender对象的定义///////////////////////// ...

  4. Delphi中比较两个对象是否一致及地址是否相同[转]

    在delphi中,C#也是如此,对象的地址与对象变量(引用)的地址不是同一个概念.要加以区别. procedure TForm1.btn1Click(Sender: TObject); var    ...

  5. 谈谈Delphi中的类和对象4---类是一种对数据和操作高度的封装机制 && 类是一种代码重用机制

    五.类是一种对数据和操作高度的封装机制 1)数据封装 unit Unit2; interface type TEmployee = class; private FName: String; publ ...

  6. 谈谈Delphi中的类和对象1---介绍几个概念 && 对象是一个地地道道的指针

    参考:http://blog.163.com/liang_liu99/blog/static/88415216200952123412180/ 以下的介绍主要针对的是Delphi的面向对象的知识,可能 ...

  7. 教程-Delphi中比较两个对象是否一致及地址是否相同

    资料说明: 1.http://blog.csdn.net/diligentcatrich/article/details/7077294 说明: 实例代码: procedure TForm1.btn1 ...

  8. 谈谈Delphi中的类和对象3---抽象类和它的实例

    四.抽象类和它的实例 Delphi中有一个类称为是抽象类,你不能天真的直接为它创建一个实例,如 var StrLst: TString; begin StrLst:= TString.Create; ...

  9. Delphi中methodaddress的汇编代码解析

    class function TObject.MethodAddress(const Name: ShortString): Pointer;asm        { ->    EAX     ...

随机推荐

  1. 快速给一个表插入数据 用bulk_create()

  2. Flink Kafka Connector 与 Exactly Once 剖析

    Flink Kafka Connector 是 Flink 内置的 Kafka 连接器,它包含了从 Kafka Topic 读入数据的 Flink Kafka Consumer 以及向 Kafka T ...

  3. CSS3布局篇(多列布局)

    我们通过学习 CSS3,能够创建多个列来对文本进行布局 ,就像报纸那样排版那样! 可以参考详细说明:http://www.w3school.com.cn/css3/css3_multiple_colu ...

  4. sql 投影查询

    使用SELECT * FROM <表名> WHERE <条件>可以选出表中的若干条记录.我们注意到返回的二维表结构和原表是相同的,即结果集的所有列与原表的所有列都一一对应. 如 ...

  5. docker仓库管理(9)

    使用公共 Registry Docker Hub 是 Docker 公司维护的公共 Registry.用户可以将自己的镜像保存到 Docker Hub 免费的 repository 中.如果不希望别人 ...

  6. mysql注入篇

    博客这个东西真的很考验耐心,每写一篇笔记,都是在艰难的决定中施行的,毕竟谁都有懒惰的一面,就像这个,mysql注入篇,拖拖拖一直拖到现在才开始总结,因为这个实在是太多太杂了,细细的总结一篇太烧脑. 由 ...

  7. Bootstrap 避免模态框在用户点击背景空白处时,会自动关闭。

    问题: Bootstrap 模态框在用户点击背景空白处时,会自动关闭. 解决方法: 在HTML页面中编写模态框时,在div初始化时添加属性 aria-hidden=”true” data-backdr ...

  8. JEECG树(TreeGrid)字段的扩展

    转载:https://blog.csdn.net/huangzirong822/article/details/38400817 之前使用jeecg集成框架做过一个项目 这里说说框架中树(tree)字 ...

  9. centos7下搭建nfs服务

    现在有3台服务器 s1(主),s2(从), s3(从)需要实现文件实时同步,我们可以安装Nfs服务端和客户端来实现! 一.安装 NFS 服务器所需的软件包: yum install -y nfs-ut ...

  10. Python的一些列表方法

    1.append:方法append用于将一个对象附加到列表末尾,直接修改列表 lst=[1,2,3,4] lst.append(5) print(lst) 1,2,3,4,5 2.clear:方法cl ...