Firemonkey 파이어몽키에서 Message 대화상자 사용하기/Message 대화상자와 유사하게 폼 사용하기
2020.01.23 14:01
파이어몽키에서 Message 대화상자 사용하기
이전 파이어몽키에서는 MessageDlg, ShowMessage, InputBox, InputQuery 등이 새로운 메소드로 많이 변경 되었습니다. Async 와 Sync 형태로 체계화 되었고 기존 함수들은 컴파일시 오류가 발생하지는 않으나 비정상으로 작동되었습니다. 아래의 주소를 참조하시면 자세한 내용을 보실 수 있습니다.
델파이 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로 지정합니다.
4. 아래와 같은 계층 구조로 컴포넌트들을 구성하도록 하겠습니다.
- 폼에 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 (모두)로 설정하면 흰색입니다.
|
- 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 |
아래와 같이 디자인 된 것을 확인 하실 수 있습니다.
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와 유사하게 표시됨을 확인 하실 수 있습니다.
[샘플] Form_DialogFomat.zip