C'è un modo per creare un'istanza di una classe con il suo nome in Delphi?
Domanda
Mi piacerebbe creare un'istanza di una classe ma ho solo il suo nome in una stringa. C'è un modo?
Soluzione
Questo è da Delphi aiuto (Delphi 2006, ma anche a disposizione di almeno Delphi 7):
Sintassi GetClass funzione (const AClassName: String): TPersistentClass;
Descrizione Chiamata getClass di ottenere una classe da un nome di classe. Questa classe può essere utilizzato come parametro per le routine che richiedono una classe. La classe deve essere registrato prima getClass possa trovarlo. classi di form e classi di componenti cui si fa riferimento in una dichiarazione forma (variabili di istanza) vengono registrati automaticamente quando il modulo viene caricato. Altre classi possono essere registrati chiamando RegisterClass o RegisterClasses.
Ecco alcuni esempi di codice. Funziona come tale solo perché è un TButton TControl e quindi il typecast è valido.
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;
Altri suggerimenti
Quando ho avuto bisogno di farlo, ho costruito la mia propria fabbrica oggetto che utilizza un TStringList appositamente sottoclasse, Attualmente sto usando Delphi 7 quindi la classe lista di stringhe supporta allegare solo un oggetto in una stringa, poi ho avuto modo di sottoclasse TStringList per rendere possibile Tipi maniglia di classe anche, in modo ora posso un'istanza di un oggetto solo di passaggio è il nome della classe alla fabbrica. Funziona in questo modo:
1 ° - caricare un oggetto di fabbrica Singleton;
2 ° - Registrati qualsiasi oggetto alla fabbrica, potrebbe essere nella sezione di inizializzazione dell'unità;
metodi della fabbrica principale potrebbe essere: isClassRegistered, registerClass, instantiateClass (ClassName: String): TObject;
In questo modo posso istanziare un oggetto, o utilizzare un oggetto istanziato precedente, o addirittura, un sottoinsieme di essi.
Io invece uso un tipo enumerato invece di una stringa per identificare una classe.
Note:. E 'un esempio molto, molto stringato, un codice completamente funzionale è più complessa, ma, belive me, non troppo