2016-11-25 3 views
3
I 시스템 닫기 버튼을 클릭하여 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()를 호출합니다.

다음 코드는 델파이 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' 변수가 AV를 설명하는 유효한 Form 객체를 가리키고 있지 않음을 명확히 알 수 있습니다. –