2012-04-06 51 views
2

我很難得到Delphi 2006將事件處理程序分配給獨立的TFrame上的組件。如何強制TFrame上的組件擁有自己的事件處理程序?

說我有一個框架TComboFrame,其中包含TCombo Combo1,我在我的主窗體上的幾個地方使用它。

當我把TComboFrame MyFrame1的實例拖到我的主要形式,我想一個 事件處理程序分配到組合,我通過點擊TCombo內 ,我已經在窗體上放置框MyFrame1做,然後雙擊對象檢查器「事件」選項卡中空的 OnChange字段。

通常情況下,創建一個新的處理程序與類似的名稱:

procedure TMainForm.MyFrame1Combo1Change(Sender: TObject); 

和事件處理程序名稱是從祖先TComboFrame(Combo1)成分的名稱和實例的名稱派生我已放置在我的表單(MyFrame1)上 - 即對於TComboFrame的實例唯一。然後我可以 爲我已經放在我的主要 表單上的框架的其他實例執行此操作,並且它們各自獲取它們自己的事件處理程序。

如果我想要爲該框架的所有實例啓動的事件處理程序,我會打開祖先框架並在那裏執行。

這是我對它應該如何工作的理解,但有些地方 出了問題。我的主要 形式框架的幾個實例,有的有自己的事件處理程序,以及一些有共同的事件處理程序,

procedure TDMainForm.ComboFrame1Combo1Change(Sender: TObject); 

沒有什麼我試圖打破這種幻像鏈接德爾福似乎與 這是由幾個框架共享的常見事件處理程序。

我該如何修復這個狀態,以及首先導致它的原因是什麼?

**更新1 **

我讀的答覆,有點實驗,我可以通過以下步驟修復有問題的組件後發現:

1)刪除所有的事件處理程序幀。
2)刪除框架,記住它的名稱。
3)複製另一個已知是確定的(即具有自己的「個人」事件名稱)。
4)粘貼一個代替你刪除的那個。
5)恢復原來的名字。
6)創建你的事件處理程序。

...至少,它對我至少工作一次...

**更新2 **

另一種方法來治癒它似乎是改寫事件處理程序的名稱,它創建當您在Object Inspector中的空事件字段中雙擊,用新的唯一名稱,然後再次雙擊該名稱。 Delphi然後創建一個具有唯一名稱的空處理程序。

回答

3

我將在框架編寫另一個事件,並設置它時,我想另一個OnChange事件,像這樣:

type 
    TFrame2 = class(TFrame) 
    ComboBox1: TComboBox; 
    procedure ComboBox1Change(Sender: TObject); 
    private 
    FMyChangeEvent: TNotifyEvent; 
    public 
    property MyChangeEvent: TNotifyEvent read FMyChangeEvent write FMyChangeEvent 
    end; 

implementation 

{$R *.dfm} 

procedure TFrame2.ComboBox1Change(Sender: TObject); 
begin 
    //Your default combo behavior here 
    if Assigned(FMyChangeEvent) then 
    FMyChangeEvent(Self); 
end; 

而且,我需要的東西添加到的OnChange行爲:

type 
    TForm1 = class(TForm) 
    MyLittleFrame: TFrame2; 
    private 
    procedure MyOwnCustomLittleOnChangeBehavior(Sender: TObject); 
    public 
    constructor Create(AOwner: TComponent); override; 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

constructor TForm1.Create(AOwner: TComponent); 
begin 
    inherited; 
    MyLittleFrame.MyChangeEvent := MyOwnCustomLittleOnChangeBehavior; 
end; 

procedure TForm1.MyOwnCustomLittleOnChangeBehavior(Sender: TObject); 
begin 
    ShowMessage('42'); 
end; 

我通常這樣做,因爲我不信任設置在DFM事件的德爾福的方式,它很容易只是刪除整個事件沒有注意到。在要打破Object Inspector中的鏈接,明確其OnClick事件處理程序分配的TCombo

1

只需一次點擊,並在事件然後雙擊生成一個新的事件處理程序。當然,如果生成的事件處理程序名稱已經存在,它將被重用,但至少Object Inspector將在生成事件時重新評估所有對象名稱。

當然,這不是一個非常面向對象的方法。法比奧建議的是更好的選擇。雖然我會建議聲明TFrame事件作爲published而不是public這樣你就可以在設計時像任何其他事件分配給它。

+0

我不喜歡發佈的事件或者,如果你需要將其刪除,你將得到的只是在運行時錯誤。所以如果可能的話,我想避免宣佈發佈的事件。如果它是您要共享的最終用戶組件,並希望他們在對象檢查器中設置事件,那就好了。 – 2012-04-06 01:26:25

+0

謝謝@Remy。仍然沒有骰子。我仍然獲得了處理基於祖先的名字命名,而不是單獨的組件,而隨後發生的該幀的所有其他事件,以及被「破壞」框架的所有其他實例。事件處理程序名稱在我的源代碼中並不存在。有關更多信息,請參閱OP的附錄。 – rossmcm 2012-04-06 03:08:02

1

我不能重新創建的Delphi6或Delphi 2009年這種行爲在我看來,有很多框架(和改變他們的名字添加和刪除可能)你已經上當/糊塗它使用默認鏈接Delphi的命名約定事件和框架結束了與以前相同的名稱。

因此,雙擊事件處理程序只會將您置於一個事件處理程序,其名稱與以前刪除的(或重命名的)框架創建的名稱相同(但刪除框架不會刪除舊的事件處理程序IYSWIM: )

因此,我的回答是,你得爛醉通過獲取幀的名字在懵懵懂懂&事件處理程序的名字!

相關問題