안드로이드에서 메시지 다이얼로그 사용하기
FireMonkey XE7에서 안드로이드 어플을 개발하다 보면 다이얼로그를 추가할 일이 반드시 생긴다.
일단 기본적인 틀은 윈도우즈 프로그램 개발하듯이 작성을 하면
"blocking dialogs not implemented on this platform"
이라고 휴대폰에서 뱉어 내면서 되질 않는다.
그래서 어떻게 해야 할지 몰라 인터넷 검색하니...
여기의 글을 보면
http://docwiki.embarcadero.com/RADStudio/XE6/en/Creating_an_Android_App#Using_Modal_Dialog_Boxes_in_Mobile_Apps
이 문서를 보라고 한다. 그러나 내가 볼 것은 XE7이므로 저기서 XE6을 XE7로 변경하여 보았으나 나오지 않는다.
(저 문서는 MessageDlg가 Blocking 기능을 안드로이드 OS에서 사용 못한다는 이야기였다.)
그래서 google 검색에서 두번째에 있는 것을 읽어 보았다.
http://docwiki.embarcadero.com/RADStudio/XE7/en/What's_New_in_Delphi_and_C%2B%2BBuilder_XE7
"Dialog Box Methods Support Anonymous Methods to Handle Their Closings"
항목에서 지원을 해준다고 한다. (InputBox, InputQuery, MessageDlg)
그런데 무언가 특별한 방법을 써야 하는 듯 하다.
<ACloseDialogProc> 이것을 써야 한다는데, 뭔소린지 봐도 모르겠다.
(사실 바로 이해했으면 이렇게 정리도 안하겠지만...)
그래서 다시 검색했더니 험프리님께서 정리를 해 놓으신 블로그가 나왔으나...
역시 델파이, 그래도 하단에 있는 참고자료가 도움이 될까 싶어 살펴 보았다.
솔직히 혹시나 하는 마음에서였다. 그리고 검색...
디렉토리 구조에서 RadStudio XE7까지 올라가니 cpp가 보여서 들어가 보았다.
그리고 동일한 구조로 들어가기 위해서 Mobile Snippets, MessageAlerts, uMain.cpp 를 선택했다.
그 주소가 바로 다음과 같다.
빙고!! 찾았다.
struct TCloseDialogHandler : public TCppInterfacedObject<TInputCloseDialogProc> {
void __fastcall Invoke(const System::Uitypes::TModalResult AResult) {
switch (AResult) {
case mrYes :
ShowMessage("You chose Yes");
break;
case mrNo:
ShowMessage("You chose No");
break;
case mrCancel:
ShowMessage("You chose Cancel");
break;
}
}
};
_di_TInputCloseDialogProc handler = new TCloseDialogHandler();
/* Show a multiple-button alert that triggers different code blocks according to
your input */
MessageDlg("Choose a button:", TMsgDlgType::mtInformation,
TMsgDlgButtons() << TMsgDlgBtn::mbYes << TMsgDlgBtn::mbNo << TMsgDlgBtn::mbCancel , 0, handler);
이 형태에 맞추어서 추가하니 문제없이 잘 돌아간다.
그런데 sourceforge 디렉토리 구조가 어디서 많이 본 구조였다.
그래서 내 컴퓨터의 공유문서를 살펴보니 역시나... RADStudio의 기본 예제...
그러나;;;;;;;
그 내용을 살펴 보고 처음부터 인터넷 검색하길 잘했다라는 생각이 들었다.
switch (MessageDlg("Choose a button:", TMsgDlgType::mtInformation,
TMsgDlgButtons() << TMsgDlgBtn::mbYes << TMsgDlgBtn::mbNo << TMsgDlgBtn::mbCancel , 0))
{
case mrYes :
ShowMessage("You choose Yes");
break;
case mrNo:
ShowMessage("You choose No");
break;
case mrCancel:
ShowMessage("You choose Cancel");
break;
}
만약 이걸 먼저 보았으면 기본 예제인데 왜 안되는 건지 몰라서 정말 맨붕 왔을 듯 하다.