我想编写一些代码,将相同的事件处理程序分配给几个不同的按钮。有没有办法实现它而不是通过名称引用每个按钮,而是使用像self或sender这样的通用引用按钮?
答案 0 :(得分:3)
是。每个普通的方法调用都包含一个隐藏的“Self”,它引用了对象。但在事件处理程序中,“Self”是表单,而不是按钮。按钮是发件人,您必须使用类似Sender as TButton
的内容对其进行类型转换。
答案 1 :(得分:2)
您需要使用发件人。
(Sender as TButton).Enabled := False;
将禁用将此事件处理程序分配给其onclick事件的任何按钮。演员阵容也可以完成
TButton(Sender).Enabled := False;
但在这种情况下,您需要100%表示发件人是一个按钮。使用as在演员表之前引入了一个支票,所以稍微慢一点,但在这种类型的例子中我认为并不是真正的问题。
答案 2 :(得分:1)
您可以这样做:
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;
答案 3 :(得分:0)
考虑将自己与按钮“断开连接”并使用操作。 Plonk表单上的操作列表,右键单击它并“添加”和操作。为它命名,标题(就像它是一个按钮,然后说),然后将其OnExecute事件连接到您的代码。最后,转到按钮并单击“操作”属性并指定新操作。单击按钮时,代码将被执行。
为什么这有用?好: 1.您不会失去对代码的访问权限,这通常在您删除按钮并将其替换为TPopupMenu时发生。 2.可以从多个位置,多个按钮或菜单启动一个操作。 3.更好的是,用以下内容填写动作的'OnUpdate'事件:
procedure TForm1.MyActionOnUpdate( ASender : TObject );
begin
With Sender as TAction do
Enabled := ItsPossibleToRunMyCode;
end;
这段代码将启用和禁用任何使用此操作的控件,而无需您执行任何操作。