Mam pare gridow, w ktorych wyswietlane sa dane(zmiennoprzecinki). I raz na jakis bardzo rzadki czas, nawala decimalspearator, ktory ustawiam na starcie programu na kropkę. Wiec czasem, wtedy na gridach mam dane z separatorem przecinka. Czy ja tu nawalilem, czy jest jakies wyjasnienie, czemu to sie zdarza ?
Kodu nie ma co pokazywac, po prostu podczas logowania uzytkownika, pobieram oryginalny separator i nadpisuje go kropka. Chyba ze lepiej dac w OnCreate glownej formy to ?
- Rejestracja:prawie 17 lat
- Ostatnio:3 miesiące
- Lokalizacja:Poznań

- Rejestracja:około 22 lata
- Ostatnio:14 dni
- Postów:1112
Za helpem:
{...}
Delphi VCL (non-console) applications will automatically update these formatting variables in response to WM_WININICHANGE messages. Application.UpdateFormatSettings will either allow or not allow changes in system settings. The default is True. Set this property to False to prevent the system settings from changing.
{...}
Jesli masz problem z konwersją mozesz przed konwersją robić:
aStr := StringReplace(aStr, ',', DecimalSeparator, []);
aStr := StringReplace(aStr, '.', DecimalSeparator, []);
b
- Rejestracja:prawie 17 lat
- Ostatnio:3 miesiące
- Lokalizacja:Poznań
No, ten cytat troche wyjasnia i ustawie na False tą propercję. Sadzilem ze skoro ustawiam DecimalSpeparator na starcie programu, to on obowiazuje przez caly czas jego trwania.
A drugi sposob jest nieefektywny, majac naprawde duzo insertow do bazy i innych....
Ale dzieki, powinno byc dobrze :P

- Rejestracja:ponad 18 lat
- Ostatnio:około 8 lat
- Lokalizacja:Poznań
- Postów:295
ja zawsze robilem to w ten sposob.
Tworzylem zmienna globalna
var fDecimalSeparator: Char;
W sekcji inicjalizacji aplikacji, biblioteki etc. przypisywalem
fDecimalSeparator := DecimalSeparator;
DecimalSeparator := '.';
W sekcji destroy lub w miejscu gdzie konieczna jest zmiana na wartosci oryginalne przywracalem je.
Dodam ze uzywam tego przy budowaniu dosc pokaznych skryptow SQL'owych (naprawde duzych :) ).
Wszelkie operacje typu FloatToStr itp dzialaja poprawnie :)
Ps. Pamietaj ze jesli taki skrypt jest budowany jako polaczenie wielu operacji to dla obiektu dostepowego ADO nalezy na poczatku dodac
SET NOCOUNT ON
SET XACT ABORT ON

- Rejestracja:około 22 lata
- Ostatnio:14 dni
- Postów:1112
crowa napisał(a)
ja zawsze robilem to w ten sposob.
Tworzylem zmienna globalna
var fDecimalSeparator: Char;
W sekcji inicjalizacji aplikacji, biblioteki etc. przypisywalem
fDecimalSeparator := DecimalSeparator;
DecimalSeparator := '.';
W sekcji destroy lub w miejscu gdzie konieczna jest zmiana na wartosci oryginalne przywracalem je.
No ale patrząc na tego helpa, to też mogło Ci nie działać w przypadku wymienionego tam komunikatu. Zresztą patrząc na tego helpa to dochodzę też do wniosku że niepotrzebnie się trudziłeś pamiętając oryginalną wersję - jej zmiana w Twojej aplikacji nie miała wpływu na system.
b

- Rejestracja:ponad 21 lat
- Ostatnio:ponad 12 lat
- Postów:7923
a nie możecie tego robić po Bożemu???
gdzieś zmienna globalna
fs: TFormatSettings;
i np. w initialization ustawić wszelkie formaty
fs.DecimalSeparator := '-';
a potem w kodzie
ShowMessage(FloatToStr(StrToFloat('123-45', fs), fs));
i w ^$#*$ mieć to co jest ustawione w systemie
- Rejestracja:prawie 17 lat
- Ostatnio:3 miesiące
- Lokalizacja:Poznań
jesli 'to jest po Bozemu ' to nc.... Podwojna konwersja. Po prostu mam aplikacje dzialajaca niekoniecznie w Polsce, i chce sie trzymac jednego standardu czyli kropki. I najlepiej ustawic DecimalSeparator, niz do kazdej konwersji dodawac ten FS(Ogolnie z bazy od razu ciagne jako string wartosci liczbowe). I ogolnie to dziala OK, tylko raz na bardzo rzadki czas wskakiwal przecinek i nie wiedzialem jak temu zaradzic :-P

- Rejestracja:około 17 lat
- Ostatnio:ponad 7 lat
maciejmt napisał(a)
jeśli 'to jest po Bożemu ' to nc....
nc? no comment? tak kolego programisto.. to właśnie jest PO BOŻEMU... jak próbujesz ustawiać separator systemowy to się tylko na ośmieszenie wystawiasz..
to pewnie jak np. Toyota robiłaby samochody na Niemcy to z samochodu wywaliłbyś amortyzatory?
(nie to żeby mieli wszędzie równe drogi ale przykład dobry)
ty napisz aplikacje ustawiającą na kropkę.. inny programista na przecinek.. klient będzie używać obu aplikacji.. i co? i jesteś w czarnej d*!

- Rejestracja:ponad 18 lat
- Ostatnio:około 8 lat
- Lokalizacja:Poznań
- Postów:295
spokojnie :) kazdy sposob jest dobry. Ja nie chcialem pobierac LocaleSetings wiec uzywam DecimalSeparator (dziala dobrze)
PS. zapamietywalem stara wartosc po to zeby np wyswietlac w editach dane zgodne z ustawieniami systemu a do bazy zawsze posylalem '.'
- Rejestracja:ponad 18 lat
- Ostatnio:około 15 lat
Wczoraj/dzisiaj miałem podobny problem (zmiana czasu z zimowego na letni). Miałem ustawiony DecimalSeparator na '.' w FormCreate bo tak mi się wydawało najlepiej :| , (aplikacja działała przez noc). Wszystkie liczby zmiennoprzecinkowe pozapisywało mi z ','. Niestety akurat przez nieprzemyślenie serie liczb były separowane ',' i zrobił mi się totalny groch z kapustą :-/ Ale teraz już wiem dlaczego ;) Dzięki za wyjaśnienie.

- Rejestracja:ponad 21 lat
- Ostatnio:32 minuty
b0bik napisał(a)
ZDelphi VCL (non-console) applications will automatically update these formatting variables in response to WM_WININICHANGE messages.
Windows 7 ma buga przez co VCL może czasami pobierać zły format z systemu. Dotyczy to nawet Delphi 2010. Żeby to obejść, trzeba dodać w pliku dpr wywołanie SetThreadLocale i GetFormatSettings:
begin
// windows 7 locale bug workaround: sometimes wrong thread locale id gets reported,
// causing sysutils time and number formatting functions to misbehave. this'll fix:
SetThreadLocale(LOCALE_USER_DEFAULT);
GetFormatSettings;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Szczegóły techniczne dlaczego tak się czasem dzieje tu.