vložil Radek Červinka
26. listopadu 2010 22:15
Jedna z mála věcí co jsem ohledně Delphi XE ještě nepopsal, jsou změny v RTL ohledně formátování času a formátování čísel. Nový způsob je zpětně kompatibilní, dá se používat jako bezpečný z hlediska vláken a jen warning při otevření starších zdrojových kódů upozorňuje, že je třeba udělat drobnou změnu.
Základem je rozšířený záznam TFormatSettings, ke kterému patří i globální proměnná FormatSettings. Položky tohoto záznamu jsou stejné jako položky z dřívějších Delphi (jako např. DecimalSeparator, ShortDateFormat atd.). Tento záznam je pomocí absolute namapován na starší proměnné, které jsou ale označeny jako deprecated, tj. při jejich použití je vypsáno varování.
[DCC Warning] Project1.dpr(14): W1000 Symbol 'DecimalSeparator'
is deprecated: 'Use FormatSettings.DecimalSeparator'
Aby bylo jednoduše dosaženo kompatibility (pozor - to nestačí na inzerovanou bezpečnost z hlediska vláken) jednoduše nahradíte DecimalSeparator za FormatSettings.DecimalSeparator jak napovídá warning a je hotovo.
To je prima, ale proč to všechno?
Protože většina funkcí jako FloatToStr, DateTimeToStr dostalo bráchu, kde jako druhý parametr je TFormatSettings a v tom případě se použijí předané informace místo globálních proměnných (které může kdokoliv modifikovat, resp. samotná RTL je obnovuje - tomu se dá mimochodem zabránit přes Application.UpdateFormatSettings).
My ale můžeme nadefinovat vlastní záznam, ten si nastavit jak chceme, uschovat ho a pak ho používat bez rizika, že nám ho někdo upraví.
Např. typická konstrukce, kdy chceme formátovat reálné číslo s desetinou tečkou dvěma způsoby.
1program Project1;
2
3uses
4 SysUtils;
5var
6 f: double;
7 s: string;
8 fs: TFormatSettings;
9 c: char;
10begin
11 c := DecimalSeparator;
12 try
13 DecimalSeparator := '.';
14 f := StrToFloat('10.1');
15
16
17
18 FormatSettings.DecimalSeparator := '.';
19 f := StrToFloat('10.1');
20 finally
21 DecimalSeparator := c;
22 end;
23
24
25
26 fs := fs.Create;
27
28 writeln('DecimalSeparator ', fs.DecimalSeparator);
29 fs.DecimalSeparator := '.';
30 f := StrToFloat('10.1', fs);
31end.