2016-11-25 62 views
3

我使用下面的代碼通過點擊系統關閉按鈕以關閉MDI子窗體關閉MDI子,並能正常工作:如何通過不使用該系統關閉按鈕

procedure Tfrm_main.FormClose(Sender: TObject; 
    var Action: TCloseAction); 
begin 
    Action := caFree; 
end; 

但如何如果我想通過使用標準按鈕(在子窗體本身內)關閉MDI子窗體。如果我在事件處理程序中調用Close,則會出現訪問衝突異常。

是否有任何方法通過使用放置在子窗體本身內的標準按鈕(而不是系統關閉按鈕)關閉MDI子窗體,而不引發訪問衝突異常?

我已經完成了搜索類似的問題,並嘗試了各種代碼,但仍然得到了例外。

回答

5

在子MDI上調用Close()從按鈕內部形式OnClick同一孩子的事件形式是完全安全。在內部,Close()觸發OnClose事件,如果Action參數設置爲caFree,則表將調用Release()本身,這是一個行動遲緩這將釋放從內存表單時,它是安全的這樣做

下面的代碼工作完全正常,我在Delphi 7:

unit ChildUnit; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls; 

type 
    TChildForm = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    procedure FormClose(Sender: TObject; var Action: TCloseAction); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    ChildForm: TChildForm; 

implementation 

{$R *.dfm} 

procedure TChildForm.Button1Click(Sender: TObject); 
begin 
    Close; 
end; 

procedure TChildForm.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
    Action := caFree; 
end; 

end. 

如果您呼叫Close()當得到一個訪問衝突,最可能的罪魁禍首是你在一個無效表指針調用Close()

+0

我在onclick上使用以下代碼: 'code procedure Tfrm_input.SpeedButton1Click(Sender:TObject); begin frm_input.Close(); 結束; ' 它給了我一個例外。 –

+0

試試'Self.Close',或者簡單的就是'Close'。 –

+0

@AlianaDonovan顯然你的'frm_input'變量沒有指向一個有效的Form對象,這將佔AV。 –

相關問題