티스토리 뷰

728x90

출처 : Installing the Android Development Tools
Android Mobile Application Development
DELPHI XE4에서 FireMonkey Mobile용 컴포넌트 추가하기.

1. ShowModal 사용하기 그리고 문제점
ShowModal Dialogs in FireMonkey Mobile Apps

XE5에서 안드로이드의 경우 기존과 동일한 ShowModal를 지원하지 않는 것 같습니다.
안드로이드의 경우 모든 화면 제어가 쓰레드로 동작하기 때문에 기존의 ShowModal를 지원 못하는게 아닌가 싶습니다.

기존 코드

function GetConnectionInfo(AOwner: TComponent): TDBConnection;
var
  FConnect: TFConnect;
begin
  Result := nil;
  FConnect := TFConnect.Create(AOwner);
  try
    if FConnect.ShowModal = mrOk then
    begin
      Result := FConnect.ResultDBConnection;
    end;

  finally
    FConnect.Free;
  end;
end;

수정된 코드

var
  FConnect: TFConnect;           // 전역변수

function GetConnectionInfo(AOwner: TComponent; OnDBConnected : TNotifyEvent): TDBConnection;
var
  ConnectFormBase: TConnectFormBase;
begin
  Result := nil;
  try
    if Assigned(FConnect) then begin
      FConnect.Show;
    end else begin
      FConnect := TFConnect.Create(AOwner);
      FConnect.OnDBConnected := OnDBConnected;
      FConnect.ShowModal(procedure(ModalResult : TModalResult)
      begin
        if ModalResult = mrOk then begin
          FConnect.DoConnect();
          if Assigned(Self.OnDBConnected) then begin
            FConnect.OnDBConnected(FConnect.ResultDBConnection);
          end;
        end;
        if Assigned(FConnect) then
          FConnect.DisposeOf;
        FConnect := nil;

        frmMDIMain.Invalidate;
      end);
    end;
  except
    on e : Exception do
      ShowMessage(e.Message);
  end;
end;

지금 까지 찾아낸 문제점

1. ShowModal의 결과 값을 이벤트 형태로 받아 합니다.

FConnect.ShowModal(procedure(ModalResult : TModalResult)
begin
  f ModalResult = mrOk then begin
    // mrOk인 경우 처리
  end;

  // 화면 닫기
  frmMDIMain.DisposeOf;
end);

문제점1 : 변수 사용의 불편함 / In-Line으로 procedure를 구현하므로 전역으로 정의된 변수를 제외하고는 접근이 되지 않음

문제점2 : FormClose 호출 시점 

기존에는 if FConnect.ShowModal = mrOk then 이후 문장이 실행 되기 전에 FormClose가 호출 되었지만,
XE5 안드로이드의 경우 DisposeOf가 호출 시점에 FormClose가 호출 됩니다.

CallBack 이벤트 함수(OnDBConnected 함수)를 만들어서 처리했습니다.

2. 기존에 ShowModal 처럼 정지(?) 되지 않습니다.

문제점1ShowModal 이후 문장이 그대로 실행 됩니다.

ShowModal 이후 문장인 finally 가 바로 실행(FConnect.Free; 실행) 되어 화면이 나타났다가 빠르게 사라집니다.

문제점2 : 정지 되지 않기 때문에 ShowModal 호출하는 이벤트를 다시 호출하면 두개의 화면이 생성됩니다.

Form 변수인 FConnect 를 전역 변수로 선언하고, Assigned 유효 한지 체크하고, 종료시 FConnect := nil; 로 초기화 했습니다.

문제점3 : FireMonkey가 느려서 닫기 버튼을 두번 누르면, DisposeOf 가 두번 호출 되면서 FConnect가 닫혀지고, Main 화면까지도 닫아 지는 것 같은 문제가 있습니다. (버그로 의심됨)

문제점4 DisposeOf 가 호출되고 Main 화면이 나타나야 할 텐데, 화면이 그대로 남아 있어, Main 폼의 frmMDIMain.Invalidate; 를 호출해야 보여집니다. (버그로 의심됨)

- end -

댓글
300x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함