2010-01-26 11 views
3

Je voudrais être en mesure d'utiliser TValue pour stocker des données dans un TList <>. Comme dans:Delphi 2010 RTTI: Utiliser TValue pour stocker des données

type 
    TXmlBuilder = class 
    type 
    TXmlAttribute = class 
     Name: String; 
     Value: TValue; // TValue comes from Rtti 
    end; 

    TXmlNode = class 
     Name: String; 
     Parent: TXmlNode; 
     Value: TXmlNode; 
     Attributes: TList<TXmlAttribute>; 
     Nodes: TList<TXmlNode>; 
     function AsString(Indent: Integer): String; 
    end; 
    ... 
    public 
    ... 
    function N(const Name: String): TXmlBuilder; 
    function V(const Value: String): TXmlBuilder; 
    function A(const Name: String; Value: TValue): TXmlBuilder; overload; 
    function A<T>(const Name: String; Value: T): TXmlBuilder; overload; 
    ... 
end;  

implementation 

function TXmlBuilder.A(const Name: String; Value: TValue): TXmlBuilder; 
var 
    A: TXmlAttribute; 
begin 
    A := TXmlAttribute.Create; 
    A.Name := Name; 
    A.Value := Value; 
    FCurrent.Attributes.Add(A); 
    Result := Self; 
end; 

function TXmlBuilder.A<T>(const Name: String; Value: T): TXmlBuilder; 
var 
    V: TValue; 
begin 
    V := TValue.From<T>(Value); 
    A(Name, V); 
end; 

Et un peu plus tard, dans le programme principal, j'utiliser mon constructeur xml « fluent » comme ceci:

b := TXmlBuilder.Create('root'); 
b.A('attribute', 1).A('other_attribute', 2).A<TDateTime>('third_attribute', Now); 

Sur le deuxième appel, le programme soulève une exception de violation d'accès .

Il semble que la première valeur TValue ait été "libérée". Est-il vraiment possible d'utiliser TValue pour stocker des données "Variant" à l'exécution?

Je sais que les variantes existent dans Delphi. Mon générateur XML sera utilisé pour (dé) sérialiser les objets delphi natifs en XML en utilisant RTTI, donc j'utiliserai TValue partout.

salutations,

- Pierre Yager

Répondre

3

Je trouve la réponse. Mon erreur.

function TXmlBuilder.A<T>(const Name: String; Value: T): TXmlBuilder; 
var 
    V: TValue; 
begin 
    V := TValue.From<T>(Value); 
    Result := A(Name, V); // I missed the return value 
end; 

Désolé ;-)

+0

pas le compilateur Avez-vous mettre en garde à ce sujet? –

+0

Non, mais l'utilisation de génériques cache des tonnes de choses utiles. Le débogueur par exemple n'est plus activé pour le code générique. – ZeDalaye

Questions connexes