Delphi中的Sender:TObject对象解析转载
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对象解析转载的更多相关文章
- Delphi中的Sender:TObject对象解析
Delphi中的Sender:TObject对象解析 procedure TForm1.Button1Click(Sender: TObject); begin end; 解析:Procedure是过 ...
- Delphi处理事件函数中的Sender: TObject代表什么?
下面这个按钮点击事件中,Sender代表谁? procedure Tsomain.ToolButton1Click(Sender: TObject); 是代表事件的拥有者吗? procedure TF ...
- 关于 Delphi 中的Sender和易混淆的概念(转)
/////////////////////////////////////////////////////// Delphi 中Sender对象的定义///////////////////////// ...
- Delphi中比较两个对象是否一致及地址是否相同[转]
在delphi中,C#也是如此,对象的地址与对象变量(引用)的地址不是同一个概念.要加以区别. procedure TForm1.btn1Click(Sender: TObject); var ...
- 谈谈Delphi中的类和对象4---类是一种对数据和操作高度的封装机制 && 类是一种代码重用机制
五.类是一种对数据和操作高度的封装机制 1)数据封装 unit Unit2; interface type TEmployee = class; private FName: String; publ ...
- 谈谈Delphi中的类和对象1---介绍几个概念 && 对象是一个地地道道的指针
参考:http://blog.163.com/liang_liu99/blog/static/88415216200952123412180/ 以下的介绍主要针对的是Delphi的面向对象的知识,可能 ...
- 教程-Delphi中比较两个对象是否一致及地址是否相同
资料说明: 1.http://blog.csdn.net/diligentcatrich/article/details/7077294 说明: 实例代码: procedure TForm1.btn1 ...
- 谈谈Delphi中的类和对象3---抽象类和它的实例
四.抽象类和它的实例 Delphi中有一个类称为是抽象类,你不能天真的直接为它创建一个实例,如 var StrLst: TString; begin StrLst:= TString.Create; ...
- Delphi中methodaddress的汇编代码解析
class function TObject.MethodAddress(const Name: ShortString): Pointer;asm { -> EAX ...
随机推荐
- thinkphp wechat
该接口对应的文件为Com/Wechat.class.php, 主要用户接收微信推送过来的用户数据并自动回复. 注意:识别和分析用户发送的内容,并提供回复内容需要开发者更具实际情况自己实现,本接口值提供 ...
- centos coreseek
下载稳定版 coreseek wget http://www.coreseek.cn/uploads/csft/3.2/coreseek-3.2.14.tar.gz 解压 .tar.gz cd cor ...
- 第一个脚本 "Hello World!"
打开记事本就可以编辑脚本,REM就相当于注释,和脚本语言一样 REM Hello World GUI r DELAY STRING notepad ENTER DELAY STRING Hello W ...
- 炼数成金数据分析课程---10、python中如何画图
炼数成金数据分析课程---10.python中如何画图 一.总结 一句话总结: 主要matplotlib库,pandas中也可以画一些基础图 大纲+实例快速学习法 1.matplotlib的最简单画图 ...
- HIve分组查询返回每组的一条记录
select a.lng,a.lat from (select row_number() over ( partition by uid,grid_id) as rnum,weighted_centr ...
- Idea 导入项目不能运行
1.项目结构里面配置sdk,配置output输出目录 2.配置语言等级 配置src源文件目录 配置目录里面添加application,添加main class
- 2 USB标准请求
2 USB标准设备请求的结构 2.1 标准请求 bmRequestType 的D6~D5为00的请求,USB协议定义了11个标准请求(bRequest),其名字与相应的bRequest的值如下表: 表 ...
- Gerrit(0): Install and Config
Install(Ubuntu 17.04): apt-get install default-jre daemon [nginx] #Other OS: install openjdk8-jre [n ...
- vue 路由传参中刷新页面参数丢失 及传参的几种方式?
在页面跳转中,我通过路由传参,结果发现页面参数丢失了.路径返回了根目录.... 1. 先说下路由传参的几种方式吧? 比如:<div v-for="item in items" ...
- python接口自动化(put请求)
python接口自动化(put请求) 一.put请求的作用:更新资源 二.应用 导包:import requests 调用requests.put()方法 参数有URL.data.headers,方法 ...