7

在许多确认对话框中,有这样的选项很有用(快速禁用确认)。但我找不到如何做到这一点。我不想自己设计它,因为我需要这个对话框是标准的,并且不会随着 Delphi 的每次更新而重新设计。有没有简单的方法来使用带有此类复选框的 Delphi 标准确认对话框?

更新2。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;
4

2 回答 2

13

您可以使用我们的开源SynTaskDialog单元

Windows 提供了自 Vista/7 以来可用的通用任务对话框。但是以前版本的 Windows 没有可用的,即 Windows XP 或 2K。

该单元(根据 MPL/GPL/LGPL 三重许可证获得许可)将使用 Vista/Seven 下的新 TaskDialog API,并在 XP 或 2K 下使用纯 Delphi 代码和标准主题 VCL 组件对其进行仿真。它支持 Delphi 6 到 XE4,并且支持 Win32/Win64 Unicode。

这是在 Windows 7 64 位计算机下的结果:

在此处输入图像描述

这是从我们模拟的纯 Delphi 代码创建的相同对话框:

在此处输入图像描述

由于此屏幕截图是在 Win 7 机器上制作的,因此样式是该操作系统的原生样式。当对话框的模拟版本在 XP 上运行时,它会以该操作系统的原生样式显示。

你有你的“下次不要要求这个设置”复选框......而且可能还有更多!

于 2013-08-22T14:45:49.670 回答
5

提供此类功能的系统本机功能是Vista 中引入的任务对话框API。这为您提供了显示比旧 MessageBox API 更强大的对话框的方法。

如果您需要支持 XP,那么您必须创建自己的对话框。例如,从 TForm 派生并调用 ShowModal。如果你这样做,使表单能够动态地构建自己。不要为您显示的每条消息制作一个表格!

在我的代码库中,我有自己的任务对话框 API 包装器。这会在运行时检测不支持任务对话框的 Windows 版本,并退回到自定义构建的 Delphi 对话框。

关于 SHMessageBoxCheck 我对依赖它有点警惕。根据其文档,XP 之外不支持它,您必须按序号导入它。我个人担心它可能会从未来版本的 Windows 中删除。也就是说,MS 在不惜一切代价让旧版应用程序与新的操作系统版本一起工作方面有着良好的记录。

于 2013-08-22T12:58:30.800 回答