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

时间:2011-06-14 13:36:51

标签: delphi windows-7

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

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

我做错了什么?

3 个答案:

答案 0 :(得分:18)

首先,请注意一个简单的解决方法是使用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或更高版本and主题已启用and UseLatestCommonDialogs全局变量为true(默认)。如果没有,VCL实际上会创建一个自定义TForm并手动添加所有按钮,标签和图标(如果你问我这有点奇怪 - 为什么不简单地使用MessageBox?)。

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

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

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

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

不幸的是,任务对话框不支持问号图标( 作为预定义图标 )。这不是TTaskDialog包装器的限制,而是Windows任务对话API的限制。例如,请参阅official documentation。有TD_ERROR_ICONTD_WARNING_ICONTD_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);

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

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

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

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

答案 1 :(得分:2)

如果您需要一些Dialogs,可以查看我们的Open Source SynTaskDialog unit for Windows XP,Vista,Seven。

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

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

Windows Seven

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

from Delphi code

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

Windows Seven

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

from Delphi code

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

从Delphi 6到XE工作。

答案 2 :(得分:-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);