2010-04-28 14 views
4

J'ai des noms de classe dans une liste de chaînes. Par exemple, il peut s'agir de 'TPlanEvent', 'TParcel', 'TCountry', etc.Comment convertir un nom de classe en chaîne en une classe?

Maintenant, je veux connaître les tailles en bouclant la liste.

Il travaille à avoir:

Size := TCountry.InstanceSize; 

Mais je veux comme ceci:

for i := 0 to ClassList.Count - 1 do 
    Size := StringToClass(ClassList[i]).InstanceSize; 

Il est évident que ma question est de savoir quoi écrire au lieu de la méthode StringToClass pour convertir la chaîne à une classe.

Répondre

10

Puisque vous utilisez un stringlist vous pouvez stocker les classes là aussi:

var 
    C: TClass; 

    StringList.AddObject(C.ClassName, TObject(C)); 

...

for I := 0 to StringList.Count - 1 do 
    Size := TClass(StringList.Objects[I]).InstanceSize; 

...

+1

+ 1. Plus simple que la solution FindClass. :-) –

+1

ceci bien sûr ne fonctionne que si l'OT remplit la liste lui-même, pas si cette liste est par exemple lue dans un fichier ou quelque chose comme ça ... –

2
  1. Vous devez utiliser FindClass pour trouver la référence de classe par son nom. Si la classe n'est pas trouvée, l'exception sera levée.
  2. En option, vous devez appeler RegisterClass pour vos classes, si elles ne sont pas explicitement référencées dans le code.
8

Si vos classes dérivent de TPersistent vous pouvez utiliser RegisterClass et FindClass ou GetClass. Sinon, vous pourriez écrire vous-même un mécanisme d'enregistrement.

6

En Delphi 2010, vous pouvez utiliser:

function StringToClass(AName: string): TClass; 
var 
    LCtx: TRttiContext; 
    LTp: TRttiType; 
begin 
    Result := nil; 

    try 
    LTp := LCtx.FindType(AClassName); 
    except 
    Exit; 
    end; 

    if (LTp <> nil) and (LTp is TRttiInstanceType) then 
    Result := TRttiInstanceType(LTp).Metaclass; 
end; 

Une note. Puisque vous gardez seulement les noms de classes dans la liste, cette méthode ne fonctionnera pas car TRttiContext.FindType attend un nom de type complet (ex: uMyUnit.TMyClass). Le correctif consiste à attacher l'unité où vous stockez ces classes dans la boucle ou dans la liste.

+0

Malheureusement, j'utiliser Delphi 2007 –