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.
- 1. Istanziare una classe Python da un nome
- 2. Come posso istanziare un oggetto conoscendo solo il suo nome?
- 3. Un modo per chiedere un metodo per il suo nome?
- 4. Chiamare un Windows Form con il suo nome di classe
- 5. modo Groovy per istanziare dinamicamente una classe da String
- 6. Istanziare una classe CoffeeScript da un nome classe in una stringa
- 7. Istanziare una classe con o senza parentesi?
- 8. Come istanziare la classe dalla stringa del nome in Rails?
- 9. sintassi Strano per istanziare una classe interna
- 10. Istanziare un oggetto COM legacy in C# in modo dinamico (usando il suo ID in una stringa)
- 11. Istanziare dinamicamente una classe tramite la variabile
- 12. Istanziare una classe da una stringa
- 13. Delphi Classe variabile per classe
- 14. Come istanziare una classe javascript in un altro file js?
- 15. Sostituzione di una classe componente in delphi
- 16. È questo il modo corretto per impostare il nome di un thread in Delphi 6?
- 17. Come ottenere il riferimento al tipo di classe in base al nome in Delphi XE?
- 18. Come istanziare una classe astratta Java con un parametro costruttore con una chiusura groovy
- 19. un'istanza di una classe dal suo nome testuale
- 20. Perché il costruttore viene chiamato se la classe ha un metodo (funzione) con il suo nome?
- 21. Possiamo creare una classe con il nome "classe"?
- 22. Utilizzare il valore audioSessionId per istanziare la classe AudioFx?
- 23. È possibile istanziare una classe astratta?
- 24. Un membro di una classe può avere lo stesso nome del suo tipo (un'altra classe)?
- 25. PHP può istanziare un oggetto dal nome della classe come una stringa?
- 26. Rileva un pronome e il suo nome?
- 27. C'è un modo per istanziare un NSManagedObject senza inserirlo?
- 28. Come creare un'istanza di una classe dal suo TRttiType?
- 29. Posso istanziare una classe usando l'oggetto classe? E i costruttori?
- 30. Utilizzare un enum per scegliere quale classe istanziare
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 –