파이어몽키에서 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 15409
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13959
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 16495
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 22045
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 23266
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 18920
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 39242
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 174694
125 N 윈도우와 맥 개발 시작을 위한 파이어몽키 코스북: 무료 다운로드 제공(385페이지) 관리자 2013.04.05 152326
124 Find the O/S Language Type c2design 2014.07.30 47758
123 [Android] 폰번호 가져오기 [1] 타락천사 2014.09.05 38533
122 델파이XE2 파이어몽키 기반 아이폰앱 개발에서 제스춰를 인식시키는 방법 박병일 2012.01.25 23255
121 RAD 스튜디오 모바일 개발 환경 설정(안드로이드, iOS) [1] file 험프리 2014.05.19 15952
120 델파이 XE2 로 아이폰 하드웨어 컨트롤 하기 박병일 2012.01.19 15502
119 파이어몽키 기반의 아이폰앱 개발에서 주소록 가져오기 박병일 2012.01.25 14431
118 델파이 XE2로 만든 아이폰 앱 - TicTacToe file 박병일 2012.01.17 13959
117 파이어몽키 3D Text Editor file 박병일 2012.02.06 13922
116 델파이 XE2의 DataSnap 서버와 OSX Client의 연동 박병일 2012.01.19 13545
115 델파이 XE2로 아이폰앱 만들기 박병일 2012.01.18 13050
114 Delphi XE2에서 맥 애플리케이션을 만들어 보자 박병일 2012.01.18 12996
113 웹상의 이미지를 폼(TImage)에서 사용하는 방법 [3] file Humphery 2013.12.14 11780
112 델파이 XE2 파이어몽키로 만든 아이폰 3D 매쉬 앱 file 박병일 2012.03.07 11632
111 파이어 몽키를 이용한 공학 계산과 그래프 박병일 2012.01.28 11427
110 파이어 몽키란 무었인가? 박병일 2012.01.19 11168
109 파이어몽키를 이용하여 당구 게임을 시뮬레이션한 데모 file 박병일 2012.02.06 10651
108 David I의 31일 동영상(한글자막) - 프로토토타입 바인드 소스와 실제 데이터셋을 사용한 UI의 C++앱 만들기(델파이 동일 적용 가능) 관리자 2013.05.11 10632
107 안드로이드 앱 서명 및 배포 file Humphery 2014.01.02 10314