Vorrei creare un'istanza di una classe, ma ho solo il suo nome in una stringa. C'è un modo?C'è un modo per istanziare una classe con il suo nome in delphi?
risposta
Questo è da Delphi aiuto (Delphi 2006, ma disponibili anche da almeno Delphi 7):
Sintassi getClass funzione (const AClassName: String): TPersistentClass;
Descrizione Chiama GetClass per ottenere una classe dal nome di una classe. Questa classe può essere utilizzata come parametro per le routine che richiedono una classe. La classe deve essere registrata prima che GetClass possa trovarla. Le classi di moduli e le classi di componenti a cui viene fatto riferimento in una dichiarazione di modulo (variabili di istanza) vengono registrate automaticamente quando viene caricato il modulo. Altre classi possono essere registrate chiamando RegisterClass o RegisterClasses.
Ecco alcuni esempi di codice. Funziona come tale solo perché TButton è un 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;
Quando avevo 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 è arrivato a sottoclasse TStringList per rendere possibile gestire anche i Class Type, così ora posso istanziare un oggetto semplicemente passando il suo nome di classe alla factory. Funziona in questo modo:
1 ° - Carica una fabbrica oggetto Singleton;
2st - Registrare qualsiasi oggetto in fabbrica, potrebbe essere nella sezione di inizializzazione dell'unità;
I metodi della Factory principale possono essere: isClassRegistered, registerClass, instantiateClass (ClassName: STring): TObject;
In questo modo è possibile creare un'istanza di qualsiasi oggetto o utilizzare un oggetto istanziato precedente o persino un sottoinsieme di essi.
Preferisco usare un tipo enumerato invece di una stringa per identificare una classe.
Note: È un esempio molto, molto conciso, un codice completamente funzionale è più complesso, ma, credetemi, non troppo.
Ottima soluzione. Ma ora mi sono imbattuto in un altro problema. La classe che vorrei istanziare è una mia classe che implementa un'interfaccia. E registerClass deve essere chiamato con una classe persistente. Qualche idea? –
È possibile derivare la tua classe o uno dei suoi antenati da TPersistent? –
Non credo, dal momento che implementa un'interfaccia e deve derivare da TInterfaceObject –