7

私は Delphi XE、Windows 7 で作業しています。

アプリケーションで、ユーザーが選択できるさまざまなレポート タイプを有効にしたいと考えています。これを行うために、1 つのベース レポート クラスと、レポート タイプ (xml、csv、ppt など) ごとに 1 つのサブクラスがあります。

{Just an illustrating example}
TBaseReport = class
public
  constructor Create;
  procedure GenerateReport; virtual; abstract;
  class function ReportType: string; virtual; abstract;
end;

T*Report = class(TBaseReport);
//Etcetera.

私がやりたいことは、Rtti を使用してすべてのレポート クラスを検出し、それらの ReportType を一覧表示することです。その後、Rtti を使用して、選択したレポート クラスのインスタンスを作成し、GenerateReport を呼び出します。全体として、これを達成するのはそれほど難しくありません。

ただし、大きな欠点があります。降順クラスの使用をハードコーディングすることは決してないため、コードが実行可能ファイルに含まれません。

リンカー/コンパイラにこれらのクラスを強制的に含める適切な方法はありますか?

(醜い)回避策は、初期化セクションでレポートの使用をシミュレートすることですが、私はむしろそれをしたくありません。より良い解決策は、基本クラスを永続化し、'RegisterClass(T*Report);' を呼び出すことです。初期化セクションにあります。それは機能しますが、それらを永続化する必要があるとは思わないので、繰り返しますが、それはしたくありません。一方で、これしか方法がないのではないでしょうか?

前もって感謝します。

4

2 に答える 2

7

独自のバージョンのRegisterClassを作成できます。RegisterReportClassのようなもの。内部的には、使用できるレポートクラスの独自のリストを保持します。登録関数はTBaseReportクラスタイプを取ります-TPersistentは必要ありません。

RegisterReportClassメソッドは、クラスが含まれていることを確認するために、初期化セクションで呼び出す必要があります。

グラフィックスユニットを見ると、TFileFormatsList = class(TList)がわかります。これは、さまざまなグラフィックタイプを保持するために使用されるクラスであり、独自のTReportFormatsListを作成するための例として使用できます。Delphiは、静的関数TPicture.RegisterFileFormatを使用して、アイテムを内部リストに追加します。

于 2012-09-22T23:39:23.760 に答える
5

コンパイラ ディレクティブを使用して{$STRONGLINKTYPES ON}、アプリのすべてのシンボルを最終的な exe に含めることができます。このオプションを使用すると、実行可能ファイルに含まれる RTTI が増えるため、実行可能ファイルのサイズが大きくなることに注意してください。

于 2012-09-23T00:21:01.707 に答える