クラスをインスタンス化したいのですが、文字列にその名前しかありません。方法はありますか?
2 に答える
これは Delphi ヘルプからのものです (Delphi 2006 ですが、少なくとも Delphi 7 からも利用できます)。
構文 関数 GetClass(const AClassName: string): TPersistentClass;
説明 GetClass を呼び出して、クラス名からクラスを取得します。このクラスは、クラスを必要とするルーチンへのパラメーターとして使用できます。GetClass がクラスを見つける前に、クラスを登録する必要があります。フォーム宣言で参照されているフォーム クラスとコンポーネント クラス (インスタンス変数) は、フォームのロード時に自動的に登録されます。他のクラスは、 RegisterClass または RegisterClasses を呼び出して登録できます。
ここにいくつかのサンプルコードがあります。TButton が TControl であり、型キャストが有効であるという理由だけで、そのように機能します。
procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterClasses([TButton, TForm]);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
CRef : TPersistentClass;
AControl : TControl;
begin
CRef := GetClass('TButton');
if CRef<>nil then
begin
AControl := TControl(TControlClass(CRef).Create(Self));
with AControl do
begin
Parent := Self;
Width := 50;
Height := 30;
end;
end;
end;
それを行う必要があるとき、私は特別にサブクラス化された TStringList を使用する独自のオブジェクト ファクトリを構築しました。現在 Delphi 7 を使用しているため、文字列リスト クラスはオブジェクトを文字列にアタッチすることしかサポートされていません。クラス型も処理できるので、クラス名をファクトリに渡すだけでオブジェクトをインスタンス化できます。そのように動作します:
1st - シングルトン オブジェクト ファクトリをロードします。
2st - 任意のオブジェクトをファクトリに登録します。ユニットの初期化セクションにある可能性があります。
主な Factory のメソッドは次のとおりです。isClassRegistered、registerClass、instantiateClass(ClassName: STring): TObject;
このようにして、任意のオブジェクトをインスタンス化することも、以前にインスタンス化されたオブジェクトを使用することも、それらのサブセットを使用することもできます。
クラスを識別するために、文字列の代わりに列挙型を使用します。
備考: これは非常に簡潔な例です。完全に機能するコードはより複雑ですが、信じてください。