2016-09-14 39 views
2

我正在尋找一種常見的方式來解除綁定所有事件處理程序,並在做出可能觸發它們的事情後重新綁定它們。如何使所有事件處理程序解除綁定並在做某事後重新綁定它們?

目前,我正在使用的具體解決方案如下所示:

var 
    PrevBeforePost : TDataSetNotifyEvent; 
    PrevAfterPost : TDataSetNotifyEvent; 
begin 
    PrevBeforePost := MyDataSet.BeforePost; 
    MyDataSet.BeforePost := nil; 
    PrevAfterPost := MyDataSet.AfterPost; 
    MyDataSet.AfterPost := nil; 

    try 
    //do something that would have triggered event handlers 
    finally 
    MyDataSet.BeforePost := PrevBeforePost; 
    MyDataSet.AfterPost := PrevAfterPost; 
    end; 
end; 

這種解決方案意味着我每一次,我需要即暫時禁用事件處理程序,即使我做寫具體的代碼測試... 此外,很容易陷入添加其他事件的陷阱中,而不記得在代碼中禁用它們。

有沒有辦法編寫一個通用的解決方案,對所有組件都以相同的方式工作? 例子:

var 
    Events : TInfosAboutEventHandlers; 
begin 
    Events := GetEventHandlersAndSetThemToNil(MyDataSet); 
    try 
    //do something that would have triggered event handlers 
    finally 
    SetEventHandlers(MyDataSet, Events); 
    end; 
end; 
+3

人們不禁要問,如果有可能是一個更好的解決問題的辦法....... –

+0

@DavidHeffernan:你是什麼意思? – ExDev

+2

我的意思是如果你可以解決你的問題,而不必擰緊事件處理程序。我的意思是找到一種方法來解決潛在的立場,而無需發現自己需要這樣做。另一方面,如果你只需要保存兩個事件處理程序,那麼這有多困難呢?如果你想要一些適用於所有可能組件的東西,那麼人們就會想到你爲什麼要編寫那些首先需要的代碼。 –

回答

3

爲什麼,而不是解除綁定他們不要你只是通過一個變量禁用它們?

定義在表單上「禁用」變量,並在每次想要避免事件時激活它。現在

type MyForm = class (TForm) 
    ... 
    private 
    EventsDisabled: boolean; 
    ... 
end; 

implementation 
... 
    EventsDisabled := True; 
    try 
    //do something that would have triggered event handlers 
    finally 
    EventsDisabled := False; 
    end; 

您的活動只需要檢查該變量是不是做任何事情之前活躍。

procedure TForm1.qryDataFieldNameOnChange(Sender: TObject); 
begin 
    if EventsDisabled then Exit; 
    //actions to do when the event is triggered 
end; 
相關問題