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 のコードは呼び出されません。そもそもオブジェクトの作成を制御できない場合、オブジェクトをオーバーライドする方法はありますか?