Delphi 共享事件处理程序如何知道哪个控件';s事件it';这是怎么处理的?

Delphi 共享事件处理程序如何知道哪个控件';s事件it';这是怎么处理的?,delphi,object,event-handling,Delphi,Object,Event Handling,我想编写一些代码,将相同的事件处理程序分配给几个不同的按钮。是否有一种方法可以实现它,而不必按名称引用每个按钮,而是使用诸如self或sender之类的通用工具来引用按钮?是的。每个普通方法调用都包含一个指向对象的隐藏“Self”。但在事件处理程序中,“Self”是表单,而不是按钮。该按钮是Sender,您必须使用类似于Sender as t按钮的方式键入它,您需要使用Sender (Sender as TButton).Enabled := False; 将禁用将此事件处理程序分配给其onc

我想编写一些代码,将相同的事件处理程序分配给几个不同的按钮。是否有一种方法可以实现它,而不必按名称引用每个按钮,而是使用诸如self或sender之类的通用工具来引用按钮?

是的。每个普通方法调用都包含一个指向对象的隐藏“Self”。但在事件处理程序中,“Self”是表单,而不是按钮。该按钮是Sender,您必须使用类似于
Sender as t按钮的方式键入它,您需要使用Sender

(Sender as TButton).Enabled := False;
将禁用将此事件处理程序分配给其onclick事件的任何按钮。演员阵容也可以完成

TButton(Sender).Enabled := False;

但在这种情况下,你需要100%的确认发送者是一个按钮。使用as会在强制转换之前引入一个检查,所以速度稍慢,但在这种类型的示例中,我认为这并不是一个真正的问题。

您可以这样做:

procedure OnClickButton(Sender: TObject);
var btn: TButton;
begin
  if Sender is TButton then btn := TButton(mycontrol) 
  else
      exit;
  //and then use btn as just another button control
end;
要将同一事件分配给不同的控件,可以执行以下操作:

if mycontrol is TButton then 
  TButton(mycontrol).OnClick := OnClickButton;

考虑将自己与按钮“断开”,并采取行动。在表单上链接一个操作列表,右键单击它并“添加”和“操作”。命名它,给它加上标题(比如说,就好像它是一个按钮),然后将它的OnExecute事件连接到您的代码中。最后,转到您的按钮,单击“操作”属性并指定您的新操作。当您单击该按钮时,您的代码将被执行

这为什么有用?好: 1.您将不会失去对代码的访问权限,这通常发生在您删除按钮并将其替换为(例如)TPopupMenu时。 2.一个动作可以通过多个位置、多个按钮或菜单启动。 3.更好的做法是,在操作的“OnUpdate”事件中填入如下内容:

procedure TForm1.MyActionOnUpdate( ASender : TObject );
begin
  With Sender as TAction do
    Enabled := ItsPossibleToRunMyCode;
end;

这段代码将启用和禁用任何使用此操作的控件,而您无需执行任何操作。

这不是一种转换吗?它做的更多的是重建记忆。As是强制转换,不是转换,但它会检查以确保类型正确,否则会引发异常。As-casting基本上会将链接列表从对象的实际类型移动到要强制转换的类型,以查找匹配项。如果您在一个紧密的循环中执行此操作,“as type”是比实际类型高出几个级别的继承,那么它可能会对性能产生一定的影响,但除此之外,您可能永远不会注意到它。