1

当我想确认表单退出时,我使用DialogMsg带有 if 的调用将Action参数设置为caNone(No) 或caHide(yes)。

当我将这种方法与数据库表行发布一起使用时,我遇到了一个问题。

如果我使用确认对话框创建一个保存按钮,我可以调用Postor Cancel,但是当我在表单中有一个数据库Grid时,当用户更改一行并稍后选择另一行时,问题就出现了,女巫会自动保存前一行。

我找到的解决方案是把保存确认对话框放在里面OnBeforePost,但是如果用户说不,我应该如何取消Post命令继续?我已经尝试过Cancel命令Abort,但它会继续保存该行。

4

1 回答 1

2

您需要创建自己的后代(或您正在使用的其他数据集类型)TMyQueryTXxxQuery并在您的类中覆盖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 回答