我想写一些代码,将相同的事件处理程序分配给几个不同的按钮。有没有一种方法来实现它,而不是通过名字来引用每个按钮,而是通过使用像self或sender这样的通用类来引用按钮?共享事件处理程序如何知道它正在处理哪个控件的事件?
回答
是的。每个普通的方法调用都包含一个隐藏的“Self”,它指向对象。但在事件处理程序中,“Self”是表单,而不是按钮。该按钮是发件人,你必须使用类似Sender as TButton
的类型来对它进行类型转换。
您需要使用发件人。
(Sender as TButton).Enabled := False;
禁用将此事件处理程序分配给其onclick事件的任何按钮。演员也可以做
TButton(Sender).Enabled := False;
但在这种情况下,你需要100%该发件人是一个按钮。使用as作为在演员之前引入了一个检查,所以稍微慢一点,但是在这种类型的例子中我并不是真正的问题。
As-casting基本上将链接列表从对象的实际类型移动到要投射的类型,以查找匹配项。如果你在一个紧密的循环中执行它,并且“类型”是高于实际类型的多个继承级别,它可以给予一定的性能影响,但除此之外,您可能永远不会注意到它。 – 2009-12-12 13:54:47
你可以做这样的事情:
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;
的代码将启用和禁用使用没有你需要做什么这个动作的任何控制这一点。
- 1. 跨多个控件共享一个事件处理程序
- 2. 从共享控制处理事件MVC
- 3. WSO2 Identity Server - 事件处理程序 - 处理了哪些事件?
- 4. HTML事件处理程序与React事件处理程序
- 5. 如何知道一个事件有多少事件处理程序?
- 6. 用户控件事件处理程序
- 7. 在事件处理程序
- 8. 打开共享LostFocus事件处理程序的发件人
- 9. 在Java中处理事件:它是否需要空的事件处理程序
- 10. 的事件处理程序
- 11. 处理程序不处理事件
- 12. Reactive extensions处理事件处理程序
- 13. C#事件和事件处理程序
- 14. Onreadystatechange - 事件或事件处理程序?
- 15. Form OnClick事件处理程序 - 如何重叠其他事件处理程序?
- 16. 我如何知道Widget调用处理程序或事件?
- 17. C#事件处理 - 事件处理程序保留为空
- 18. 事件处理中事件处理程序乘以
- 19. GWT - 如何处理同一事件的多个处理程序
- 20. C#事件处理程序
- 21. MFC事件处理程序
- 22. MsftDiscFormat2Data事件处理程序
- 23. 事件处理程序
- 24. wpf事件处理程序
- 25. JavaScript事件处理程序
- 26. 事件处理程序TabbedPanel
- 27. DRYing事件处理程序
- 28. 事件处理程序
- 29. Elixir事件处理程序
- 30. Javascript事件处理程序
这不是一种转换吗?它更重要的是重新记忆记忆。 – 2009-12-12 12:29:52
http://tech.turbu-rpg.com/56/as-sertion-casting **由于**是一个强制转换,而不是转换,但它会检查以确保您的类型正确并引发异常除此以外。 – 2009-12-12 12:35:04