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
pas le compilateur Avez-vous mettre en garde à ce sujet? –
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