值得注意的是, 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;
Delphi引入Sender 主要是为了代码的复用性;看下面的例子
窗体上有两个Edit,Edit1,Edit2,使用sender,为了两个Edit实现字符大写的功能:
procedure UpCaseChar(Sender:TObject;Key:Char);
begin
if Sender is TEdit then//判定是否为TEdit 控件
begin
key:=UpCaseKey;
end;
end;
只要将Edit1,Edit2的OnKeyPress事件等于UpCaseChar就可以了,而不要为两个控件分别写,这个例子不是太好,这样说比较好,如果你要对一组同类形(或者是有相同父类的)
的组件进行相同的事件处理,使用Sender 可以减少工作量的!
Is 用来类型判定,是非常好的实时操作莩,As用于安全类型转换,而不是Txx(Y)这样的强制性转换!
在大多数组件的事件里面sender 代表,组件自己,但是也有一些将sender
指向其他的对象,关键看什么,Delphi 使用sender主要是为了使代码复用性好些!
如:
一个窗体上有两个Edit框Edit1,Edit2,你想实现输入的字符大写:
procedure UpCaseInput(Sender:TObject;var Key:char);
begin
if Sender is TEdit then
begin
Key:=UpCase(Key);
end;