1

フォームの終了を確認したい場合は、if を使用してパラメーターを(No) または(yes)DialogMsgに設定する呼び出しを使用します。ActioncaNonecaHide

データベース テーブルの行の転記でそのアプローチを使用すると、問題が発生します。

確認ダイアログで [保存] ボタンを作成すると、PostまたはCancelを呼び出すことができますが、フォームにデータベースGridがある場合、ユーザーが行を変更し、後で別の行を選択すると、前の行が自動的に保存されます。

私が見つけた解決策は、保存確認ダイアログを 内に配置することでしたが、ユーザーが「いいえ」と言った場合、続行するコマンドをOnBeforePostキャンセルするにはどうすればよいですか? Postコマンドを試してみましCancelAbortが、行の保存が続行されます。

4

1 に答える 1

2

(または使用している他のデータセットの種類)の独自の子孫TMyQueryを作成する必要があります。TXxxQueryそして、クラスオーバーライドPostメソッドで新しいイベントを追加し、決定できるようにするPost必要があります。TXxxQuery次に、新しいコンポーネントを登録し、アプリケーションで。に置き換えますTMyQuery。そして、イベントハンドラーを作成します。

たとえば、TMyQuery

interface

type
  TMyAllowPostEvent = procedure (ASender: TDataSet; var AAllow: Boolean) of object;
  TMyQuery = class (TXxxQuery)
  private
    FOnAllowPost: TMyAllowPostEvent;
  public
    procedure Post; override;
  published
    property OnAllowPost: TMyAllowPostEvent read FOnAllowPost write FOnAllowPost;
  end;

implementation

procedure TMyQuery.Post;
var
  lAllow: Boolean;
begin
  lAllow := True;
  if Assigned(OnAllowPost) then
    OnAllowPost(Self, lAllow);
  if lAllow then
    inherited Post;
end;

そして、イベントハンドラーの例:

procedure TForm1.MyQuery1AllowPost(ASender: TDataSet; var AAllow: Boolean);
begin
  AAllow := MessageDlg('Would you like to save changes ?', mtConfirmation, mbYesNo, -1) = mrYes;
end;
于 2012-08-13T10:00:52.960 に答える