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

问题描述 投票:0回答:4

在 Win 7 上,MessageDlg 显示信息图标而不是确认图标(问号)。 这是代码:

MessageDlg('Are you sure you want to delete this file?'+ CRLF+ FileName, mtConfirmation, [mbYes, mbNo], 0)= mrYes

我做错了什么?

delphi windows-7
4个回答
20
投票

首先,请注意一个简单的解决方法是使用 Windows API

MessageBox
函数:

MessageBox(Handle, 'This is a test.', 'Test', MB_ICONQUESTION or MB_YESNO)

MessageBox

但是为什么

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

最后一种方法支持问号图标。确实,尝试一下

UseLatestCommonDialogs := false;
MessageDlg('This is a test', mtConfirmation, [mbYes, mbNo], 0);

MessageDlg

但这看起来太丑了!请不要这样做!创建自定义消息对话框而不使用本机操作系统对话框是愚蠢

但是不幸的是,任务对话框不支持问号图标(作为预定义图标)。这不是

TTaskDialog
包装器的限制,而是 Windows 任务对话框 API 的限制。例如,请参阅官方文档。有
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,
               'This is a test.',
               'Test',
               MB_ICONQUESTION or MB_YESNO);

请注意,如果任务对话框 API 不可用,我会使用旧的

MessageBox

Task Dialog

原则上,

MessageDlg
函数可以使用额外的逻辑以不同于信息、警告和错误情况的方式单独处理问号情况。即使在任务对话框中,这也会使
mtConfirmation
给出正确的图标,但代价是 VCL 代码稍微复杂一点,不太优雅。然而,显然,Embarcadero 选择了更简单的选择,只是假装您要求信息图标。

不过,我想知道为什么 Microsoft 选择不在 API 中包含 TD_QUESTION_ICON 常量。也许他们最新的 UI 指南不鼓励使用这个图标?


2
投票

如果您需要一些对话框,您可以查看我们的适用于 Windows XP、Vista、7 的开源 SynTaskDialog 单元

在Vista和7下会调用Native Task Dialog,并在XP下模拟它。与标准对话框单元或 Windows API 相比,您将获得更好的交互,并且将有确认图标,正如预期的那样。

这是在 Windows 7 64 位计算机下的结果:

Windows Seven

这是从我们的模拟纯 Delphi 代码创建的相同对话框:

from Delphi code

这是一个选择任务对话框,带有“命令链接”按钮,在本机七中:

Windows Seven

这是使用 VCL 仿真代码创建的窗口:

from Delphi code

请注意,有确认图标。 ;)

从 Delphi 6 到 XE 均可工作。


0
投票

if MessageDlg('您要退出并关闭所有表单吗?', mtConfirmation, [mbYes, mbNo] , 0) = mrYes then 开始 Main_Form.关闭; 结束;


-1
投票
if (Win32MajorVersion >= 6) and ThemeServices.ThemesEnabled then
    with TTaskDialog.Create(Self) do
      try
        Caption := 'Delete';
        Title := 'Are you sure to remove the minecraft?';
        Text := 'if you delete minecraft it well be gone forever.';
        CommonButtons := [tcbYes, tcbNo];
        CustomMainIcon.ReleaseHandle;
        CustomMainIcon.Handle := LoadIcon(0, IDI_QUESTION);
        Flags := [tfUseHiconMain];
        Execute;
      finally
        Free;
      end
  else
    MessageBox(Handle,
               'if you delete minecraft it well be gone forever.',
               'Are you sure to remove the minecraft?',
               MB_ICONQUESTION or MB_YESNO);
© www.soinside.com 2019 - 2024. All rights reserved.