2016-11-25 1 views
3
私はシステム閉じるボタンをクリックすることで、MDI子フォームを閉じるために以下のコードを使用しています

を使用しないことにより、MDI子を閉じ、それが正常に動作します:はどのようにシステム閉じるボタン

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

しかし、どのように標準ボタン(子フォーム自体の中にある)を使用してMDI子フォームを閉じたい場合イベントハンドラ内でCloseを呼び出すと、アクセス違反例外が発生します。

アクセス違反例外を発生させずに、子フォーム自体の内部に配置された標準ボタン(システム閉じるボタンではない)を使用してMDI子フォームを閉じる方法はありますか?

私は同様の質問を検索し、さまざまなコードを試しましたが、例外はあります。同じ子フォームのボタンOnClickイベント内から子MDIフォーム上Close()を呼び出す

答えて

5

完全に安全です。内部的には、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(); end; ' 私には例外があります。 –

+0

代わりに 'Self.Close'を試してみるか、' Close'だけを単純化してみてください。 –

+0

@AlianaDonovan 'frm_input'変数が、AVを説明する有効なFormオブジェクトを指していないことを明確に示しています。 –

関連する問題