파이어몽키에서 Message 대화상자 사용하기

이전 파이어몽키에서는  MessageDlg, ShowMessage, InputBox, InputQuery 등이 새로운 메소드로 많이 변경 되었습니다. Async 와 Sync 형태로 체계화 되었고 기존 함수들은 컴파일시 오류가 발생하지는 않으나 비정상으로 작동되었습니다. 아래의 주소를 참조하시면 자세한 내용을 보실 수 있습니다.

 

https://tech.devgear.co.kr/index.php?mid=delphi_news&search_keyword=messagedlg&search_target=title_content&document_srl=422020

 

델파이 10.3 에서는 Message 대화상자를 다음과 같이 구현하시면 사용 하실 수 있습니다.

(uses 절에 FMX.DialogService를 추가해야합니다.)

 

procedure TForm1.Button1Click(Sender: TObject);

begin

    TDialogService.MessageDialog(('test message'), system.UITypes.TMsgDlgType.mtConfirmation,

     [system.UITypes.TMsgDlgBtn.mbYes, system.UITypes.TMsgDlgBtn.mbNo], system.UITypes.TMsgDlgBtn.mbYes,0,     

    procedure (const AResult: System.UITypes.TModalResult)

     begin

         case AResult of

            mrYES: ShowmessagE('yes');

         end;

     end);

end;

Message 대화상자와 유사하게 폼 사용하기 

모바일 장치 또는 모바일 장치에서 실행되는 OS는 코드 차단을 허용하지 않으므로  MessageDlg에서 결과를 읽어 오는 전통적인 방식이 잘 동작하지 않는 경우가 있습니다. 이번에는 파이어몽키에서 MessageDlg의 동작이나 다른 모달 폼 형식으로 보이게 하는 방법 중 하나를 설명합니다.

 

l  따라하기

 

1. File > New Multi-Device Application으로 프로젝트를 시작합니다.

 

2. 대화 상자를 호출하는 버튼과 사용자의 선택 결과를 표시 할 수 있는 TEdit를 아래와 같이 내려놓습니다.

 

3. 프로젝트에 새로운 폼을 추가하고 이름을 frmDlg로 지정합니다.

 

MessageBox1.png

 

4. 아래와 같은 계층 구조로 컴포넌트들을 구성하도록 하겠습니다.

 

MessageBox2.png

 

  • 폼에 TLayout을 내려놓고  Name 속성을  LayoutDlg, Align 속성을 Client로 지정합니다.
  • 레이아웃위에 TRectangle을 놓고 다음과 같이 속성을 설정합니다.

속성

속성값

Name

recBackground

Align

Client

Fill.Color

Black

Opacity

0.5

Sides

4면을 모두 false로 지정

 

  •  layoutDlg에 다른 TRectangle을 놓고 다음과 같이 속성을 설정합니다.

속성

속성값

Name

recFront

Align

VertCenter

Margins.Left

30

Margins.Rigth

30

Sides

4면을 모두 false로 지정

XRadius

6

YRadius

6

 

  •    recFront TShadowEffect를 적용하고 Distance속성을 5, Softness 속성을 0.2로 설정합니다.
  •    recFront 속성 중 다음을 추가적으로 지정합니다.

속성

 

속성값

 

Fill.Kind

 

Gradient

 

Fill.Gradient 

 

Edit를 선택하여 BrushDesigner을 실행합니다.

BrushDesigner 하단에 있는 두 점의 왼쪽 점을 클릭합니다그림과 같이 RGB 값을 설정합니다. 오른쪽을 클릭하고 255 (모두)로 설정하면 흰색입니다.

 

MessageBox6.png

 

  • recFront TLabel을 내려놓고 다음과 같이 속성들을 지정합니다.

속성

 

속성값

 

Name

 

Top

 

Align

 

30

 

Margins.Top

 

10

 

Margins.Left

 

10

 

Margins.Rigth

 

10

 

TextSettings.HorzAlign

 

Center

 

TextSettings.WordWrap

 

True

 

Height

 

60

 

 

  • recFront 하위 TLayout을 내려놓고 Name 속성을 layoutBottom, Align 속성을 Bottom으로 설정합니다.
  • layoutBottom에 버튼 두 개를 내려놓고 각 각의 속성들을 지정합니다.

컴포넌트

속성

속성값

TButton

Name

btnOK

align

Left

Margins.left

5

Text

OK

TButton

Name

btnCancel

align

Right

Margins.Right

5

Text

Cancel

 

     아래와 같이 디자인 된 것을 확인 하실 수 있습니다.

 

MessageBox3.png

 

 5.  FormDlg 유니트에 호출 될 ShowDialog 루틴을 선언하고 구현하도록 하겠습니다.

 

[선언부분]

  public

    Procedure ShowDialog(aParent : TFMXObject; aText : string; 

    { Public declarations }

 

 

[구현부분]

procedure TFormDlg.ShowDialog(aParent : TFMXObject; aText : string);

begin

  //First we set the text in the label

 

  lblMessage.Text := aText;

 

  //Then we move the entire Layout to the form (well, any FMXObject)

 

  layoutDlg.Parent := aParent;

 

  //The following lines shouldnt be necessary

 

  //I have however had one occasion where they were

 

  //I havent been able to reproduce, but they wont hurt

 

  recBackground.BringToFront;

 

  recFront.BringToFront;

end;

 

6.  메인 폼에서 프로시저 호출 버튼의 OnClick 이벤트에서 ShowDialog를 호출하도록 구현합니다.

 

procedure TForm1.Button1Click(Sender: TObject);

begin

   FormDlg.ShowDialog(self, 'Press ok or cancel');

end;

 

 7.  대화 상자가 표시는 되지만 OK, Cancel  버튼에 대응하기 위해서 TFormDlg 유니트에 이벤트를 정의합니다.

      다음과 같이  TNotifyEvent 유형의 두 개의 속성을 추가 정의합니다.

     (속성이름,타입을 지정한 후 Ctrl +Shiht +C를 누르면 자동으로 아래와 같이 read/wirte 문이 생성됩니다.)

 

private

    property OnOkBtnClick : TNotifyEvent read FOnOkBtnClick write SetOnOkBtnClick;

    property OnCancelBtnClick : TNotifyEvent read FOnCancelBtnClick write SetOnCancelBtnClick;

end;

 

 8. 앞에서 작성한 ShowDialog 루틴 선언 부분과 구현 부분을 아래와 수정하도록 하겠습니다.

 

public

  Procedure ShowDialog(aParent :TFMXObject; aText :string; aOKClick,aCancelClick :TNotifyEvent);

end;
 

procedure TFormDlg.ShowDialog(aParent: TFMXObject; aText: string; aOKClick, aCancelClick : TNotifyEvent);

begin

  lblMessage.Text := aText;

 

  //Then we move the entire Layout to the form (well, any FMXObject)

  layoutDlg.Parent := aParent;

 

  //The following lines shouldnt be necessary

  //I have however had one occasion where they were

  //I havent been able to reproduce, but they wont hurt

 

  recBackground.BringToFront;

  recFront.BringToFront;

 

  self.FOnOkBtnClick := aOKClick;

  self.FOnCancelBtnClick := aCancelClick;

end;

 

 7.  OK, Cancel 버튼의  OnClick 이벤트핸들러를 다음과 같이 각 각 작성합니다.

 

procedure TFormDlg.btnCancelClick(Sender: TObject);

begin

  //Set the parent back to self

  self.layoutDlg.Parent := self;

 

  //If the event is assigned, call it

  if assigned(self.FOnCancelBtnClick) then

    self.FOnCancelBtnClick(self);

end;

 

procedure TFormDlg.btnOKClick(Sender: TObject);

begin

  self.layoutDlg.Parent := self;

 

  //If the event is assigned, call it

  if assigned(self.FOnOkBtnClick) then

    self.FOnOkBtnClick(self);

end;

 

8.  메인 화면에서 대화 상자를 호출하려면 TNotifyEvent와 일치하는 두 개의 프로 시저를 전달하기 위해

프로시저를 선언하고 구현합니다.

 

[선언]

  TForm1 = class(TForm)

    Button1: TButton;

    Edit1: TEdit;

    procedure Button1Click(Sender: TObject);

  private

    { Private declarations }

  public

    procedure DlgCancel(sender : TObject);

    procedure DlgOK(sender : TObject);

  end;

 

[구현

procedure TForm1.DlgCancel(sender: TObject);

begin

  Edit1.Text := 'Cancel was clicked';

end;

 

procedure TForm1.DlgOK(sender: TObject);

begin

  Edit1.Text := 'Ok was clicked';

end;

 

 

9.  메인 폼의 버튼 OnClick 이벤트 핸들러를 다음과 같이 수정합니다.

 

procedure TForm1.Button1Click(Sender: TObject);

begin

   formDlg.ShowDialog(self, 'Press ok or cancel', dlgOK, dlgCancel);

end;

 

10.  프로그램을 실행 해보면 다음과 같이 MessageDlg와 유사하게 표시됨을 확인 하실 수 있습니다.

 

MessageBox5.png

 

 

[샘플] Form_DialogFomat.zip

 

 

 

 

 

번호 제목 글쓴이 날짜 조회 수
공지 [DelphiCon 요약] 코드사이트 로깅 실전 활용 기법 (Real-world CodeSite Logging Techniques) 관리자 2021.01.19 22434
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 20957
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 23032
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 28810
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 30012
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 25361
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 46305
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 182133
1123 [도서/PDF] 한 번에 개발하는 안드로이드&iOS 앱 with 델파이 1편 - 3장(실습).사원 정보 프로토타입 앱 관리자 2020.02.04 425
1122 [도서/PDF] 한 번에 개발하는 안드로이드&iOS 앱 with 델파이 1편 - 2장. 첫번째 모바일 앱 만들기 관리자 2020.02.04 537
1121 n [도서/PDF] 한 번에 개발하는 안드로이드&iOS 앱 with 델파이 1편 - 1장. 델파이 개발환경 둘러보기 관리자 2020.02.04 572
1120 [도서/PDF] 한 번에 개발하는 안드로이드&iOS 앱 with 델파이 1편 - 3장. 파이어몽키 이해하기 [2] 관리자 2020.02.04 520
1119 [고객사례-유틸리티, 델파이] SyncBackPro - 데이터 백업/동기화 솔루션 관리자 2020.02.04 425
1118 델파이 개발자를 위한 이더리움(Ethereum)! 관리자 2020.02.04 442
1117 윈도우10에서 활용 가능한 델파이만의 5가지 기능들 관리자 2020.02.04 1050
1116 [업데이트][패치][10.3.3] C++빌더 10.3.3 스레딩 및 TLS 패치 험프리 2020.02.03 311
1115 Delphi / C ++ Builder를 사용하여 Azure에서 MSSQL 데이터베이스 만들기 및 연결 험프리 2020.02.03 262
1114 이 달의 기술자료 - 2020년 02월 험프리 2020.01.31 290
1113 [고객사례-유틸리티, 델파이] ALLMediaServer - 미디어 컨텐츠 플레이 프로그램 관리자 2020.01.31 330
1112 [발표자료] 20200130 실제 사례로 살펴보는 소프트웨어 현대화 방안 file 관리자 2020.01.31 279
1111 [코드레이지2019] VCL 현대화: WinAPI, COM & Shell 인터페이스, WinRT 통합하기 김원경 2020.01.30 213
1110 TJumpList 컴포넌트 사용하기 file 김원경 2020.01.30 307
1109 데브기어 컴포넌트 컨버터 소개(마이그레이션 자동화 도구) 험프리 2020.01.29 582
1108 [코드레이지2019] 파이어몽키에서 사용자 정의 Message Box 디자인하기 김원경 2020.01.23 299
» 파이어몽키에서 Message 대화상자 사용하기/Message 대화상자와 유사하게 폼 사용하기 file 김원경 2020.01.23 2404
1106 [업데이트][패치][10.3.3] RAD 스튜디오 10.3.3 아이폰 XS와 XR 디버깅 패치 험프리 2020.01.23 284
1105 [코드레이지 2019] 웹소켓(WebSocket)과 델파이 험프리 2020.01.22 1339
1104 프로젝트 경험을 통해 터득한 효과적인 마이그레이션 프로세스 file 험프리 2020.01.22 669