7

多くの確認ダイアログでは、そのようなオプションがあると便利です (確認を無効にする簡単な方法)。しかし、私はそれを行う方法を見つけることができません。このダイアログを標準のようにする必要があり、Delphi の更新ごとに再設計する必要がないため、自分で設計したくありません。そのようなチェックボックスでDelphi標準の確認ダイアログを使用する簡単な方法はありますか?

更新2。Synopse プロジェクトの推奨される SynTaskDialog ライブラリは素晴らしい仕事をしてくれます (私が必要とするすべて、さらにはそれ以上のもの)。私は自分のプロジェクトでそれを使用します。ありがとう!

アップデート。それでは、アイデアをありがとうございました。システム関数 MessageBoxCheck は優れたソリューションですが、本来あるべきほど安定していないようです。一般に、最新の API 関数を使用して、ユーザーに最新の OS の最高の UI エクスペリエンスを提供し、古いシステムには昔ながらのデザインを使用することをお勧めします。現時点では、単純なソリューション (コードは次のとおりです) にとどまっていますが、最新の OS の 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/Seven 以降で利用可能な一般的なタスク ダイアログを提供します。ただし、以前のバージョンの Windows、つまり Windows XP や 2K では利用できません。

このユニット (MPL/GPL/LGPL の 3 ライセンスでライセンス) は、Vista/Seven で新しい TaskDialog API を使用し、XP または 2K で純粋な Delphi コードと標準テーマの VCL コンポーネントでそれをエミュレートします。XE4 までの Delphi 6 をサポートし、Win32/Win64 Unicode に対応しています。

以下は、Windows Seven 64 ビット コンピューターでの結果です。

ここに画像の説明を入力

エミュレートされた純粋な Delphi コードから作成された同じダイアログを次に示します。

ここに画像の説明を入力

このスクリーンショットは Win 7 マシンで作成されているため、スタイルはその OS にネイティブです。ダイアログのエミュレートされたバージョンが XP で実行されると、その OS にネイティブなスタイルで表示されます。

「次回はこの設定を要求しない」チェックボックスがあります...さらに多くの可能性があります!

于 2013-08-22T14:45:49.670 に答える
5

このような機能を提供するシステム ネイティブ機能は、Vista で導入されたタスク ダイアログAPI です。これにより、古い MessageBox API よりもはるかに機能的なダイアログを表示する手段が提供されます。

XP をサポートする必要がある場合は、独自のダイアログを作成する必要があります。たとえば、TForm から派生させて ShowModal を呼び出します。これを行う場合は、フォーム自体を動的に構築できるようにします。表示するメッセージごとに 1 つのフォームを作成しないでください。

私のコードベースには、タスク ダイアログ API の独自のラッパーがあります。これは、タスク ダイアログをサポートしない Windows のバージョンを実行時に検出し、カスタム ビルドの Delphi ダイアログにフォールバックします。

SHMessageBoxCheck に関しては、それに依存することに少し注意が必要です。そのドキュメントによると、XP を超えてサポートされていないため、序数でインポートする必要があります。個人的には、将来のバージョンの Windows から削除されるのではないかと心配しています。とはいえ、MS には、レガシー アプリを新しい OS リリースで動作させ続けるために必要なことは何でも行ってきた強力な実績があります。

于 2013-08-22T12:58:30.800 に答える