파이어몽키에서 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 15477
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13974
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 16506
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 22062
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 23282
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 18934
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 39268
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 174730
1123 David I의 31 XE3 퀵 비디오 - HTML5 빌더의 Canvas, Storage, Audio/Video 지원 관리자 2012.10.18 5326
1122 David I의 31일 동영상(한글자막) - 멀티-티어 마스터(고객)/디테일(주문) 데이터베이스 앱 개발하기 관리자 2013.05.20 5286
1121 David I의 31일 동영상(한글자막) - 기존 2D(HD) 앱에 3D콘트롤 사용하기(윈도우&맥용)(델파이 동일 적용 가능 관리자 2013.04.25 5277
1120 David I의 31일 동영상(한글자막) - 라이브바인딩과 액션을 조합한 앱 만들기(윈도우&맥 용)(델파이 동일 적용 가능) 관리자 2013.05.09 5264
1119 CodeRage7 : '델파이' 다시보기 관리자 2012.11.24 5261
1118 TeeChart 컴포넌트를 통해 다양한 차트 및 그래프로 데이터를 출력할 수 있습니다. file 험프리 2016.08.30 5251
1117 짐 맥키트(Jim McKeeth) - 당신의 뇌를 델파이에 연결하기(Emotiv EPOC) Humphery 2014.03.25 5251
1116 QR 코드를 만들고 스캔(읽는) 방법 Humphery 2014.07.24 5248
1115 [델파이 문법] 문법 요소 #8 file 관리자 2012.11.01 5245
1114 David I의 31일 동영상(한글자막) - C++11 부스트 알고리즘 라이브러리 C++빌더 64-bit에서 사용하기 관리자 2013.05.03 5214
1113 David I의 31일 동영상(한글자막) - 인터베이스XE3 ToGo를 사용한 C++데이터베이스 앱 만들기 관리자 2013.05.14 5212
1112 Delphi XE4에서 손쉽게 iOS 프로비져닝 등록하는 방법 [4] file c2design 2013.05.28 5198
1111 델파이/C++빌더/RAD Studio XE3 업데이트1 다운로드 및 보완사항 리스트 관리자 2012.12.21 5196
1110 [C++빌더 XE3 비디오 31] ClientDataSet을 이용하여 나만의 첫번째 Dataset C++ 파이어몽키 앱 만들기 관리자 2013.01.09 5148
1109 Turbo Pascal 출시 30년 - '즐거운 소프트웨어 개발'은 계속됩니다. 관리자 2013.01.18 5137
1108 짐 맥키트(Jim McKeeth) - 열손가락과 델파이를 연결하다.(Leap Motion 연동) Humphery 2014.04.04 5090
1107 [Delphi-iOS] Xcode를 사용하여 C 언어로 작성된 함수를 Delphi-iOS에서 호출하기 관리자 2013.05.20 5086
1106 [안드로이드] 외부어플 브라우져 및 PDF 호출 방법 c2design 2013.10.29 5067
1105 RAD Studio / Delphi / C++Builder XE3 업데이트 2 파일 다운로드 관리자 2013.01.28 5053
1104 [따라하기] 도서대여 프로그램 만들기 - 3, 도서관리 기능 개발 [2] file 험프리 2017.01.26 5046