在许多确认对话框中,有这样的选项(禁用确认的快速方法)是很有用的。 但我无法找到如何做到这一点。我不想自己设计它,因为我需要这个对话框是标准的,不要随着Delphi的每次更新重新设计。是否有简单的方法使用带有这样的复选框的Delphi标准确认对话框?
UPDATE2。 Synopse项目推荐的SynTaskDialog库做得很好(我需要的甚至更多),我将在我的项目中使用它。谢谢!
更新。所以,谢谢你们的想法。系统函数MessageBoxCheck是一个不错的解决方案,但似乎不是那么稳定。总的来说,我同意最好使用最新的API函数为用户提供现代操作系统的最佳UI体验,并为旧系统使用老式设计。目前我仍然坚持简单的解决方案(代码如下),但如果有人在现代操作系统的UI支持下共享代码,那就太好了。
function MsgDlgWithCB(const Msg,Title,CBMsg: string; DlgType: TMsgDlgType;
Buttons: TMsgDlgButtons; DefaultButton: TMsgDlgBtn;
var cbDontAskAnymore: TCheckBox): TForm;
var
i: integer;
b: TButton;
y: integer;
begin
Result := CreateMessageDialog(Msg, DlgType, Buttons, DefaultButton) ;
Result.Position := poScreenCenter;
cbDontAskAnymore := TCheckBox.Create(Result);
cbDontAskAnymore.Caption := CBMsg;
cbDontAskAnymore.Width := 130;
y := -1;
for i := 0 to result.ComponentCount-1 do
if result.Components[i] is TButton then
begin
b := TButton(result.Components[i]);
b.Left := b.Left + cbDontAskAnymore.Width + 16;
Result.ClientWidth := Max(Result.ClientWidth, b.Left+b.Width+16);
y := b.Top+b.Height-cbDontAskAnymore.Height;
end;
if y<0 then
y := Result.ClientHeight - cbDontAskAnymore.height - 16;
Result.Caption := Title;
cbDontAskAnymore.Parent := Result;
cbDontAskAnymore.Top := y;
cbDontAskAnymore.Left := 8;
end;
function MessageDlgCheckbox(const Msg: string; DlgType: TMsgDlgType;
Buttons: TMsgDlgButtons; DefaultButton: TMsgDlgBtn;
var cbDontAskAnymore: Boolean;
const Title: string ='Confirmation';
const CBMsg: string = 'Don''t ask anymore'): integer;
var
f: TForm;
c: TCheckbox;
begin
f := MsgDlgWithCB(Msg,Title,CBMsg,DlgType,Buttons,DefaultButton,c);
try
result := f.ShowModal;
cbDontAskAnymore := c.Checked;
finally
f.free;
end;
end;
答案 0 :(得分:13)
您可以使用our Open Source SynTaskDialog unit。
Windows提供自Vista / Seven以来可用的通用任务对话框。但是以前版本的Windows(即Windows XP或2K)都没有。
此单元(根据MPL / GPL / LGPL三许可证授权)将使用Vista / Seven下的新TaskDialog API,并使用纯Delphi代码和XP或2K下的标准主题VCL组件进行仿真。它支持Delphi 6到XE4,并且支持Win32 / Win64 Unicode。
以下是Windows 7 64位计算机下的结果:
这是从我们模拟的纯Delphi代码创建的相同对话框:
由于此屏幕截图是在Win 7计算机上制作的,因此该操作系统的样式是原生的。当模拟版本的对话框在XP上运行时,它将以该操作系统的原生样式显示。
你有“下次不要求这个设置”复选框......还有更多!
答案 1 :(得分:5)
提供此类功能的系统本机功能是Vista中引入的task dialog API。这为您提供了比旧的MessageBox API显示功能更强大的对话框的方法。
如果您需要支持XP,则必须创建自己的对话框。例如,从TForm派生并调用ShowModal。如果这样做,请使表单能够动态构建自己。不要为每个显示的消息制作一个表单!
在我的代码库中,我有自己的任务对话框API包装器。这会在运行时版本的Windows中检测到不支持任务对话框并返回自定义构建的Delphi对话框。
关于SHMessageBoxCheck,我有点担心依赖它。根据它的文档,它不支持超出XP,你必须按顺序导入它。我个人担心它可能会从未来的Windows版本中删除。也就是说,MS在保持遗留应用程序处理新操作系统版本方面做出了一切努力。