파이어몽키에서 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 22419
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 20943
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 23013
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 28792
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 29997
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 25344
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 46293
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 182122
1397 N 윈도우와 맥 개발 시작을 위한 파이어몽키 코스북: 무료 다운로드 제공(385페이지) 관리자 2013.04.05 152367
1396 ComPort(시리얼 통신) 컴포넌트 설치안내 [11] file 험프리 2013.12.04 112476
1395 [REST API] REST 기반 파일 업로드와 다운로드 구현하기 험프리 2020.08.31 84590
1394 델파이 튜토리얼 자습서 이용 안내 관리자 2014.09.01 71985
1393 이 달의 기술자료 - 2014년 11월 험프리 2014.10.13 54173
1392 이 달의 기술자료 - 2014년 6월 file 험프리 2014.06.05 50404
1391 Find the O/S Language Type c2design 2014.07.30 48380
1390 RAD Studio Resource Center 박병일 2012.01.26 46623
1389 CD-ROM 열고 닫기 박병일 2011.12.22 44783
1388 [Android] 폰번호 가져오기 [1] 타락천사 2014.09.05 38628
1387 이 달의 기술자료 - 2014년 12월 file 험프리 2014.11.26 32512
1386 RAD Studio XE6 Update1 발표 [1] Humphery 2014.06.20 29499
1385 델파이XE2 파이어몽키 기반 아이폰앱 개발에서 제스춰를 인식시키는 방법 박병일 2012.01.25 23330
1384 [10.4 시드니 신기능] 새로운 VCL TEdgeBrowser 컴포넌트 험프리 2020.05.18 23173