2009-07-10 28 views
4

我有一個TForm(TVehicleEditForm),裏面有3個相同的TFrames(TVehicleUnitFrame)。TFrame內的EventHandler?

想法是,幀的每個實例都通過幀內的eventhandler處理自己的事件。問題是沒有調用eventhandler

我試圖通過覆蓋Create方法來指定框架內的代碼eventhandler,但是在這種情況下也不調用處理程序。

但是,如果我從窗體外部指定eventhandler它工作正常。 喜歡分享:

fraVehicleUnitFrame1.cmdNewOwner.OnClick := fraVehicleUnitFrame1.cmdNewOwnerClick; 
fraVehicleUnitFrame2.cmdNewOwner.OnClick := fraVehicleUnitFrame2.cmdNewOwnerClick; 
fraVehicleUnitFrame3.cmdNewOwner.OnClick := fraVehicleUnitFrame3.cmdNewOwnerClick; 

這只是一個按鈕! 因爲我在框架內有很多組件,這將導致許多任務...... 相當醜陋的代碼,當這應該直接在對象檢查器中完成。

我正在使用D2007。任何想法的原因?

問候羅蘭

回答

11

它的工作原理,當你從代碼做到這一點,是要裝上指針的事件處理程序,無論之前是什麼在那裏的原因。

在設計時,我有兩個可能的地方來設置處理程序。假設我在Unit1中有Frame1,並將它放在MyUnit中的MyForm中,我將有機會在兩個地方設置事件處理程序。

在你的情況下,你想在框架本身(Unit1在我的例子中)設置事件處理程序,因爲它引用的代碼是在框架本身。如果你這樣做,它應該工作。如果您將事件處理程序設置爲使用它的地方(MyUnit),則將在那裏分配事件處理程序。

德爾福足夠聰明,仍然可以從您的框架調用事件處理程序,只要該事件處理程序分配了之前您在窗體中添加了一個。如果您先將其添加到窗體上,然後在框架上添加處理程序,則框架上的處理程序是而不是調用。 更糟糕的是,如果您刪除表單中的處理程序,它仍然不會調用窗體上的處理程序。

你需要做的是這樣的:

右鍵Clcik表單,選擇查看文本。向下滾動到框架。它應該是這樣的:

inline FrameX: fraVehicleUnitFrame1 

在其下方,尋找

inherited cmdNewOwner: TButton 

在那裏,你應該看到類似:

OnClick = FormOldClickHandler 

或許

OnClick = nil 

刪除此OnClick分配,查看爲再次形成並保存。一切都會好的。如果現在選擇按鈕(或任何cmdNewOwner),表單上的對象檢查器應該在該事件旁邊沒有任何顯示。

+0

感謝您的意見!我再次工作:) 非常感謝 – 2009-07-10 16:56:03