我想寫一些代碼,將相同的事件處理程序分配給幾個不同的按鈕。有沒有一種方法來實現它,而不是通過名字來引用每個按鈕,而是通過使用像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