1. 程式人生 > >深入瞭解Delphi 7中的四種訊息框

深入瞭解Delphi 7中的四種訊息框

      Delphi中平常使用的訊息框有四種形式,有ShowMessage、MessageDlg、Application.MessageBox、MessageBox。下面來深入瞭解下這四種形式的實現和使用。
1.ShowMessage 顯示一個帶"OK"按鈕的訊息框
  使用這個函式可以顯示一個簡單的帶"OK"按鈕的訊息框,訊息框的標題是應用程式的標題名,引數Msg字串顯示在訊息框上。其原始碼如下:

procedure ShowMessage( const Msg:  string); 
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為訊息框型別,以圖示形式顯示在訊息框左側,其取值範圍如下:

mtWarning     //帶黃色感嘆號的警告圖示,標題是Warning 
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            //mrOk 
mbCancel      //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 <  0and (X <  0then 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; 

參看其實現原始碼,我們可以發現它的具體實現:

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函式,不僅可以自定義訊息內容和標題,還有自定義按鈕、圖示、預設按鈕、擴充套件風格等等。其函式原型如下:

function MessageBox(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer;  stdcall

其第一個引數為標識訊息框的所有者,如果這個引數是0的話,則訊息框沒有父視窗,與應用程式同等級。第二三個引數不再介紹。第四個引數為標識引數,各種自定義效果風格皆在此設定。下面詳細介紹:
自定義出現的按鈕:

MB_ABORTRETRYIGNORE     //按鈕: 終止、重試、忽略 
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