在Win 7上,MessageDlg显示信息图标而不是确认图标(问号).这是代码:
MessageDlg('Are you sure you want to delete this file?'+ CRLF+ FileName, mtConfirmation, [mbYes, mbNo], 0)= mrYes
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
And*_*and 18
首先,请注意一个简单的解决方法是使用Windows API MessageBox函数:
MessageBox(Handle, 'This is a test.', 'Test', MB_ICONQUESTION or MB_YESNO)
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
MessageDlg http://privat.rejbrand.se/MessageDlgQMark.png
但这看起来很难看!请不要这样做!创建自定义消息对话框而不是使用本机OS对话框是愚蠢的!
但遗憾的是,任务对话框不支持问号图标(作为预定义图标).这不是TTaskDialog包装器的限制,而是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,
'This is a test.',
'Test',
MB_ICONQUESTION or MB_YESNO);
Run Code Online (Sandbox Code Playgroud)
请注意,MessageBox如果Task Dialog API不可用,我会回到旧版本.
任务对话框http://privat.rejbrand.se/TaskDialogQMark.png
原则上,该MessageDlg函数可以使用额外的逻辑来单独处理问号情况,其方式不同于信息,警告和错误情况.mtConfirmation即使使用任务对话框,这也会使得给出正确的图标,这是在稍微复杂且不那么优雅的VCL代码的情况下.然而,显然,Embarcadero选择了更简单的替代方案,只是假装你要求提供信息图标.
不过,我想知道为什么微软选择不在API中包含TD_QUESTION_ICON常量.也许在最新的UI指南中不鼓励这个图标?
| 归档时间: |
|
| 查看次数: |
8286 次 |
| 最近记录: |