问题描述
|
在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)
但是为什么MessageDlg
不起作用?好吧,ѭ3做两种可能的事情之一。如果可能,它将使用Windows Vista +任务对话框,即,操作系统是Windows Vista或更高版本。启用and
主题and
,UseLatestCommonDialogs
全局变量为true
(默认值)。如果不是,VCL实际上会创建一个自定义TForm
并手动添加所有按钮,标签和图标(如果您问我,这有点奇怪-为什么不简单使用MessageBox
?)。
最后一种方法支持问号图标。确实,尝试
UseLatestCommonDialogs := false;
MessageDlg(\'This is a test\',mtConfirmation,[mbYes,mbNo],0);
但这看起来太丑了!请不要这样做!创建自定义消息对话框而不是使用本机OS对话框是愚蠢的!
但是,不幸的是,“任务对话框”不支持问号图标(作为预定义的图标)。这不是“ 12”包装程序的限制,而是Windows Task Dialog 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,MB_ICONQUESTION or MB_YESNO);
请注意,如果Task Dialog API不可用,我会退回到旧的ѭ1。
原则上,“ 3”功能可以使用其他逻辑来分别处理问号情况,其方式不同于信息,警告和错误情况。这样,即使使用“任务对话框”,“ 19”也能给出正确的图标,但会出现稍微复杂一些,不太优雅的VCL代码。但是,显然,Embarcadero选择了一个简单的替代方法,即简单地假装您要求提供信息图标。
我仍然想知道为什么Microsoft选择不在API中包含TD_QUESTION_ICON常量。也许在他们最新的UI指南中不建议使用此图标?
, 如果您需要一些对话框,则可以查看我们的Windows XP,Vista和7的开源SynTaskDialog单元。
它将在Vista和Seven下调用Native Task对话框,并在XP下进行仿真。与标准的Dialogs单元或Windows API相比,您将拥有更好的交互性,并且将按预期显示确认图标。
这是在一台Windows 7 64位计算机下的结果:
这是从我们的纯Delphi模拟代码创建的对话框:
这是一个选择任务对话框,带有“命令链接”按钮,以本机语言7表示:
这是使用VCL仿真代码创建的窗口:
请注意,这里有确认图标。 ;)
从Delphi 6到XE。