탐고루주의 끄적임

델파이 ModalResult값이 작동하지 않을 때

耽古樓主 2024. 8. 30. 04:20

Modal Form을 만들고 Botton 컴포넌트를 이용하지 않고  Coding으로  ModalResult값을 설정할 때,  분명히 ModalResult값을 mrOk 등으로 설정했는데 mrCancel이  나오는 경우가 있다.

아래와 같이 코딩하면 항상 ModalResult값이  mrCancel이 나온다.
분명 ModalResult값을 mrOk로 설정했는데 왜 그럴까?

ModalResult=mrOk;
Close();

그 이유는 TCustomForm의 Close함수에 있다.

아래 코드를 잘보면
Form이 Modal폼일경우 ModalResult값을 Default로 mrCancel을 주고있다.

procedure TCustomForm.Close;
var
  CloseAction: TCloseAction;
begin
  if fsModal in FFormState then   //여기서 Modal폼이면 modalresult값을 디폴트값으로 설정
    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;
 

결과적으로 Close를 나중에 호출하면 mrCancel이 ModalResult값으로 나온다는 것이다.
따라서 다음과 같이 간단히 순서만 바꿔주면 문제가 해결된다.

Close();
ModalResult=mrOk; // 반드시 Close후에  ModalResult값을 설정해준다.
 

별것 아닌데 가끔 깜박할때도 있고, 어디에 자세히 설명해주는곳도 없어 종종  실수하므로 적어 둔다.