FireMonkey Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
FireMonkey 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

FireMonkey 팁&트릭
[11] Delphi XE5 - ShowModal 사용하기 그리고 문제점
이현철 [pirboria] 2419 읽음    2014-01-28 15:26
출처(블로그) : http://bluexmas.tistory.com/363


출처 : 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 처럼 정지(?) 되지 않습니다.

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

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



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

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



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



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

- end -

+ -

관련 글 리스트
11 Delphi XE5 - ShowModal 사용하기 그리고 문제점 이현철 2419 2014/01/28
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.