1

Delphi 2007 でサード パーティ レポート VCL パッケージを使用しています。このパッケージのいくつかのオブジェクトが持つ各機能にコードを追加したいと考えています。しかし、アプリケーションで多くのコードを書き直さなくても済むようにしたいのです。私が今持っているものは次のとおりです。

TBaseReport (Base object with all abstract functions)
     |
     --------------
     |            |
TViewReport   TPrintReport  (Descendents that do the actual implementation of the functions)

レポート パッケージは、レポートの印刷プロセス中に多数のイベントを呼び出します。各イベントには、TViewReport (レポートを画面に表示する場合) または TPrintReport (直接印刷する場合) のいずれかのインスタンスを持つ TObject パラメータが渡されます。例えば:

Function TForm1.BeforePrint(Sender: TObject);
Begin
  With TBaseReport(Sender) Do // Type cast as TBaseReport so code works with either
  Begin                       //  TViewReport or TPrintReport.
    .... code here ...
  End;
End;

私がやりたいのは、TBaseReport (TMyBaseReport など) の新しい子孫を作成し、同じ関数のいくつかをオーバーライドして、継承されたコードを呼び出す前に自分のコードを最初に呼び出すことです。もちろん、私が抱えている問題は、TBaseReport のすべての関数が抽象的であるため、TBaseReport をオーバーライドできないことです。そこで、TViewReport と TPrintReport をオーバーライドする 2 つのオブジェクトを作成しました。次に、次のようなことを試しました。

Type
  TMyReportPrinter = Class(TReportPrinter)
  Public
    Procedure PrintText(X, Y: Integer; S: String); Override;
  End;

  TMyViewReport = Class(TViewReport)
  Public
    Procedure PrintText(X, Y: Integer; S: String); Override;
  End;

.
.
.

Function TForm1.BeforePrint(Sender: TObject);
Var
  Rpt: TBaseReport;
Begin
  If Sender Is TReportPrinter Then 
    Rpt := TMyReportPrinter(Sender) 
  Else
    Rpt := TMyViewReport(Sender);
  With Rpt Do 
  Begin       
    PrintText(1.5, 1.5, 'Foobar');
    .... same original code here ...
  End;
End;

Procedure TMyReportPrinter.PrintText(X, Y: Integer; S: String); 
Begin
  Inherited;
  LogMsg('PrintText called.');
End;

Procedure TMyViewReport.PrintText(X, Y: Integer; S: String); 
Begin
  Inherited;
  LogMsg('PrintText called.');
End;

ただし、TMyReportPrinter と TMyViewReport のコードは呼び出されません。そもそもオブジェクトの作成を制御できない場合、オブジェクトをオーバーライドする方法はありますか?

4

1 に答える 1