深入瞭解Delphi 7中的四種訊息框
Delphi中平常使用的訊息框有四種形式,有ShowMessage、MessageDlg、Application.MessageBox、MessageBox。下面來深入瞭解下這四種形式的實現和使用。
1.ShowMessage 顯示一個帶"OK"按鈕的訊息框
使用這個函式可以顯示一個簡單的帶"OK"按鈕的訊息框,訊息框的標題是應用程式的標題名,引數Msg字串顯示在訊息框上。其原始碼如下:
begin
ShowMessagePos(Msg, - 1, - 1);
end;
可以看到它呼叫了ShowMessagePos函式,我們觀察下面的程式碼,發現跟ShowMessage很有關係,原始碼如下:
procedure ShowMessageFmt( const Msg: string; Params: array of const);begin
ShowMessage(Format(Msg, Params));
end;
procedure ShowMessagePos( const Msg: string; X, Y: Integer);
begin
MessageDlgPos(Msg, mtCustom, [mbOK], 0, X, Y);
end
ShowMessageFmt跟ShowMessage類似,只是ShowMessageFmt引數是帶格式化的字串。而它們最終都呼叫ShowMessagePos,這是在指定的位置顯示訊息框,顯示出來的效果還是跟ShowMessage一樣,其引數X、Y座標為-1的話表示出現在螢幕中間,其實現呼叫了MessageDlgPos,這跟MessageDlg又有什麼關係,先看下面介紹MessageDlg。
2.MessageDlg 在螢幕中間顯示帶返回值的可自定義訊息框
使用這個函式可以顯示一個帶圖示、多種組合按鈕、幫助ID,並且有返回值的訊息框,其第一個引數Msg是訊息框的顯示內容,第二個引數DlgType為訊息框型別,以圖示形式顯示在訊息框左側,其取值範圍如下:
mtError //帶紅色叉的錯誤圖示,標題是Error
mtInformation //帶藍色“i”符號的提示圖示,標題是Information
mtConfirmation //帶綠色問號的詢問圖示,標題是Confirmation
mtCustom //不帶圖示,訊息框標題是應用程式的標題名稱
第三個引數Buttons是出現在訊息框上的按鈕,可以是單個按鈕,也可以是組合按鈕,其取值範圍如下:
mbYes //按鈕'Yes'(預設都是英文,不方便使用)mbNo //按鈕'No'
mbOK //按鈕'OK'
mbCancel //按鈕'Cancel'
mbAbort //按鈕'Abort'
mbRetry //按鈕'Retry'
mbIgnore //按鈕'Ignore'
mbAll //按鈕'All'
mbNoToAll //按鈕'No to All'
mbYesToAll //按鈕'Yes to All'
mbHelp //按鈕'Help'
也可以是如下的組合按鈕:
mbYesNoCancel //mbYes, mbNo, and mbCancel(預設都是英文,不方便使用)mbYesNoAllCancel //mbYes, mbYesToAll, mbNo, mbNoToAll, and mbCancel
mbOKCancel //mbOK and mbCancel
mbAbortRetryIgnore //mbAbort, mbRetry, and mbIgnore
mbAbortIgnore //mbAbort, mbIgnore
第四個引數HelpCtx是幫助ID,是在訊息框按“Help”按鈕或按F1出現的幫助文件,若無需幫助的話,設定為0即可。返回值是使用者按下了訊息框上的按鈕,所返回的值,其值與訊息框上的各種按鈕分別對應,如下所示:
mbOK //mrOkmbCancel //mrCancel(訊息框右上角的”關閉“按鈕也是返回這個值)
mbYes //mrYes
mbNo //mrNo
mbAbort //mrAbort
mbRetry //mrRetry
mbIgnore //mrIgnore
mbAll //mrAll
mbNoToAll //mrNoToAll
mbYesToAll //mrYesToAll
下面是MessageDlg原始碼:
function MessageDlg( const Msg: string; DlgType: TMsgDlgType;Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
begin
Result := MessageDlgPosHelp(Msg, DlgType, Buttons, HelpCtx, - 1, - 1, '');
end;
發現其下面還有兩個類似的函式,它們原始碼如下:
function MessageDlgPos( const Msg: string; DlgType: TMsgDlgType;Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer): Integer;
begin
Result := MessageDlgPosHelp(Msg, DlgType, Buttons, HelpCtx, X, Y, '');
end;
function MessageDlgPosHelp( const Msg: string; DlgType: TMsgDlgType;
Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer;
const HelpFileName: string): Integer;
begin
with CreateMessageDialog(Msg, DlgType, Buttons) do
try
HelpContext := HelpCtx;
HelpFile := HelpFileName;
if X >= 0 then Left := X;
if Y >= 0 then Top := Y;
if (Y < 0) and (X < 0) then Position := poScreenCenter;
Result := ShowModal;
finally
Free;
end;
end;
在這裡我們看到了MessageDlgPos函式,這就是ShowMessage最終呼叫的函式,而MessageDlgPos與MessageDlg都呼叫了MessageDlgPosHelp函式,MessageDlgPosHelp是顯示一個帶幫助檔案的訊息框,其實現是呼叫了CreateMessageDialog函式,其函式原型如下:
function CreateMessageDialog( const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons): TForm;於是乎,我們可以直接使用CreateMessageDialog來建立一個訊息框,當我們在開發程式的時候,經常需要使用某些訊息框,那麼用這個來建立,然後用ShowMoDal來顯示和獲取返回值即可。繼續觀察CreateMessageDialog函式,可以發現它是使用TMessageForm建立的。
3.Application.MessageBox 使用者自定義訊息框
這個函式是Delphi應用程式類對Windows API的訊息框函式MessageBox的封裝,使其方便呼叫。其第一個引數是訊息框內容文字,第二個引數是訊息框標題,第三個引數是標識,指定訊息框按鈕、圖示、預設按鈕等等。其函式原型如下:
參看其實現原始碼,我們可以發現它的具體實現:
function TApplication.MessageBox( const Text, Caption: PChar; Flags: Longint): Integer;var
{省略····}
begin
{省略···}
if UseRightToLeftReading then Flags := Flags or MB_RTLREADING;
try
Result := Windows.MessageBox(Handle, Text, Caption, Flags);
finally
{省略···}
end;
end;
明白它是呼叫Windows API的MessageBox函式,把自身控制代碼傳遞進去。而第三個引數Flags等下面介紹Windows.MessageBox時一起講解。
4.MessageBox 系統API訊息框函式
這個函式包含在Windows單元下,完整的函式名是Windows.MessageBox,是系統API函式,不僅可以自定義訊息內容和標題,還有自定義按鈕、圖示、預設按鈕、擴充套件風格等等。其函式原型如下:
其第一個引數為標識訊息框的所有者,如果這個引數是0的話,則訊息框沒有父視窗,與應用程式同等級。第二三個引數不再介紹。第四個引數為標識引數,各種自定義效果風格皆在此設定。下面詳細介紹:
自定義出現的按鈕:
MB_OK //按鈕: 確定 (默認出現的按鈕)
MB_OKCANCEL //按鈕: 確定、取消
MB_RETRYCANCEL //按鈕: 重試、取消
MB_YESNO //按鈕: 是、否
MB_YESNOCANCEL //按鈕: 是、否、取消
自定義出現的圖示:
MB_ICONEXCLAMATION, MB_ICONWARNING //帶感嘆號的提醒圖示MB_ICONINFORMATION, MB_ICONASTERISK //帶”i“符號的資訊提示圖示
MB_ICONQUESTION //帶問號的詢問圖示
MB_ICONSTOP, MB_ICONERROR, MB_ICONHAND //帶停止標誌的圖示
自定義預設焦點的按鈕:
MB_DEFBUTTON1 //第一個按鈕設為預設(預設引數是第一個按鈕)MB_DEFBUTTON2 //第二個按鈕設為預設
MB_DEFBUTTON3 //第三個按鈕設為預設
MB_DEFBUTTON4 //第四個按鈕設為預設
自定義訊息框顯示模式:
MB_APPLMODAL //使用者必須響應訊息框才能繼續在由hWnd引數標識的視窗工作,MB_APPLMODAL 是預設引數MB_SYSTEMMODAL //跟MB_APPLMODAL相似,但是多了WS_EX_TOPMOST視窗風格
MB_TASKMODAL //跟MB_APPLMODAL相似,但是當引數控制代碼為空時,屬於當前任務的所有頂級視窗被禁用
此外,還有一些其他標識:
MB_DEFAULT_DESKTOP_ONLY //預設桌面才能建立成功MB_HELP //新增一個”幫助“按鈕
MB_RIGHT //訊息文字右對齊
MB_RTLREADING //從右到左顯示訊息內容和標題
MB_SETFOREGROUND //使訊息框成為前置視窗
MB_TOPMOST //使訊息框在最上層顯示
MB_SERVICE_NOTIFICATION //Windows NT only
MB_SERVICE_NOTIFICATION_NT3X //Windows NT only
當沒有足夠記憶體建立訊息框的時候,返回值為0,否則正常返回值如下:
IDABORT //'終止'按鈕被按下IDCANCEL //'取消'按鈕被按下
IDIGNORE //'忽略'按鈕被按下
IDNO //'否'按鈕被按下
IDOK //'確定'按鈕被按下
IDRETRY //'重試'按鈕被按下
IDYES //'是'按鈕被按下
總結:ShowMessage、MessageDlg是TMessageForm訊息窗體類建立的,而Application.MessageBox、MessageBox實質都是Windows API函式MessageBox。相比之下,後兩者的可自定義性更強一些。下面舉例下使用方法:
procedure TForm1.btn1Click(Sender: TObject);begin
ShowMessage( '這是ShowMessage訊息框');
ShowMessage( '這是ShowMessage換行訊息框' + # 13# 10 + '無幻部落格http://blog.csdn.net/akof1314');
MessageDlg( '這是MessageDlg訊息框', mtCustom, [mbOK], 0);
if MessageDlg( '這是MessageDlg訊息框', mtWarning, mbOKCancel, 0) = mrOk then
begin
//···
end;
Application.MessageBox( '這是Application.MessageBox訊息框', '標題', MB_OK);
if Application.MessageBox( '這是Application.MessageBox訊息框', '標題', MB_OKCANCEL + MB_ICONQUESTION + MB_DEFBUTTON2 + MB_TOPMOST) = IDOK then
begin
//···
end;
MessageBox( 0, '這是MessageBox訊息框', '標題', MB_OK);
MessageBox(Handle, '這是MessageBox訊息框', '標題', MB_OK);
case MessageBox(Handle, '這是MessageBox訊息框', '標題', MB_YESNOCANCEL + MB_ICONSTOP + MB_DEFBUTTON3) of
IDCANCEL:
begin
//···
end;
IDYES:
begin
//···
end;
IDNO:
begin
//···
end;
end;
end;
執行結果如下:
再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!https://www.cnblogs.com/captainbed