TCustomForm 클래스에는 Form을 닫을때 쓰는 메소드로 Hide() 와 Close()라는게 있습니다.
문론 그밖에 다른방법도 있겠죠..
개인적으로 Close()를 많이 쓰는데..
Hide를 쓰는분도 가끔 있더군요..
이 두 함수의 차이점에 대해 살펴보겠습니다.
먼저 VCL소스를 보면 다음과 같습니다.
procedure TCustomForm.Hide;
begin
Visible := False;
end;
procedure TCustomForm.Close;
var
CloseAction: TCloseAction;
begin
if fsModal in FFormState then
ModalResult := mrCancel
else
if CloseQuery then
begin
if FormStyle = fsMDIChild then
if biMinimize in BorderIcons then
CloseAction := caMinimize else
CloseAction := caNone
else
CloseAction := caHide;
DoClose(CloseAction);
if CloseAction <> caNone then
if Application.MainForm = Self then Application.Terminate
else if CloseAction = caHide then Hide
else if CloseAction = caMinimize then WindowState := wsMinimized
else Release;
end;
end;
Hide는 그냥 Visible=false 코드밖에 없습니다.
그런데 Close함수는 소스가 좀 기네요
Normal Form이 Show되어있는 상태에서 Close하면
1. QueryQuery를 호출한후에 ..
2. OnClose이벤트 핸들러가 걸려있으면 호출하고..
3. OnClose이벤트 Action결과값이 따라 동작합니다.
OnClose이벤트 핸들러 함수가 걸려있지 않거나
OnClose이벤트에서 Action을 수정하지 않으면 Hide를 호출합니다.
Hide호출후에는 똑같겠죠
여기까지는 많이들 아는 사실이구
자 이제 Close와Hide함수의 잘 모르는 부분을 살펴 보겠습니다.
Form이 ShowModal일경우
위 TCustomForm.Close함수를 잘 보면
FormState가 Modal일경우 다르게 동작합니다.
즉 ShowModal일경우 Form의 CloseQuery나 OnClose이벤트가 뜨지 않는다는것이죠
그리고 ModalResult값을 Default로 mrCancel을 return해 줍니다.
Button을 ModalResult를 이용하지 않고 Coding으로 Close하면서 ModalResult를 주려면
바로밑에 팁에 썼듯이 주의해야합니다.
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=897
//다음과 같이 하면 안되고..
procedure TForm2.Button2Click(Sender: TObject);
begin
ModalRsult:=mrYes;
Close;
end;
//다음과 같이 Close를 호출한뒤에 ModalResult값을 설정해줘야 합니다.
procedure TForm2.Button2Click(Sender: TObject);
begin
Close;
ModalRsult:=mrYes;
end;
TCustomForm의 ShowModal함수의 코드를 보면
메세지루프에서 빠져나오는 조건이 ModalResult값이 0 이 아닌경우에 빠져나옵니다.
(메세지루프에서 빠져나온다는것은 Disable된 폼들을 모두 Enabled시킨다는 뜻이고 함수를 종료한다는 뜻..)
그런데 폼이 ShowModal인 상황에서 Hide()로 폼을 닫으면 어떻게 될까요?
ModalResult를 주지 않았기때문에..
Diable된 폼은 여전이 Disable된 상태이구..
Forground폼은 visible=false되어버린다.
이렇게 되면 마우스로 아무폼도 접근할수 없는 상황에 빠지게 된다.
그럼..