私はいくつかの基本的な 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.