加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – MessageDlg显示信息图标而不是确认

发布时间:2020-12-15 10:11:28 所属栏目:大数据 来源:网络整理
导读:在Win 7上,MessageDlg显示信息图标而不是确认图标(问号). 这是代码: MessageDlg('Are you sure you want to delete this file?'+ CRLF+ FileName,mtConfirmation,[mbYes,mbNo],0)= mrYes 我究竟做错了什么? 解决方法 首先,请注意一个简单的解决方法是使用W
在Win 7上,MessageDlg显示信息图标而不是确认图标(问号).
这是代码:
MessageDlg('Are you sure you want to delete this file?'+ CRLF+ FileName,mtConfirmation,[mbYes,mbNo],0)= mrYes

我究竟做错了什么?

解决方法

首先,请注意一个简单的解决方法是使用Windows API MessageBox函数:
MessageBox(Handle,'This is a test.','Test',MB_ICONQUESTION or MB_YESNO)

MessageBox http://privat.rejbrand.se/MessageBoxQMark.png

但是为什么MessageDlg不起作用?好吧,MessageDlg做了两件事之一.如果可能,它使用Windows Vista任务对话框,即操作系统是Windows Vista或更高版本,并且主题已启用且UseLatestCommonDialogs全局变量为true(默认值).如果没有,VCL实际上会创建一个自定义TForm并手动添加所有按钮,标签和图标(如果你问我这有点奇怪 – 为什么不简单地使用MessageBox?).

最后一种方法支持问号图标.的确,试试吧

UseLatestCommonDialogs := false;
MessageDlg('This is a test',0);

MessageDlg http://privat.rejbrand.se/MessageDlgQMark.png

但这看起来很难看!请不要这样做!创建自定义消息对话框而不是使用本机OS对话框是愚蠢的!

但遗憾的是,任务对话框不支持问号图标(作为预定义图标).这不是TTaskDialog包装器的限制,而是Windows Task Dialog API的限制.例如,请参见official documentation.有TD_ERROR_ICON,TD_WARNING_ICON和TD_INFORMATION_ICON,但没有问号图标.

当然,任务对话框可以使用任何图标.例如,你可以做到

if (Win32MajorVersion >= 6) and ThemeServices.ThemesEnabled then
    with TTaskDialog.Create(Self) do
      try
        Caption := 'Test';
        Title := 'Test';
        Text := 'This is a test.';
        CommonButtons := [tcbYes,tcbNo];
        CustomMainIcon.ReleaseHandle;
        CustomMainIcon.Handle := LoadIcon(0,IDI_QUESTION);
        Flags := [tfUseHiconMain];
        Execute;
      finally
        Free;
      end
  else
    MessageBox(Handle,MB_ICONQUESTION or MB_YESNO);

请注意,如果Task Dialog API不可用,我会回到旧的MessageBox上.

Task Dialog http://privat.rejbrand.se/TaskDialogQMark.png

原则上,MessageDlg函数可以使用其他逻辑来单独处理问号情况,其方式与信息,警告和错误情况不同.这样就可以使mtConfirmation在任务对话框中给出正确的图标,这是因为VCL代码稍微复杂一点,也不那么优雅.然而,显然,Embarcadero选择了更简单的替代方案,只是假装你要求提供信息图标.

不过,我想知道为什么微软选择不在API中包含TD_QUESTION_ICON常量.也许在最新的UI指南中不鼓励这个图标?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读