Thread safe proměnné pro formátování času a oddělovače

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{$APPTYPE CONSOLE}
    3uses
    4  SysUtils;
    5var
    6  f: double;
    7  s: string;
    8  fs: TFormatSettings;
    9  c: char;
   10begin
   11  c := DecimalSeparator; // uschovej stary oddelovac
   12  try
   13    DecimalSeparator := '.';
   14    f := StrToFloat('10.1');
   15//    [DCC Warning] Project1.dpr(14): W1000 Symbol 'DecimalSeparator' is 
   16// deprecated: 'Use FormatSettings.DecimalSeparator'
   17
   18    FormatSettings.DecimalSeparator := '.'; //OK bez warningu, ale..
   19    f := StrToFloat('10.1');
   20  finally
   21    DecimalSeparator := c; //vrať původní separátor
   22  end;
   23// ***********************************
   24  //Thread safe currency and date/time formatting
   25  // fs je record, nemusim uvolnovat a můžu si ho schovat pro pozdější použití
   26  fs := fs.Create;  
   27  // Create získa data ze systému
   28  writeln('DecimalSeparator ', fs.DecimalSeparator);
   29  fs.DecimalSeparator := '.'; // nastavíme vlastní separátor
   30  f := StrToFloat('10.1', fs); //a použiji ho, a pak kdykoliv jindy
   31end.

Tagy: , ,

Novinky v Delphi

Komentáře

26.11.2010 23:54:03 #

pingback

Pingback from topsy.com

Twitter Trackbacks for
        
        Delphi.cz | Thread safe promÄ›nnĂ© pro formátovánĂ­ ÄŤasu a oddÄ›lovaÄŤe
        [delphi.cz]
        on Topsy.com

topsy.com

28.11.2010 16:15:31 #

Radim

Prikazom:

FormatSettings.DecimalSeparator := '.';

prepisujem systemove nastavenie, ktore by sa inak aplikovalo? Nap.r mohla by to byt aj - , /ciarka/?

Radim

28.11.2010 21:13:15 #

radekc

Prepisuji nastavení načtené ze systému při startu programu. Pro naše Windows je to , tj. čárka, ale pokud někde něco takového ukládám tak používám svůj formát tj. s tečkou.

Nejsem si jist zda moc rozumím tvému dotazu.

radekc

30.11.2010 17:57:47 #

Radim

Nie je horsie ney niekto napise program na anglickych Windows s cislami s . a potom kontroluje vstupne udaje regionalne s , . Stretol som sa s par /free/ programkami, kde po starte pred spustenim bolo potrebne rucne prepisat vsetky bodky na ciarky alebo naopak. Uff, uz ziadny taky nastastie nemam.

Radim

1.12.2010 10:11:38 #

JaroB

Chápu to dobře, že nastavení v Sysutils a FormatSettings je synchronizováno?

JaroB

1.12.2010 10:37:11 #

radekc

Oboje je v SysUtils

  FormatSettings: TFormatSettings absolute CurrencyString;

kde CurrencyString je prvni promennou z bloku promennych, takze diky absolute je to proste prepisovane, at menite to a nebo to.


var
  // Important: Do not change the order of these declarations, they must
  // match the declaration order of the fields in TFormatSettings exactly!
  CurrencyString: string deprecated 'Use FormatSettings.CurrencyString';
  CurrencyFormat: Byte deprecated 'Use FormatSettings.CurrencyFormat';
  CurrencyDecimals: Byte deprecated 'Use FormatSettings.CurrencyDecimals';
  DateSeparator: Char deprecated 'Use FormatSettings.DateSeparator';
  TimeSeparator: Char deprecated 'Use FormatSettings.TimeSeparator';
  ListSeparator: Char deprecated 'Use FormatSettings.ListSeparator';

radekc

Přidat komentář





  • Komentář
  • Náhled
Loading



Naše nabídka

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy nebo burzy práce).

Pokud chcete podpořit tento server libovolnou částkou, můžete použít PayPal. Moc děkuji.

Delphi Certified Developer

O Delphi.cz

Delphi je jediný moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32 a Win64 (a Mac OSX, s výhledem na iPhone a Android díky FireMonkey) na současném trhu (včetně Windows 7).

V současnosti je světová komunita přes dva miliónů vývojářů.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Burza delfínů nabízí pracovní možnosti pro programátory v Delphi.

Anketa

Poslední komentáře

Comment RSS