Ah oui, le format DFM texte, c'est verbeux, et même le mode DFM Binaire ... surprise c'est aussi du texte
C'est pour anticiper à mon avis un changement de l'ordre de l'énumération, si un petit malin insère une valeur en plein milieu, ça casserait la compatibilité ascendante en stockant le set sous forme de binaire
C'est une chaine non affichable car c'est un binaire donc très vite on a des zéros qui stoppe les chaines dans les API Windows
'TPF0'#7'TMachin'#0#4'Text'#6#$10'Texte de Machine'#$F'Strings.Strings'#1#$14#$16#0#0#0'Texte N°1 de la Liste'#$14#$16#0#0#0'Texte N°2 de la Liste'#$14#$16#0#0#0'Texte N°3 de la Liste'#$14#$16#0#0#0'Texte N°4 de la Liste'#$14#$16#0#0#0'Texte N°5 de la Liste'#0#$13'Bidule.Font.Charset'#7#$F'DEFAULT_CHARSET'#$11'Bidule.Font.Color'#7#$C'clWindowText'#$12'Bidule.Font.Height'#2'õ'#$10'Bidule.Font.Name'#6#6'Tahoma'#$11'Bidule.Font.Style'#$B#6'fsBold'#$B'fsUnderline'#0#$10'Truc.Chose.Value'#3''#2#9'Truc.Text'#6#$1A'Texte du Truc dans Machine'#0#0
Tu peux modifier l'exemple ComponentToString ainsi
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
| unit SampleComponentToString;
interface
uses
System.Classes;
function ComponentToStringProc(Component: TComponent; ADFMText: Boolean): string;
function StringToComponentProc(Value: string; ADFMText: Boolean): TComponent;
implementation
function ComponentToStringProc(Component: TComponent; ADFMText: Boolean): string;
var
BinStream:TMemoryStream;
StrStream: TStringStream;
s: string;
begin
BinStream := TMemoryStream.Create;
try
StrStream := TStringStream.Create(s);
try
BinStream.WriteComponent(Component);
BinStream.Seek(0, soFromBeginning);
if ADFMText then
begin
ObjectBinaryToText(BinStream, StrStream);
StrStream.Seek(0, soFromBeginning);
end
else
StrStream.CopyFrom(BinStream, BinStream.Size);
Result:= StrStream.DataString;
finally
StrStream.Free;
end;
finally
BinStream.Free
end;
end;
function StringToComponentProc(Value: string; ADFMText: Boolean): TComponent;
var
StrStream:TStringStream;
BinStream: TMemoryStream;
begin
StrStream := TStringStream.Create(Value);
try
BinStream := TMemoryStream.Create;
try
if ADFMText then
ObjectTextToBinary(StrStream, BinStream)
else
BinStream.CopyFrom(StrStream, StrStream.Size);
BinStream.Seek(0, soFromBeginning);
Result:= BinStream.ReadComponent(nil);
finally
BinStream.Free;
end;
finally
StrStream.Free;
end;
end;
end. |
Partager