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 < 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; 

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

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; 

運行結果如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM