Problém s formátováním datumu na Vistách a výše

vložil Radek Červinka 28. března 2012 22:40

Pokud narazíte na problém, že na Vistách se Vám bude špatně formátovat datum (03/27/2012 místo 27.3.2012) vězte, že je to problém instalace Vista a dalších verzí, kdy je oddělovač data nastaven na dvouznakovou hodnotu. Problémem jsou zasaženy asi Delphi 7 a vyšší.

Chyba je to protože když si zobrazíte nastavení Oblast a jazyk a vyberete místo Čeština něco jiného a dáte použít, a vyberete zpět Čeština tak problém zmizí.

Nastavení


Nabízíme Delphi školení na různá témata, primárně ve Vaší firmě.

Tagy: , , ,

Praxe

Komentáře

28.3.2012 23:38:58 #

Zdeněk Vašků

Tady se Ti možná spojily dvě věci dohromady. Dost jsem se tím musel zabývat v našich aplikacích, tak to trochu rozvedu:

Od Vist výše je DateSeparator označen jako obsolete, ale i v W8 stále ještě existuje (vyžkoušeno). Nicméně ve výchozí instalaci, zvláště u předinstalovaných systémů je tento parametr nastaven na anglické lomítko bez ohledu na umístění a jazyk Windows. Proto si delphi načtou to lomítko. Vyřešit se to dá zápisem do registru nebo protočením nastavení v dialogu Oblast a jazyk. Tím se i tento parametr nastaví správně.

Druhý problém je, že delphi nepočítá s víceznakovým separátorem a v takovém případě nastaví lomítko, které je natvrdo v kódu. Tento problém je především na Slovensku, kde je podle normy separator tečka+mezera. S tím je potřeba počítat v kódu. Náš kód umístěný v initialization je např tento:

procedure NormalizeDateFormats;
var dsep,new_dsep:string; //long date separator
    DefaultLCID: Integer;
begin
DefaultLCID := GetThreadLocale;
dsep:=GetLocaleStr(DefaultLCID, LOCALE_SDATE, '');
if dsep='' then exit; //not necessary, only to be sure
if length(dsep)=1 then exit; //nothing to do
//prepare new dateseparator
new_dsep:=trim(dsep);
if length(new_dsep)>1 then new_dsep:=copy(new_dsep,1,1);
//process now
ShortDateFormat:=StringReplace(ShortDateFormat,dsep,new_dsep,[rfReplaceAll]);
DateSeparator:=new_dsep[1];
end;

Toto platí pro všechny delphi (od 7, starší už nemám) včetně XE2.

Zdeněk Vašků

29.3.2012 8:47:03 #

Karel Janeček

Dobrý den, několika našim klientům se to stalo rovněž, řešením je i v uvedeném dialogu nastavení klepnout na tlačítko Další nastavení a dále na Vynulovat. Zafungovalo vždy bez dalších nežádoucích vlivů.

Karel Janeček

29.3.2012 9:01:35 #

JaroB.

Dost čast mají problém s formátem datumu nové notebooky od Asusu nebo Aceru s předinstalovanými Windows 7.  Ale uživatel ani nemusí poznat/vědět, že se mu datum nezobrazuje správně, mnohdy je to až na intervenci, protože to někdy vede k datumové nejednoznačnosti na důležitých dokumentech např. na smlouvách.

JaroB.

2.4.2012 23:10:03 #

Igor Gottwald

Tak tohle je klasika... nicméně pro ty z Vás, kteří čirou náhodou používají Report Builder od Digital Metaphors je s tím spojená ještě jedna velice záludná chybička, která cca. od verze 12 (aktuální je 14) způsobuje, že když někde na začátku běhu aplikace změníte oddělovač desetinných čísel (což jde často ruku v ruce s řešením výše popsaného problému), tak dojde k nesouladu mezi FormatSettings.DecimalSeparator a ppFormatSettings.DecimalSeparator a to se, alespoň v mých aplikacích, projeví prakticky jenom tím, že se generují nekorektní PDF soubory, které namísto desetinné tečky najednou obsahují např. destinou čárku.
Ještě zábavnější je ta chyba v tom, že se typicky projeví tak v jednom případě z tisíce, kdy se váš kód "nějak" opozdí a naopak Report Builder jej předběhne a načte si jiné proměnné. Takže vypátrat tuhle chybu vyloženě připomíná pověstné hledání jehly v kupce navíc.
Jinak na Report Builder nedám dopustit, ale s tímhle mě parádně potrápili. Řešení je snadné, pči změně globální proměnné FormatSettings hodnoty zkopírovat do ppFormatSettings.

Igor Gottwald

2.4.2012 23:24:19 #

Radekc

Ještě malý komentář (speciálně pro tebe zdeňku): Delphi reagují na jednu zprávu, která Windows informují aplikace, že se změnilo nastavení v systému. A v tom okamžiku si načtou nové nastavení (včetně separatorů) - takže tvoje snaha by byla na houby. Ale existuje nějaká globalní proměnná, která to potlačí, ale nepamatuji si ji a nechce se mi ji hledat.

Radekc

3.4.2012 12:38:57 #

Zdeněk Vašků

Díky za tip. To jsem nevěděl, kouknu do kód co se tam děje. Naštěstí nám uživatelé nemění toto nastavení za jízdy, tak se to tak neprojeví.
Každopádně ten dvouznakový separátor se musí někde vyřešit, protože pak funguje kód špatně.

Jednou bude muset Embarcadero tohohle kostlivce ze skříně vytáhnout. Myslím, že např. DevExpress komponenty fungují dobře sami o sobě a nejsou na této proměnné závislé.

Zdeněk Vašků

3.4.2012 13:02:29 #

Radekc

Tak to co to ovlivnuje je TApplication.UpdateFormatSettings - a nejsem si jist zda se ta zpráva nevyvolá třeba i při připojení monitoru - aspoň něco takového se mi zdá (ale možná to byl problém driveru, každopádně se to vyvolávalo i během normální práce - ale to bylo na Win 2000, pak jsem se o to nezajímal).

A já si pořád myslím, že se jedná o chybu Windows - jinak by se přece po mnou popsané změně nastavila hodnota zpět na dvouznakový separátor.

Radekc

3.4.2012 13:06:49 #

Radekc

Tak jsem si ten tvůj příspěvek ještě jednou přečetl - to o tom Slovensku a už mlčím.

Radekc

3.4.2012 14:45:18 #

Zdeněk Vašků

Mezitím zkoušíme W8, a ty když se nainstalují (Anglické) a pak se přepne na České, tak je tam taky tečka+mezera.

Díky za TApplication.UpdateFormatSettings. Ušetřil jsi mi hledání.

Zdeněk Vašků

5.4.2012 1:23:48 #

Igor Gottwald

Taky mi to nedalo a kouknul jsem na MSDN.
Teda musím říct, že TFormatSettings bude potřebovat asi pořádně oprášit. A s tím i návazné rutiny. Jenom s tím datem... možnost definice více platných formátů současně včetně jejich pojmenování, oddělovače data bez nutnosti stejných oddělovačů dne, měsíce a roku (např. 1/4, 2012) apod. A pak nějak zajistit, aby staré programy fungovaly a nové mohly využívat to, co je k dispozici :-)
Podobně to pak funguje pro čas, kde může být formátů také víc najednou.

Igor Gottwald

5.4.2012 11:48:34 #

Zdeněk Vašků

Moje poslední Delphi byly 2007, tak jsem si myslel, že XE2 už to alespoň trochu vyřeší nebo že bude postupná předpříprava. Nicméně zatím stále stejný kód.

Zdeněk Vašků

5.4.2012 11:54:47 #

Radekc

>předpříprava

Právě se mi zdá, že separace TFormatSetting a označení samotných DecimalSeparator a spol. jako deprecated je příprava.

Radekc

Komentování ukončeno

Naše nabídka

Partial English version.

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního 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, Win64 , Mac OSX a na iPhone a Android (s výhledem na další platformy díky FireMonkey) na současném trhu (včetně Windows 8.1).

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.

Anketa

Poslední komentáře

Comment RSS