Jak w Delphi z systemu 64 bitowego pobrać symbol dziesiętny ?

0

Program piszę i kompiluję w Delphi XE na Windows XP.

Dla poprawnego wyświetlania liczb rzeczywistych jako stringów pobieram z systemu Symbol Dziesiętny.

GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, fs);
separator:=fs.DecimalSeparator;

Na systemach 32 bitowych (testowałem XP i Vista) wszystko działa poprawnie - tzn. powyższy kod zwraca taki symbol dziesiętny jaki jest ustawiony przez Użytkownika w Panelu Sterowania (najczęściej przecinek lub kropka).

Problem pojawia się pod Windows 7 64 bit.
Niezależnie od tego, że ustawionym symbolem dziesiętnym jest przecinek, to w programie każdorazowo wyświetlana jest kropka. To samo dotyczy powyższej funkcji, która zawsze zwraca "."
Pomimo tego, że użytkownik w Excelu używa przecinka, to uruchamiając mój program jako symbol dziesiętny widzi zawsze kropkę ???

**Co jest powodem tego, że program skompilowany na XP i uruchomiony pod Windows 7 64 bit nie potrafi odczytać właściwego symbolu dziesiętnego ? **

0
ShowMessage(DecimalSeparator);

co zwraca?

0

Zawsze zwraca kropkę "."
Pomimo tego, że w Panelu Sterowania jest symbol dziesiętny przecinek ","

0

na d2k10 działa dobrze i w7ultim
reaguje też poprawnie na zmianę w ustawieniach.

A zmień na kropkę a potem z powrotem na przecinek i zobacz co dostaniesz. Miałem tak kiedyś na w7, że mimo iż w ustawieniach był przecinek to system uparcie zwracał kropkę.

0

Zrobiłem jak radziłeś - z przecinka na kropkę i z powrotem z kropki na przecinek.
Excel reaguje, mój program niestety nie.
Wartości liczbowe w editach to jedna sprawa, gorsze jest to, że korzystam z XMLów, które wczytuję jako bazę plikową do BDGrida. Sam grid też jest z kropkami !!! - tak jakby z założenia miała być kropka i koniec.

Czy to możliwe, że tak zachowuje się program 32bitowy na 64 bitowym systemie ?

0
Majster napisał(a)

Czy to możliwe, że tak zachowuje się program 32bitowy na 64 bitowym systemie ?

u mnie na d2k10 działa ok

0

A bezpośrednio WinApi?

var
  buf: array[0..10] of Char;
begin
  GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SDECIMAL, buf, SizeOf(buf));
  ShowMessage(buf);
end;

EDIT//ew. na Vista i nowszych GetLocaleInfoEx

0

Dzięki kAzek - pół sukcesu jest :)

Wyświetla przecinek (tak jak powinien) - czyli tym obsłużę wyświetlanie labeli, editów i innych stringów.

Ale pozostaje mi nadal problem Grida i mojej bazy.
Grid "sam sprawdza" sobie symbol dziesiętny. Może to idiotycznie ująłem, ale chodzi mi o to, że grid sam dostosowuje się do symbolu dziesiętnego i jak dotychczas tego nie ustawiałem ręcznie ...

Jak zrobić aby jeszcze w gridzie wyświetlały się właściwe symbole dziesiętne ?

0

a nie jest to spowodowane innymi ustawieniami regionalny,mi i jezykowymi?

0

Nie wiem skąd on bierze swoje ustawienia ale możliwe, że korzysta z zmiennej DecimalSeparator a jeżeli tak przypisanie DecimalSeparator:= buf[0]; (z tamtej funkcji) powinno zadziałać.

0

Jest to bug, który pojawił się w Viście i nie został naprawiony w Win7. Dodaj dwie linijki w pliku .dpr:

begin
  SetThreadLocale(LOCALE_USER_DEFAULT);  // tutaj
  GetFormatSettings;                     // tutaj
 
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

warto to robić w każdym programie.

0

Dzięki Wielkie :)

Azarien - wszystko działa jak powinno po dopisaniu poleceń do dpr.

1 użytkowników online, w tym zalogowanych: 0, gości: 1