分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

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; 

运行结果如下:

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

深入了解Delphi 7中的四种消息框相关推荐

  1. JavaScript 中创建三种消息框:警告框、确认框、提示框

    警告框 警告框经常用于确保用户可以得到某些信息. 当警告框出现后,用户需要点击确定按钮才能继续进行操作. alert("文本") 确认框 确认框用于使用户可以验证或者接受某些信息. ...

  2. 后台CS代码中创建四种常用的SL动画效果

    http://www.cnblogs.com/chengxingliang/archive/2011/03/07/1974436.html后台CS代码中创建四种常用的动画效果[附带源码实例] 转载于: ...

  3. php 数组存入mysql_PHP将数组存入数据库中的四种方式

    1.implode()和explode()方式 2.print_r()和自定义函数方式 3.serialize()和unserialize()方式 4.json_encode()和json_decod ...

  4. java object 引用类型_java中的四种引用类型

    java中的四种引用类型 一.强引用 强引用是最常见的,把一个对象赋给一个引用变量,这个引用变量就是一个强引用.当一个对象被强引用变量引用时,他处于可达状态,它是不会被GC回收的,即使该对象以后永远不 ...

  5. 计算机网络中的时延有哪几部分,计算机网络中的四种延迟分别是什么?

    计算机网络中的四种延迟分别是:节点处理延迟 .排队延迟.发送延迟.传播延迟. 1.节点处理延迟 数据更改在一个服务器上完成与该更改出现在另一个服务器上之间所用的时间(例如在发布服务器上进行更改和该更改 ...

  6. Java 中的四种引用

    垃圾收集器与内存分配策略参考目录: 1.判断Java 对象实例是否死亡 2. Java 中的四种引用 3.垃圾收集算法 4. Java9中的GC 调优 5.内存分配与回收策略 在进行垃圾回收之前,虚拟 ...

  7. PHP将数组存入数据库中的四种方式

    最近突然遇到了一个问题,如何用PHP将数组存入到数据库中,经过自己的多方查找和研究,总结了以下四种方法: 1.implode()和explode()方式 2.print_r()和自定义函数方式 3.s ...

  8. java按钮权限控制_详解Spring Security 中的四种权限控制方式

    Spring Security 中对于权限控制默认已经提供了很多了,但是,一个优秀的框架必须具备良好的扩展性,恰好,Spring Security 的扩展性就非常棒,我们既可以使用 Spring Se ...

  9. java正则校验密码 长度不少于8位且至少包含大写字母、小写字母、数字和特殊符号中的四种组合 或者 其中任意三种组合

    java正则校验密码必须是包含大小写字母.数字.特殊符号的8位以上四种组合 或者 其中任意三种组合 一.排除法和详细解释 1.排除大写字母.小写字母.数字.特殊符号中1种组合.2种组合.3种组合,那么 ...

最新文章

  1. 对HA的简单认识以及HA集群删除
  2. python画笑脸图案-如何让这些代码中的一个在窗口中绘制不同大小的笑脸?
  3. 小白学数据分析-----回归分析在游戏人气分析的应用探索
  4. 三种实现分布式解决方案原理分析
  5. php定时任务(自己)
  6. python无法使用物理网卡_Python 实现监控所有物理网卡状态
  7. 函数:MySQL中取整函数round和floor
  8. 基于三菱PLC的全自动洗衣机控制系统设计
  9. 迅雷手机版苹果版_「9月22日」最新 苹果IOS手机迅雷Beta版证书修复版 安卓不限速...
  10. npm install --legacy-peer-deps
  11. html5 手机剪切板,H5页面在手机端如何实现复制粘贴板功能
  12. 蓝桥杯 受伤的皇后(dfs)
  13. 安装CentOS找不到硬盘,无法分区,No disks selected
  14. 超强!Figma汉化版下载教程来了!
  15. 【matlab】雷达成像系列 之 BP(BackProjection,后向投影) 成像算法
  16. 大学计算机word排版作业,大学作业 word 文档排版.doc
  17. gtbook安装使用教程
  18. 即第1个字母变成第26个字母,第i个字母变成第26-i+1个字母,非字母字符不变。要求编程序将密码变回原文,并输出密码和原文
  19. 获取手机唯一识别码IMEI
  20. 零基础入门CV赛事- 街景字符编码识别

热门文章

  1. vue2学习计划1-3 浏览器跨域问题(mock-api)
  2. 【C语言】输入5个整数并按输入顺序逆序输出
  3. Oracle expdp impdp导出导入命令及数据库备份
  4. Chrome DevTools:如何过滤网络请求
  5. compat包_使用Compat Patchers,API的稳定性既便宜又容易!
  6. 最大子数组问题 线性时间_我最喜欢的线性时间排序算法
  7. 组件用.vue还是.js_如何使用Vue.js 2.0构建灵活的图像上传器组件
  8. Python数据分析实战:使用pyecharts进行数据可视化
  9. Python打印A~Z的26个字母,你会怎样打印?
  10. 大厂在用的Python反爬虫手段,破了它!