음...
VCL에 대표적인 메세지박스 함수는
ShowMessage 일것입니다.
그런데 ShowMessage외에 다른 메세지 박스 함수가 있는줄 모르는 경우가 많더군요
[ShowMessage의 장단점]
장점
- 장점은 매우 쓰기에 간편하다는것입니다.
단점
; 하지만 단점은 매우 기능이 한정되어있죠
- 메세지박스의 Caption을 바꿀수 마음대로 정할수 없구
- "확인"버튼 외에 "확인/취소" , "Yes/No/Cancel"등 버튼을 여러가지러 설정하지도 못합니다.
- 또한 메세지박스의 특징을 나타낸 아이콘을 정해주지도 못하구요
Win32API인 MessageBox 함수로 위의 기능이 모두 가능합니다.
그런데 VCL에도 이런함수가 있습니다.
[MessageDlg]
바로 MessageDlg라는 함수입니다.
함수 원형은 다음과 같습니다.
extern PACKAGE int __fastcall MessageDlg(const AnsiString Msg, TMsgDlgType DlgType, TMsgDlgButtons Buttons, int HelpCtx);
그리고 MessageDlg의 사용된 TMsgDlgType과 TMsgDlgButtons는
#pragma option push -b-
enum TMsgDlgType { mtWarning, mtError, mtInformation, mtConfirmation, mtCustom };
#pragma option pop
#pragma option push -b-
enum TMsgDlgBtn { mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToAll, mbYesToAll, mbHelp };
#pragma option pop
typedef Set TMsgDlgButtons;
사용예
간단히 다음과 같이 쓰면..
1) 예제1
MessageDlg ("경고합니다." mtWarning ,TMsgDlgButtons()<<mbOK,0);
MessageDlg ("에러입니다." ,mtError ,TMsgDlgButtons()<<mbOK,0);
2) 예제2
if( MessageDlg ("이것은 문제입니다. 계속할까요?" ,mtConfirmation,TMsgDlgButtons() << mbYes << mbNo << mbCancel,0) == mrYes )
{
//...
}
...
3) 예제3
; ShowMessage와 MessageDlg가 똑같이 나오려면..
다음 두 문장은 똑같은 모양의 메세지박스를 보여줍니다.
ShowMessage("이 두문장은 같은 모양입니다.");
MessageDlg ("이 두문장은 같은 모양입니다." ,mtCustom,TMsgDlgButtons() << mbOK,0);
TMsgDlgType이 mtCustom인경우에 메세지박스의 캡션이 Application->Title로 나옵니다.
4) 예제4
; 두줄.. 버튼 여러개..
MessageDlg("다음과 같이 하면 어떤모습일까요? \r\r\nㅋㅋ 두줄에 버튼 여러개 나오죠?",mtInformation,TMsgDlgButtons()<<mbYes<< mbNo<< mbOK<< mbCancel<< mbAbort<< mbRetry,0);
그밖에 함수들
MessageDlg외에
1) 메세지박스를 특정 위치에 나타내게 하는 함수로
MessageDlgPos 가 있구
2) printf함수와 같이 가변 파라메터를 쓸수 있는
ShowMessageFmt라는 함수가 있습니다.
사용방법은 다음과 같구요
ShowMessageFmt("A=%d B=%d",ARRAYOFCONST((10,20)));
3) Help파일을 지정할수 있는
MessageDlgPosHelp라는 함수도 있습니다.
MessageDlg의 단점?
단점이라기 보다. win32api인 MessageBox 함수에 있는 기능인데 MesageDlg에서 없는 기능몇가지가 있는데요
1) VCL의 모든 Control이 쓰레드에서 안정적이지 못하듯이
MessageDlg도 메인GUI쓰레드가 아닌 쓰레드에서 사용하는데는 문제가 있습니다.
2) 메세지박스의 캡션을 지정할수 없습니다.
지정하지 않아도 되는것이 편리하므로 장점이 되기도하고 지정하고 싶을때는 기능이 없으니 안되는것이지요
3) 메세지박스에 버튼이 여러개일경우 특정버튼에 focus가 가게 설정할수가 없네요
위에 나열한 아쉬운점에 대해서는 다음에 또 정리해 보겠습니다.
그럼..