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. 攻防世界 MISC篇

    Excaliflag 一张图片,winhex打开没什么发现,分值不高,应该属于常见的图片隐写题目.如果对于图片的格式有详细的了解,应该很容易就能够知道了属于最低有效位(LSB)隐写,下面是通过phot ...

  2. NOIp2018集训test-10-19 (bike day5)

    Bike老爷问了好几天到底要怎样简单的题目你们才能AK啊终于在他每天降难度直到要走了才出了一套我们能AK的题.虽然前几天的题换成llj肯定随便AK. 其实最近有点方虽然通常最后都写完了把该拿的分拿了该 ...

  3. NX二次开发-BlockUI对话框嵌套MFC对话框制作进度条

    半年前在一些QQ群看到有大神NX二次开发做出了进度条,那个时候我还不会弄,也不知道怎么弄得,后来断断续续得研究了一下,直到今天我把它做出来了.内心还是很喜悦的!回想自己这两年当初从没公司肯给我做NX二 ...

  4. ASP.NET Core学习——4

    静态文件 静态文件(static files),例如HTML.CSS.图片和JavaScript之类的资源会被ASP.NET Core应用直接提供给客户端. 静态文件通常位于web root(< ...

  5. share memory

    header for public argument:shmdata.h #define TEXT_SZ 2048 struct shared_use_st { int written; char t ...

  6. (16)centos7 日志文件

    常见日志文件 开机启动日志,只会记录本次信息 /var/log/boot.log 计划任务日志 /var/log/cron 开机内核检测信息 /var/log/dmesg 账号登录信息 /var/lo ...

  7. Ubuntu 没有 无线网 RTL8821ce 8111 8186

    1.将ubuntu的linux内核版本更改到4.14(其他版本不兼容这个无线网卡的驱动) 1.1 找到内核版本 #到 Ubuntu网站http://kernel.ubuntu.com/~kernel- ...

  8. 2017 ICPC Asia Urumqi A.coins (概率DP + 期望)

    题目链接:Coins Description Alice and Bob are playing a simple game. They line up a row of nn identical c ...

  9. (转载)理解和使用Promise.all和Promise.race

    声明:本文转载自:https://www.jianshu.com/p/7e60fc1be1b2 一.Pomise.all的使用 Promise.all可以将多个Promise实例包装成一个新的Prom ...

  10. csv 基本操作, 报错解决(UnicodeEncodeError: 'utf-8' codec can't encode characters in position 232-233: surrogates not allowed)

    最常用的一种方法,利用pandas包 import pandas as pd #任意的多组列表 a = [1,2,3] b = [4,5,6] #字典中的key值即为csv中列名 dataframe ...