1

TIBDatabaseTIBTransactionおよびTIBTableコンポーネントを使用して、EmbarcaderoDelphiXE2およびFirebirdDBを使用しています。フォームでは、ユーザーはDBテーブルのデータを編集し、必要に応じて変更をコミット/ロールバックできます。彼がフォームを閉じるときに、保留中の変更をコミット/ロールバックするかどうかを尋ねたいと思います。

ただし、保留中の変更がある場合のみ。そうでなければ、私はユーザーを煩わせたり混乱させたりしたくありません。どうすればそれを判断できますか?トランザクションのプロパティを試しましたが、常に正しいActiveです。役に立つ場合は、トランザクションでtrueInTransactionに設定したことに注意してください。AllowAutoStartありがとう!

4

2 に答える 2

4

AfterDelete保留中の更新を自分で追跡できます。テーブルとAfterPostイベントでフラグをオンにします。でオフにしAfterTransactionEndます:

// IBTable1.AfterDelete
procedure TForm1.IBTable1AfterDelete(DataSet: TDataSet);
begin
  FPendingUpdates := True;
end;

// IBTable1.AfterPost
procedure TForm1.IBTable1AfterPost(DataSet: TDataSet);
begin
  FPendingUpdates := True;
end;

// IBTable1.AfterTransactionEnd
procedure TForm1.IBTable1AfterTransactionEnd(Sender: TObject);
begin
  FPendingUpdates := False;
end;

// Form1.OnCloseQuery
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
  DlgResult: TModalResult;
begin
  CanClose := False;

  if FPendingUpdates then
    DlgResult := MessageDlg('Commit pending updates before closing?', mtConfirmation,
      [mbYes, mbNo, mbCancel], 0, mbCancel)
  else
    DlgResult := mrNo;

  case DlgResult of
    mrYes:
      IBTransaction1.Commit;
    mrNo:
      IBTransaction1.Rollback;
    mrCancel:
      Exit;
  end;

  CanClose := True;
end;
于 2012-10-09T08:36:28.267 に答える