파이어몽키에서 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 14387
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13023
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 15532
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 21064
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 22297
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 17932
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 38228
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 173741
126 모바일 앱 개발, 가장 좋은 선택은? 관리자 2021.03.18 601
125 안드로이드 SDK 수동 설치 방법 file 김원경 2020.07.15 3913
124 iOS 앱스토어 1024x1024 아이콘 문제에 대한 해결 방법 김원경 2020.07.08 468
123 파이어몽키를 사용하여 멀티 플랫폼/아키텍처 용 소프트웨어 개발 file 김원경 2020.03.25 589
122 RAD Studio 10.3.3 안드로이드 앱에서 센서 컴포넌트 사용시 링크 오류 해결방법 김원경 2020.03.18 343
121 [델파이 안드로이드 64비트 오류 수정] TInAppPurchase 컴포넌트 수정 file 김원경 2020.03.18 335
» 파이어몽키에서 Message 대화상자 사용하기/Message 대화상자와 유사하게 폼 사용하기 file 김원경 2020.01.23 2282
119 파이어몽키 TListBox 컴포넌트 사용방법: 사용자 정의 아이템데이터 동적으로 표시하기 file 김원경 2020.01.20 603
118 리눅스용 앱에 다양한 스타일 적용하기 (FMX 스타일들을 리눅스 앱에도!) 관리자 2019.09.17 443
117 밝은 톤의 사용자 친화적인 디자인을 찾고있다면 - 푸에르토 리코(Puerto Rico) FMX 스타일 관리자 2019.09.17 506
116 과감하면서도 볼드한 효과를 주고 싶다면 - Ruby Graphite FMX 스타일 관리자 2019.09.17 463
115 그라데이션이 적용된 멋진 스타일을 적용하고 싶다면 - 스텔라(Stellar) FMX 스타일 관리자 2019.09.17 558
114 리눅스 앱에 파이어몽키에서 적용했던 스타일을 똑같이 적용하세요 - Wedgewood Light 스타일 관리자 2019.09.09 353
113 리눅스 앱에 '깔끔하면서도 샤프한' 스타일을 적용하고 싶다면 - Air 스타일 관리자 2019.09.09 360
112 '눈에 확 띄는' 리눅스 앱을 만들고 싶다면 - Amakrits 스타일 관리자 2019.09.09 327
111 리눅스 앱에 '윈도우 10 컬러 스타일'을 적용하고 싶다면 - Aqua Graphite 스타일 관리자 2019.09.09 423
110 리눅스 앱에 '프로페셔널' 해보이는 스타일을 적용하고 싶다면 - Blend FMX 스타일 관리자 2019.09.09 372
109 FmxLinux - 델파이, RAD스튜디오에 추가되었습니다! 관리자 2019.06.26 502
108 [무료 제공툴] 파이어몽키 스텐실(FMX Stencils) [3] 관리자 2018.08.24 1189
107 10.2.3 새로운 기능: 파이어몽키 UI 템플릿 - 프로필 화면 관리자 2018.04.24 738