Delphi中消息框

Delphi中平常使用的消息框有四种形式,有ShowMessage、MessageDlg、Application.MessageBox、MessageBox。下面来深入了解下这四种形式的实现和使用。
1.ShowMessage 显示一个带"OK"按钮的消息框
  使用这个函数可以显示一个简单的带"OK"按钮的消息框,消息框的标题是应用程序的标题名,参数Msg字符串显示在消息框上。其源码如下:

procedure ShowMessage( const Msg:  string); 
begin 
  ShowMessagePos(Msg, - 1,0)">1);     
end

可以看到它调用了ShowMessagePos函数,我们观察下面的代码,发现跟ShowMessage很有关系,源码如下:

procedure ShowMessageFmt( string; Params:  array  of  const); 
begin 
  ShowMessage(Format(Msg, Params)); 
end
 
procedure ShowMessagePos( 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          //mbOK and mbCancel 
mbAbortRetryIgnore       //mbAbort, mbRetry, and mbIgnore 
mbAbortIgnore               第四个参数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( string; DlgType: TMsgDlgType; 
  Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer; 
begin 
  Result := MessageDlgPosHelp(Msg, DlgType, Buttons, HelpCtx,21)">''); 
end

发现其下面还有两个类似的函数,它们源码如下:

function MessageDlgPos( string; DlgType: TMsgDlgType; 
  Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer): Integer; 
function MessageDlgPosHelp( const HelpFileName:  string): Integer; 
begin 
   with CreateMessageDialog(Msg, Buttons)  do 
     try 
      HelpContext := HelpCtx; 
      HelpFile := HelpFileName; 
       if X >=  0  then Left := X; 
       if Y >=  then Top := Y; 
       if (Y <  0and (X <  then Position := poScreenCenter; 
      Result := ShowModal; 
     finally 
      Free; 
     end
end

在这里我们看到了MessageDlgPos函数,这就是ShowMessage最终调用的函数,而MessageDlgPos与MessageDlg都调用了MessageDlgPosHelp函数,MessageDlgPosHelp是显示一个带帮助文件的消息框,其实现是调用了CreateMessageDialog函数,其函数原型如下:

function CreateMessageDialog( 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 
   {省略····} 
{省略···} 
   if UseRightToLeftReading  then Flags := Flags  or MB_RTLREADING; 
   try 
    Result := Windows.MessageBox(Handle, Text, Caption, Flags); 
   finally 
     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,0)">0); 
   if MessageDlg( 0) = mrOk  then 
   begin 
     //··· 
   end
 
  Application.MessageBox( '这是Application.MessageBox消息框',21)">'标题', MB_OK); 
   if Application.MessageBox( end
 
  MessageBox( '这是MessageBox消息框', MB_OK); 
  MessageBox(Handle,255)">case MessageBox(Handle, MB_YESNOCANCEL + MB_ICONSTOP + MB_DEFBUTTON3)  of 
    IDCANCEL: 
       begin 
         //··· 
       end
    IDYES: 
       end
    IDNO: 
       end
   end

运行结果如下:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都是大家转来转去,原文出处我已经找不到了。这篇文章写的很不错,但最后部分“PermuteFunction 的终极版本”描述的不太清楚,完全按照该文章代码执行,是不行的。可能是作者故意这样做的?本文最后提供修正后的下载地址。原文如下:一、关于API Hook1.什么是API Hook不知道大家是否还记得,在DO
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都是大家转来转去,原文出处我已经找不到了。 这篇文章写的很不错,但最后部分“PermuteFunction 的终极版本”描述的不太清楚,完全按照该文章代码执行,是不行的。需要修改mess.pas中代码才行。其实文中提到的一个结构,代码中并没有使用typePIMAGE_IMPORT_DESCRIPTOR = ^IMA
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c++ 调用, 抽空研究了一下该库的最新版 ,把部分api 翻译成了dephi版的 记录一下 地址 ffmpegvcl.zip
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的功能是:将源操作数送到目的操作数中,即:(dst) &lt;--(src) 1.dst和src类型必须匹配,即必须同为字节
有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。 1.CreateProcess因为使用复杂,比较少用。 2.WinExec主要运行EXE文件。如:WinExec('Notepad.exe Readme.txt', SW_SHOW); 3.ShellExecute不仅可以运行EXE文件,也可以运行已经关联的文件。 首先必须引用shellapi
API原型: Declare Function MoveFileEx& Lib "kernel32" Alias "MoveFileExA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal dwFlags As Long) 参数 类型及说明 lpExistingFileName String,欲移
附带通用控件安装方法: ---------- 基本安装 1、对于单个控件,Componet-->install component..-->PAS或DCU文件-->install; 2、对于带*.dpk文件的控件包,File-->Open(下拉列表框中选*.dpk)-->install即可; 3、对于带*.bpl文件的控件包,Install Packages-->Add-->bpl文件名即可; 4
type   TRec=Record     msg:string;     pic:TMemoryStream; end; procedure TForm2.BitBtn1Click(Sender: TObject); var   ms:TMemoryStream;   Rec1,Rec2:TRec;   cc:tmemorystream;   jpg:TJPEGImage; begin   R
program Project1; { Types and Structures Definition } type   WNDCLASSEX = packed record     cbSize: LongWord;     style: LongWord;     lpfnWndProc: Pointer;     cbClsExtra: Integer;     cbWndExtra: In
   在Windows大行其道的今天,windows界面程序受到广大用户的欢迎。对这些程序的操作不外乎两种,键盘输入控制和鼠标输入控制。有时,对于繁杂 的,或重复性的操作,我们能否通过编制程序来代替手工输入,而用程序来模拟键盘及鼠标的输入呢?答案是肯定的。这主要是通过两个API函数来实现的。      下面以Delphi为例来介绍一下如何实现这两个功能。模拟键盘我们用Keybd_event这个ap
delphi中经常见到以下两种定义 Type TMouseProc = procedure (X,Y:integer); TMouseEvent = procedure (X,Y:integer) of Object; 两者样子差不多但实际意义却不一样, TMouseProc只是单一的函数指针类型; TMouseEvent是对象的函数指针,也就是对象/类的函数/方法 区
Windows 2000/XP和2003等支持一种叫做"服务程序"的东西.程序作为服务启动有以下几个好处:     (1)不用登陆进系统即可运行.     (2)具有SYSTEM特权.所以你在进程管理器里面是无法结束它的.     笔者在2003年为一公司开发机顶盒项目的时候,曾经写过课件上传和媒体服务,下面就介绍一下如何用Delphi7创建一个Service程序.     运行Delphi7,选
方法一: 1.调试delphi 写的服务程序,有这么一个办法。原来每次都是用attach to process方法,很麻烦。并且按照服务线程的执行线路,可能会停不到想要的断点。笨办法是,在procedure TsvcFrm.ServiceExecute(Sender: TService);中想要下断的语句前加个人定胜天的sleep(20000),但实际上这种办法是主观臆测的。可行,没问题。记得大学
Delphi For iOS开发指南(17):让应用程序禁止竖屏(也就是只显示横屏)     最近好多人问,怎么样让Delphi For iOS开发的应用程序禁止竖屏,也就是想让它一直横屏显示,横屏是好,一行可以放好几个控件,表格的话也可以多显示几列,看起来方便。 只要一句代码就可以让Delphi For iOS开发的应用程序禁止竖屏,如下: Application.FormFactor.Orie
一个比较完整的Inno Setup 安装脚本,增加了对ini文件设置的功能,一个安装包常用的功能都具备了。 [Setup] ; 注: AppId的值为单独标识该应用程序。 ; 不要为其他安装程序使用相同的AppId值。 ; (生成新的GUID,点击 工具|在IDE中生成GUID。) AppId={{A9861883-31C5-4324-BD9A-DC3271EEB675} ;程序名 AppName
在Delphi自带的Indy控件中其实是提供了MD2,MD4,MD5对象的,我们可以直接使用它们来完成MD5的签名算法。而不需要再去找其它的DLL或是Pas了。 在Uses单元中引用 IdHashMessageDigest,IdGlobal, IdHash 单元,再写如下代码即可以达到MD5的实现。 示例代码 procedure TForm1.Button1Click(Sender: TObjec
在Delphi 7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本。定义如下: 1 2 3 4 5 6 7 8 9 _NOTIFYICONDATAA = record    cbSize: DWORD;    Wnd: HWND;    uID: UINT;    uFlags: UINT;    uCallback
声明: 1. type Name = Existing type; 2. type Name = type Existing type; 3. type Name = (EnumValue1 [=value], EnumValue2 [=value] ...); 4. type Name = Expression1..Expression2; 5. type Name = ^Existing ty