Delphiでクラスを名前でインスタンス化する方法はありますか?
質問
クラスをインスタンス化したいのですが、文字列にはその名前しかありません。方法はありますか?
解決
これは Delphi ヘルプからのものです (Delphi 2006 ですが、少なくとも Delphi 7 以降でも利用可能です)。
構文 function GetClass(const AClassName:弦):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を使用していますので、文字列リストクラスのみがオブジェクトを文字列に添付サポートし、その後、私はTStringListのをサブクラス化するようになりましたあまりにもそれの可能なハンドルクラスの型にするために、今私はちょうど工場にのクラス名を渡してオブジェクトをインスタンス化することができます。そのように動作します:
第一 - シングルトンオブジェクトファクトリをロードします。
2ST - ユニットの初期化セクションであってもよい、工場に任意のオブジェクトを登録し、
メイン工場のメソッドは次のようになります。isClassRegistered、registerClass、instantiateClass(クラス名:文字列):TObjectの;
私は、でも彼らのサブセットを任意のオブジェクトをインスタンス化し、または前のインスタンス化されたオブジェクトを使用するか、またはすることができます。この方法
私はむしろ代わりにクラスを識別するための文字列の列挙型を使用します。
備考:それは非常に、非常に簡潔な例ですが、完全に機能コードがあまりにも、私を信じていない、より複雑ですが、
。