2011-07-12 25 views
2

我以前能夠做到這一點使用普通德爾福按鈕:如何在框架上的按鈕上的點擊事件中完全釋放框架?

在第一幀我有(簡體)

procedure FirstFrame.ButtonClick(Sender: TObject) 
Begin 
    if TButton(Sender).ModalResult = mrOK then 
    ChildFrame.DoOKStuff 
    else 
    ChildFrame.DoCancelStuff; 
    ChildFrame.Free; 
end; 

procedure FirstFrame.ShowFranme; 
begin 
    ChildFrame := TFrameWithButtons.Create(Owner); 
    ChildFrame.Parent := self; 
    ChildFrame.OKButton.OnClick := ButtonClick; 
    ChildFrame.CancelButton.OnClick := ButtonClick; 
    ChildFrame.Visible := True; 
end; 

在Childframe我什麼都不做處理按鈕點擊...按鈕單擊已設置爲將控件返回到第一幀。

對於某些第三方按鈕,偶爾會導致AV。 我明白爲什麼 - 在第三方代碼處理的某個時候返回到現在釋放的幀或按鈕,但被叫代碼是在第一幀...令人討厭的是它只是99.99%的時間工作:)

那裏沒有幀的發佈過程。

所以我的問題是什麼是正確的方式來處理這種情況?

同時使用了Delphi 6和Delphi 2009

+1

如何在你的框架reprocucing TCutsomForm.Release行爲? –

+0

假設'ChildFrame'是'FirstFrame'的一個字段,你應該調用'FreeAndNil(ChildFrame)'而不是'ChildFrame.Free'。它可能會在......之後的0%時間內產生副作用,但即使它現在有99%的時間工作,但它可能並不總是給出正確的結果。 –

+0

道歉的答案海報 - 我還沒有回到這個由於其他壓力 - 但它看起來像CMRelease :) – Despatcher

回答

4

試試這個:

type 
    TFrameWithButtons = class(TFrame) 
    ... 
    procedure CMRelease(var Message: TMessage); message CM_RELEASE; 
    ... 
    end; 

procedure TFrameWithButtons.CMRelease(var Message: TMessage); 
begin 
    Free; 
end; 

procedure FirstFrame.ButtonClick(Sender: TObject) 
Begin 
    if TButton(Sender).ModalResult = mrOK then 
    ChildFrame.DoOKStuff 
    else 
    ChildFrame.DoCancelStuff; 
    PostMessage(ChildFrame.Handle, CM_RELEASE, 0, 0); 
end; 
+0

我知道2年! – Despatcher

4

看看TCustomForm.Release是如何實現的。這非常簡單:它向Windows消息隊列發送消息,處理時會導致表單自行釋放。這在你自己的代碼中不應該太難實現。

相關問題