(sender as TButton).some 和 TButton(sender).some 的区别是什么?
(sender as TButton).some 和 TButton(sender).some 的区别是什么?
(Sender as TButton) 与 TButton(Sender) 都是 Typecasting,只是语法不同
罢了, 因此, 写成 (Sender as TButton).Caption := 'Test';或者
TButton(Sender).Caption := 'Test';
结果都一样
针对个别物件个别事件写事件处理程序, 并不需判定 Sender为何, 因为很明
显的 Sender便是这个正在撰写的物件, 但是在多个物件共用一个事件处理程序的情况下,Sender 是谁(谁发生OnClick事件)的判断就有其必要性
if Sender = Button1 的写法是直接判定Sender是不是 Button1这个物件, 但是如果按钮有 64 个, 写 64 个 if叙述恐怕会累死人的...
因此, 以类别的判定取代个别物件的副本(instance)的判定, 应是比较简明的
作法, 於是, 我们可以写成 Sender is TButton, 为真时, 以上述型别转换的方式 --- TButton(Sender).XXXX 撰写, 就可以大辐简化程式,
毕竟,同属 TButton 的物件, 都有相同的属性(属性值不一定相同), 不是吗?
值得注意的是, Sender is (Class Name) 的 Class Name 判断是会牵涉到父阶的继承关系的, 例如: Button1 是Button,Button2是 TBitBtn, 这样的话:Button1 is TButton 为真, Button2 is TButton 也是真, 因为TBitBtn 继承自TButton, 也就是说, 球是球, 篮球也是球. 应用这个观念, 下列的程式:
if ActiveControl is TDBEdit then
(ActiveControl as TDBEdit).CutToClipboard
else
if ActiveControl is TDBMemo then
(ActiveControl as TDBMemo).CutToClipboard;
如果改成:
if ActiveControl is TCustomMemo then
TCustomMemo(ActiveControl).CutToClipboard;
程序的执行效率就更好了, 因为 TDbEdit 与 TDbMemo 的共同父阶是
TCustomMemo, 而 TCustomMemo
也有 CutToClipboard 方法
有没有试一下我的例子,就知道了。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TA = class
public
procedure Test;
end;
TB = class(TA)
public
procedure Test;
procedure Test1;
procedure Test2;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TA.Test;
begin
Showmessage('Call TA.test');
end;
procedure TB.Test;
begin
Showmessage('Call TB.test');
end;
procedure TB.Test1;
begin
(self as TA).test;
end;
procedure TB.Test2;
begin
TA(self).test;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
with TB.Createdo
begin
test1;
free;
end;
{
with TB.Createdo
begin
test2;
free;
end;
}
end;
end.
www:
如果sender 与 TButton 没有关系,编译照样不通过。
(sender as TButton).some 和 TButton(sender).some 的区别是什么?的更多相关文章
- checkBox1_CheckedChanged(object sender, EventArgs e)和checkBox1_CheckStateChanged(object sender, EventArgs e)不同
using System; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms ...
- 关于 Delphi 中的Sender和易混淆的概念(转)
/////////////////////////////////////////////////////// Delphi 中Sender对象的定义///////////////////////// ...
- OnClick事件的Sender参数的前世今生——TWinControl.WinProc优先捕捉到鼠标消息,然后使用IsControlMouseMsg函数进行消息转发给图形子控件(意外发现OnClick是由WM_LBUTTONUP触发的)
这是一个再普通不过的Button1Click执行体: procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage('I am B ...
- Delphi中的Sender:TObject对象解析
Delphi中的Sender:TObject对象解析 procedure TForm1.Button1Click(Sender: TObject); begin end; 解析:Procedure是过 ...
- Delphi中Sender对象的知识
Sender是一个TObject类型的参数,它告诉Delphi哪个控件接收这个事件并调用相应的处理过程.你可以编写一个单一的事件处理句柄,通过Sender参数和IF…THEN…语句或者CASE语句配合 ...
- Delphi中的Sender:TObject对象解析转载
https://blog.csdn.net/jl_tiny/article/details/24376661 Delphi中的Sender:TObject对象解析 procedure TForm1.B ...
- 传智播客--WPF基础视频学习--sender解释(小白内容)
sender是激发该事件的对象,如果用在Button的双击点击事件上的话,就是只当前点击的对象 用例子来说明一下,有两个Button控件,分别为1和2,同时绑定一个Button_Click事件 pri ...
- 关于(object sender, EventArgs e)
sender是事件源 就是指发起这个事件的对象(控件)//表示触发事件的那个控件比如说你按下按钮,那么sender就是按钮 又如:textboxchange,sender就是该textbox,在事 ...
- .net控件事件中的Sender
private void button2_Click(object sender, RoutedEventArgs e) { } 最近看WPF内容,回顾下.net大家天天都在用,却不是十分关注的一个对 ...
随机推荐
- MySQL高级第二章——索引优化分析
一.SQL性能下降原因 1.等待时间长?执行时间长? 可能原因: 查询语句写的不行 索引失效(单值索引.复合索引) CREATE INDEX index_user_name ON user(name) ...
- Tomcat7 调优及 JVM 参数优化
Tomcat 的缺省配置是不能稳定长期运行的,也就是不适合生产环境,它会死机,让你不断重新启动,甚至在午夜时分唤醒你.对于操作系统优化来说,是尽可能的增大可使用的内存容量.提高CPU 的频率,保证 ...
- C# 程序关闭托盘图标不会自动消失
c#程序关闭托盘图标不会自动消失,进程的托盘图标却不能随着进程的结束而自动消失 必须将鼠标移到图标上面时才能消失? 请问如何才能做到图标随着进程的结束而自动消失呢(外部强行结束,如在任务管理器将其 ...
- 第二篇 CSS快速入门
学CSS 和 JS的路线: 1. 首先,学会怎么找到标签.只有找到标签,才能操作标签——CSS通过选择器去找标签 2. 其次,学会怎么操作标签对象. CSS概述 CSS是Cascading Style ...
- SpringMVC+mybatis+maven+Ehcache缓存实现
所谓缓存,就是将程序或系统经常要调用的对象存在内存中,以便其使用时可以快速调用,不必再去创建新的重复的实例.这样做可以减少系统开销,提高系统效率. 缓存主要可分为二大类: 一.通过文件缓存,顾名思义文 ...
- C if 判断 else 否则
#include <stdio.h> int main(int argc, char **argv) { //新建三个变量进行比较 int a,b,c; //输入三个变量的值scanf(& ...
- lintcode101 删除排序数组中的重复数字 II
删除排序数组中的重复数字 II 跟进“删除重复数字”: 如果可以允许出现两次重复将如何处理? 在:lintcode100删除排序数组中的重复数字 的基础上进行改进. class Solution ...
- solidity 智能合约操作
合约编译 #!/usr/bin/env python # coding: utf8 import json import os # Solc Compiler from functools impor ...
- pxe+kickstart无人值守安装
常用软件安装及使用目录 第1章 以前是怎么安装系统的 l 光盘(ISO文件,光盘的镜像文件)===>每一台物理机都得给一个光驱,如果用外置光驱的话,是不是每台机器都需要插一下 l U盘:ISO镜 ...
- 150命令之线上查询及帮助命令 man hellp
150命令之线上查询及帮助命令 man 查询命令的帮助 man + 命令 NAME ls - list directory contents 命令+命令简单说明 SYNOPSIS ...