4

私はいくつかの基本的な TAction クラス (TDataSetAdd や TDataSetReOpen など) を書きましたが、それは魅力的に機能します。ここで、トランザクションのコミットを処理するアクションを作成しようとしましたが、何らかの理由で動作が予期しないものになりました。「HandlesTarget」関数は、フォーム上にあるにもかかわらず、トランザクション コンポーネントをオブジェクトとしてまったく表示しませんか? 私は何が欠けていますか?前もって感謝します。

  TFDTransactionAction = class(TAction)
  private
    FTransaction: TFDTransaction;
    procedure SetTransaction(Value: TFDTransaction);
  protected
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  public
    function HandlesTarget(Target: TObject): Boolean; override;
    property Transaction: TFDTransaction read FTransaction write SetTransaction;
  end;

  TFDCommitAction = class(TFDTransactionAction)
  public
    procedure ExecuteTarget(Target: TObject); override;
    procedure UpdateTarget(Target: TObject); override;
  published
    property Transaction;
  end;

{ TFDTransactionAction }

function TFDTransactionAction.HandlesTarget(Target: TObject): Boolean;
begin
  Result := ((Transaction <> nil) or
    (Transaction = nil) and (Target is TFDTransaction));
end;

procedure TFDTransactionAction.Notification(AComponent: TComponent;
  Operation: TOperation);
begin
  inherited Notification(AComponent, Operation);
  if (Operation = opRemove) and (AComponent = Transaction) then
    Transaction := nil;
end;

procedure TFDTransactionAction.SetTransaction(Value: TFDTransaction);
begin
  if FTransaction <> Value then
  begin
    FTransaction := Value;
    if Value <> nil then
      Value.FreeNotification(Self);
  end;
end;

{ TFDCommitAction }

procedure TFDCommitAction.ExecuteTarget(Target: TObject);
begin
  Transaction.Commit
end;

procedure TFDCommitAction.UpdateTarget(Target: TObject);
begin
  Enabled := TFDTransaction(Target).Active
end;

end.
4

0 に答える 0