加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何使用Delphi标准确认对话框但带有复选框“不要再问我”?

发布时间:2020-12-15 04:16:03 所属栏目:大数据 来源:网络整理
导读:在许多确认对话框中,有这样的选项是有用的(快速方法来禁用确认). 但我找不到如何做到这一点.我不想自己设计它,因为我需要这个对话框是标准的,不要随着Delphi的每次更新重新设计.有没有简单的方法使用Delphi标准确认对话框这样的复选框? UPDATE2. Synopse项
在许多确认对话框中,有这样的选项是有用的(快速方法来禁用确认).
但我找不到如何做到这一点.我不想自己设计它,因为我需要这个对话框是标准的,不要随着Delphi的每次更新重新设计.有没有简单的方法使用Delphi标准确认对话框这样的复选框?

UPDATE2. Synopse项目推荐的SynTaskDialog库做得很好(我需要的甚至更多),我将在我的项目中使用它.谢谢!

UPDATE.所以,谢谢你们的想法.系统函数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,CBMsg,DefaultButton,c);
  try
    result := f.ShowModal;
    cbDontAskAnymore := c.Checked;
  finally
    f.free;
  end;
end;

解决方法

你可以使用 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上运行时,它将以该操作系统的原生样式显示.

你有“下次不要求这个设置”复选框……还有更多!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读