- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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
不起作用?好吧,MessageDlg
会执行两种可能的操作之一。如果可能,它使用 Windows Vista+ 任务对话框,即操作系统为 Windows Vista 或更高版本并且
主题已启用并且
UseLatestCommonDialogs
全局变量为true
(默认值)。如果没有,VCL 实际上会创建一个自定义 TForm
并手动添加所有按钮、标签和图标(如果你问我,这有点奇怪 - 为什么不简单地使用 MessageBox
>?).
最后一种方法支持问号图标。确实,尝试一下
UseLatestCommonDialogs := false;
MessageDlg('This is a test', mtConfirmation, [mbYes, mbNo], 0);
但这看起来太难看了!请不要这样做!创建自定义消息对话框而不使用 native 操作系统对话框是愚蠢!
但不幸的是,任务对话框不支持问号图标(作为预定义图标)。这不是 TTaskDialog
包装器的限制,而是 Windows 任务对话框 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,
'This is a test.',
'Test',
MB_ICONQUESTION or MB_YESNO);
请注意,如果任务对话框 API 不可用,我会使用旧的 MessageBox
。
原则上,MessageDlg
函数可以使用附加逻辑以不同于信息、警告和错误情况的方式单独处理问号情况。这将使 mtConfirmation
即使在任务对话框中也能给出正确的图标,但代价是 VCL 代码稍微复杂一点,不太优雅。然而,显然,Embarcadero 选择了更简单的替代方案,即假装您要求提供信息图标。
不过,我想知道为什么 Microsoft 选择不在 API 中包含 TD_QUESTION_ICON 常量。也许他们最新的 UI 指南不鼓励使用这个图标?
关于delphi - MessageDlg 显示信息图标而不是确认,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6344366/
我有以下代码: IF MessageDlg('Delete?',mtConfirmation,[mbYes,mbNo],0) = MrYes THEN Begin ///Do Something; E
在 Win 7 上,MessageDlg 显示信息图标而不是确认图标(问号)。这是代码: MessageDlg('Are you sure you want to delete this file?'
德尔福6。 我实现了一个以所有者表单为中心的 MessageDlg 正如 @David Heffernan 于 2011 年 1 月 6 日建议的那样。 2011 年的原始问题在这里: How to
当我使用 MessageDlg()功能类似于下面的代码: if MessageDlg(SWarningWishToDelete + ' ' + PersonName + '?', mtWarnin
在使用 MessageDlg 并尝试通过 关闭我的应用程序时,我注意到一个奇怪的行为。任务栏关闭所有/组命令 . 我的申请如下: 有一个隐藏的主窗体除了处理一些 Windows 消息并将它们传递到子窗
为什么应用程序在执行线程时挂起并且该线程有 ShowMessage 或 MessageDlg 但是当使用 MessageBox 时一切正常。 如果应用程序外观不是默认的,所有这一切都会发生>>“ Wi
在 Delphi 10.1.2 Berlin 中,在 Vcl.Dialogs.MessageDlg 函数中,DlgType 常量 mtInformation 和 mtConfirmation 创建相同
考虑到这种情况: procedure TForm2.Button1Click(Sender: TObject); var Form: TForm; begin Form := TForm.Cr
我一直在使用与此类似的代码 MessageDlg('', mtWarning, [mbOK], 0); 在我的整个项目中(感谢 GExperts 消息对话框工具:)),我想知道是否有人知道一种方法可以
我是一名优秀的程序员,十分优秀!