如何访问Sender参数正在引用的组件(激发事件的组件)的属性 [英] How to access a property of the component that the Sender parameter is referencing (the component that fired the event)

查看:0
本文介绍了如何访问Sender参数正在引用的组件(激发事件的组件)的属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是Delphi和Pascal的新手,我想知道是否有一种方法可以获取/访问发送者在过程中引用的组件的属性。

更具体地说,我想创建一个过程来更改标签的标题属性,该标签是发件人引用的组件。 我设想该过程如下所示:

procedure TForm1.LabelEdit(Sender: TObject);
begin
    Sender.caption := 'Sample Text';
end;

这当然行不通,但可以做类似或类似的事情吗?

推荐答案

尽管您问题中的示例实际上没有意义(它错误地建议TLabel具有OnEdit事件),但很可能使用Sender参数来获取有关发件人对象的信息。

创建一个新的VCL应用程序,并在窗体上放置一些TLabel控件。为他们提供不同的标题(如DogCatRabbitHorse等)。

现在在表单设计器中将它们全部选中,然后使用对象检查器为它们创建一个通用的OnClick处理程序。您可以将其命名为LabelClick(在OnClick旁边的编辑字段中写入LabelClick,然后按Enter)。

这将创建以下空方法:

procedure TForm1.LabelClick(Sender: TObject);
begin

end;
它有一个Sender参数,类型为TObject。现在,根据此方法的调用方式,Sender可以是任何TObject(按钮、窗体、位图等)或nil(根本没有对象)。

但在我们的示例中,我们预计此方法主要是在响应被单击的标签时调用的,在这些情况下,Sender将是相应的TLabel对象。

让我们尝试在消息框中显示所点击标签的标题!

我们尝试

procedure TForm1.LabelClick(Sender: TObject);
begin
  ShowMessage(Sender.Caption); // won't compile!
end;

但这甚至不能编译!问题是TObject没有公共Caption成员。但是TLabel需要,所以我们可以写

procedure TForm1.LabelClick(Sender: TObject);
begin
  ShowMessage(TLabel(Sender).Caption);
end;

这里我们告诉编译器,我们知道知道Sender将始终是TLabel,并且我们要求它假定它是。

但如果以某种方式使用非TLabelSender调用此方法,则此方法将崩溃或做其他坏事。因此,这样做更安全

procedure TForm1.LabelClick(Sender: TObject);
begin
  ShowMessage((Sender as TLabel).Caption);
end;
除了编译器现在将创建在运行时检查Sender是否真的是TLabel对象的代码之外,它的作用是相同的。如果不是,代码将引发异常。这比上面的不安全角色可能遇到的那种内存损坏/反病毒问题要好得多。

可以说更好的是

procedure TForm1.LabelClick(Sender: TObject);
begin
  if Sender is TLabel then
    ShowMessage(TLabel(Sender).Caption);
end;
这还将在运行时测试Sender的类型。如果是标签,则显示其标题。否则,我们选择什么都不做。注意,在这里使用SAFE(并且稍微慢一点)as强制转换是没有意义的。

这篇关于如何访问Sender参数正在引用的组件(激发事件的组件)的属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆