Delphi - Créer une classe à partir d'une chaîne
J'ai reçu un code comme ceci
name := 'Foo';
If name = 'Foo' then
result := TFoo.Create
else if name = 'Bar' then
result := TBar.Create
else if name = 'FooFoo' then
result := TFooFoo.Create;
Est-il un moyen juste pour faire
result := $name.create
ou un moyen de créer de la classe en fonction de la valeur d'une variable?
Toutes les classes étendues de la même classe de base.
source d'informationauteur Wizzard
Vous devez vous connecter pour publier un commentaire.
De départ avec Delphi 2010, le renforcement de la RTTI vous permet de le faire sans avoir à créer votre propre Classe de Registre.
À l'aide de la
RTTI
Unité, vous avez plusieurs options disponibles.Pour le Paramètre Moins l'un des Constructeurs les plus simples est.
Voici un exemple de passage d'un paramètre à l'aide de la
TRttiMethod.Invoke()
J'ai écrit plusieurs articles sur le
RTTI
unité qu'il y a de nombreuses options disponibles.Mis à jour Basé sur David Demande:
Comparant l'utilisation de la construction en utilisant le Type de Classe Virtuelle (Constructeur) avec le
TRttiType.Invoke
Type De Classe De La Méthode: (Virtuel Constructeur)
TRttiType.Invoke() la méthode
Personnellement, je trouve que chacun a un but différent. Si je connais tous les types à l'avant j'utilise la Classe Type de Méthode.
Vous pouvez utiliser le
GetClass
fonction, mais avant vous devez inscrire les classes à l'aide de laRegisterClass
ouRegisterClasses
méthodes.La façon normale de faire, c'est avec des constructeurs virtuels. Un bon exemple est
TComponent
qui vous sont sans doute familiers.TComponent
a le constructeur suivant:L'autre clé, c'est
TComponentClass
ce qui est déclaré commeclass of TComponent
.Lors de la VCL ruisseaux .dfm fichiers qu'il lit le nom de la classe à partir de l' .dfm fichier et, par un processus que nous n'avons pas besoin de couvrir ici, convertit ce nom dans une variable,
ComponentClass
dire de typeTComponentClass
. Il peut ensuite instancier l'objet avec:C'est le grand avantage d'avoir un constructeur virtuel et je voudrais vous encourager à prendre la même approche.
Si vous devez utiliser une chaîne de caractères pour identifier la classe, alors vous aurez toujours besoin de venir avec une recherche de routine pour convertir la chaîne de caractères nom de la classe à une classe de référence. Vous pouvez, si commode, crochet dans le même VCL mécanisme qui
TComponent
utilise, à savoirRegisterClass
.Sinon, si vous pouviez remplacer
name
dans votre code avec une classe de référence, alors vous pourriez écrire: