Est-il possible d'instancier une classe par son nom en delphi?
j'aimerais instancier une classe mais je n'ai son nom que dans une chaîne. Est-il possible?
2 réponses
C'est de Delphi help (Delphi 2006, mais aussi disponible au moins Delphi 7):
syntaxe fonction GetClass (constaclassname: string): TPersistentClass;
Description Appelez GetClass pour obtenir une classe à partir d'un nom de classe. Cette classe peut être utilisée comme paramètre pour les routines qui nécessitent une classe. La classe doit être enregistrée avant que GetClass puisse la trouver. Classes de forme et composants les classes qui sont référencées dans une déclaration de formulaire (variables d'instance) sont automatiquement enregistrées lorsque le formulaire est chargé. D'autres classes peuvent être enregistrées en appelant RegisterClass ou RegisterClasses .
voici un exemple de code. Fonctionne comme tel uniquement parce que TButton est un TControl et donc le typecast est valide.
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;
quand j'ai eu besoin de faire cela, j'ai construit ma propre usine D'objets qui utilise une sous-Clas Sionnée TStringList, j'utilise actuellement Delphi 7 de sorte que la classe de liste de chaînes supporte seulement attacher un objet à une chaîne, puis je suis arrivé à la sous-classe TStringList pour le rendre possible Gérer les Types de classe aussi, donc maintenant je peux instancier un objet juste en passant son nom de classe à l'usine. Ça marche comme ça:
1er - Charger un Objet Singleton Usine;
2st - enregistrer n'importe quel objet de l'usine, pourrait être dans la section initialisation de l'unité;
les méthodes de L'usine principale pourraient être: isClassRegistered, registerClass, instantiateClass (nom de classe: STring): TObject;
de cette façon je peux instancier n'importe quel objet, ou utiliser un objet instancié précédent, ou même, un sous-ensemble de ceux-ci.
j'utilise plutôt un type énuméré au lieu d'une chaîne pour identifier une classe.
Remarque: c'est un très, très laconique exemple, un entièrement fonctionnel code est plus complexe, mais, crois-moi, pas trop.