在Win 7上,MessageDlg显示信息图标而不是确认图标(问号)。代码如下:
MessageDlg('Are you sure you want to delete this file?'+ CRLF+ FileName, mtConfirmation, [mbYes, mbNo], 0)= mrYes
我做错了什么?
k5ifujac1#
首先,请注意,一个简单的解决方法是使用Windows API MessageBox函数:
MessageBox
MessageBox(Handle, 'This is a test.', 'Test', MB_ICONQUESTION or MB_YESNO)
为什么MessageDlg不工作?MessageDlg有两种可能。它使用Windows Vista+任务对话框,如果可能的话,也就是说,它的操作系统是Windows Vista或更高版本的and主题启用and的UseLatestCommonDialogs全局变量是true(默认值)。如果没有,VCL实际上会创建一个自定义的TForm,并手动添加所有按钮、标签和图标(如果你问我,这有点奇怪--为什么不简单地使用MessageBox呢?).最后一种方法支持问号图标。的确,试试看
MessageDlg
and
UseLatestCommonDialogs
true
TForm
UseLatestCommonDialogs := false;MessageDlg('This is a test', mtConfirmation, [mbYes, mbNo], 0);
UseLatestCommonDialogs := false;
MessageDlg('This is a test', mtConfirmation, [mbYes, mbNo], 0);
但这看起来很丑!求你别这样!创建一个自定义消息对话框而不是使用本机操作系统对话框是愚蠢的!然而,不幸的是,任务对话框不支持问号图标(* 作为预定义图标 *)。这不是TTaskDialog Package 器的限制,而是Windows任务对话框API的限制。例如,参见official documentation。有TD_ERROR_ICON,TD_WARNING_ICON和TD_INFORMATION_ICON,但没有问号图标。当然,任务对话框可以使用 * 任何 * 图标。例如,你可以
TTaskDialog
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);
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指南中是不鼓励的?
mtConfirmation
h22fl7wq2#
如果您需要一些对话框,您可以看看我们的Open Source SynTaskDialog unit for Windows XP,Vista,Seven。它将在Vista和Seven下调用本地任务对话框,并在XP下模拟它。与标准Dialogs单元或Windows API相比,您将拥有更好的交互,并将拥有您的确认图标,正如预期的那样。以下是在Windows Seven 64位计算机下的结果:
下面是从我们的仿真纯 Delphi 代码创建的相同对话框:
下面是一个选择任务对话框,带有“命令链接”按钮,在本地Seven中:
下面是使用VCL仿真代码创建的窗口:
请注意,有确认图标。;)从 Delphi 6到XE。
mlmc2os53#
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);
Caption := 'Delete';
Title := 'Are you sure to remove the minecraft?';
Text := 'if you delete minecraft it well be gone forever.';
'if you delete minecraft it well be gone forever.',
'Are you sure to remove the minecraft?',
mrwjdhj34#
if MessageDlg('Are You Want To Exit And Close All Form ? ', mtConfirmation, [mbYes, mbNo] , 0) = mrYes thenbeginMain_Form.Close;end;
if MessageDlg('Are You Want To Exit And Close All Form ? ', mtConfirmation, [mbYes, mbNo] , 0) = mrYes then
begin
Main_Form.Close;
end;
4条答案
按热度按时间k5ifujac1#
首先,请注意,一个简单的解决方法是使用Windows API
MessageBox
函数:为什么
MessageDlg
不工作?MessageDlg
有两种可能。它使用Windows Vista+任务对话框,如果可能的话,也就是说,它的操作系统是Windows Vista或更高版本的and
主题启用and
的UseLatestCommonDialogs
全局变量是true
(默认值)。如果没有,VCL实际上会创建一个自定义的TForm
,并手动添加所有按钮、标签和图标(如果你问我,这有点奇怪--为什么不简单地使用MessageBox
呢?).最后一种方法支持问号图标。的确,试试看
但这看起来很丑!求你别这样!创建一个自定义消息对话框而不是使用本机操作系统对话框是愚蠢的!
然而,不幸的是,任务对话框不支持问号图标(* 作为预定义图标 *)。这不是
TTaskDialog
Package 器的限制,而是Windows任务对话框API的限制。例如,参见official documentation。有TD_ERROR_ICON
,TD_WARNING_ICON
和TD_INFORMATION_ICON
,但没有问号图标。当然,任务对话框可以使用 * 任何 * 图标。例如,你可以
请注意,如果任务对话框API不可用,我将使用旧的
MessageBox
。原则上,
MessageDlg
函数可以使用额外的逻辑来单独处理问号情况,其方式与信息、警告和错误情况不同。这将使mtConfirmation
即使在任务对话框中也能给予正确的图标,代价是稍微复杂一些,不那么优雅的VCL代码。然而,显然,Embarcadero选择了一个更简单的替代方案,即简单地假装你要求信息图标。不过,我还是想知道为什么Microsoft选择不在API中包含TD_QUESTION_ICON常量。也许这个图标在他们最新的UI指南中是不鼓励的?
h22fl7wq2#
如果您需要一些对话框,您可以看看我们的Open Source SynTaskDialog unit for Windows XP,Vista,Seven。
它将在Vista和Seven下调用本地任务对话框,并在XP下模拟它。与标准Dialogs单元或Windows API相比,您将拥有更好的交互,并将拥有您的确认图标,正如预期的那样。
以下是在Windows Seven 64位计算机下的结果:
下面是从我们的仿真纯 Delphi 代码创建的相同对话框:
下面是一个选择任务对话框,带有“命令链接”按钮,在本地Seven中:
下面是使用VCL仿真代码创建的窗口:
请注意,有确认图标。;)
从 Delphi 6到XE。
mlmc2os53#
mrwjdhj34#