Bonjour,
J'aimerai pouvoir stocker un champ Variant dans une structure XML (dans du texte donc) et pouvoir le récupérer sans perdre le type du variant.
Il y a des fonctions qui permettent ce genre de chose ?
Merci
Armindo
Bonjour,
J'aimerai pouvoir stocker un champ Variant dans une structure XML (dans du texte donc) et pouvoir le récupérer sans perdre le type du variant.
Il y a des fonctions qui permettent ce genre de chose ?
Merci
Armindo
Bonjour,
dans l'unité Variants, la fonction VarToStr permet de convertir un variant en String.
A+
Charly
et pour le relire, tu fais directement :
A+
Code : Sélectionner tout - Visualiser dans une fenêtre à part v := s ; // v Variant et s String
Charly
j'aurais tendance à dire que ce n'est pas possible, ou en tout cas pas automatique.
Prenons un Variant contenant une date, cela va se traduire par une date au format texte, mais en relecture on aura ... un chaîne de caractère contenant une date.
ça pourrait se généraliser à tous les types d'ailleurs, en entier 1 devient la chaîne '1' car rien dans XML ne précise le type de la donnée. <data>1</data>...sauf à ce que le XML possède un XDS qui fixe les choses...ou que le XML précise le type de données <data type="date-iso">2019-10-17 10:32</data> mais il reste à écrire le code qui va produire et relire le XML en tenant compte de ces informations.
dans DataSnap on a sans doute ce genre de choses cependant vu que si mon souvenir est bon il est possible de passer par SOAP qui est du XML
Je pense que tu dois ajouter le type de données sous forme d'un attribut spécifique comme dans cet exemple avec "fieldType". Tu peux connaître le type de ta donnée avec les fonctions VarIsFloat, VarIsStr... ou TVarType ou comme dans l'exemple de Paul
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 <?xml version="1.0" encoding="ISO-8859-1"?> <DATAPACKET Version="2.0"> <METADATA><FIELDS> <FIELD attrname="TypeArbre" fieldtype="string" width="20" /> <FIELD attrname="Age" fieldtype="i4" /> </FIELDS></METADATA> <ROWDATA> <ROW TypeArbre="Chêne" Age="5" /> <ROW TypeArbre="Saule" Age="7" /> <ROW TypeArbre="Bouleau" Age="4" /> </ROWDATA> </DATAPACKET>
Bonjour,
Si il l'écrit, il connait son type et son nom dans le fichier XML. Il peut donc refaire la conversion a la relecture ?
A+
Charly
Merci à tous pour vos réponses effectivement il vaudra mieux que je sauve le type dans la XML et qu'à la relecture je fasse ce qu'il faut en fonction du type.
-> Paul tu avais bien compris le fond du problème...
Salut,
Ce devrait être qq'chose comme çà:
solilog
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83 unit Unit2; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm2 = class(TForm) Memo1: TMemo; Button1: TButton; procedure Button1Click(Sender: TObject); private { Déclarations privées } public { Déclarations publiques } end; var Form2: TForm2; implementation {$R *.dfm} function PutVariant (aVariant:variant): string; var Typ : tVarType; begin Typ := VarType(aVariant); result := format('%6.6d %s', [Typ, aVariant]); end; function GetVariant (aString:string) : variant; var Typ : tVarType; begin Typ := StrToInt(Copy(aString, 1, 6)); delete(aString, 1, 7); case typ of varDate : result := VarAsType(aString, varDate); varInteger : result := VarAsType(aString, varInteger); varString : result := VarAsType(aString, varString); varDouble : result := VarAsType(aString, varDouble); else ShowMessage('Si tu veux d''autres types '#10'tu te les tapes toi-même.'); end; end; procedure TForm2.Button1Click(Sender: TObject); var Ligne : string; d : tDate; i : Integer; s : String; r : double; v : variant; begin d := Date; i := random(MaxInt); s := 'Bonjour'; r := pi; Memo1.Lines.Clear; v := VarAsType(d, varDate); Memo1.Lines.Add(PutVariant(v)); v := VarAsType(i, varInteger); Memo1.Lines.Add(PutVariant(v)); v := VarAsType(s, varString); Memo1.Lines.Add(PutVariant(v)); v := VarAsType(r, varDouble); Memo1.Lines.Add(PutVariant(v)); Memo1.Lines.Add(''); for i := 0 to 3 do begin Ligne := Memo1.Lines[i]; v := GetVariant(Ligne); Memo1.Lines.Add(Format('%6.6d %s', [VarType(v), v])); end; end; end.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager