![]() |
Regionale Einstellungen
Hallo zusammen,
in verwende in meinem Programm ein datagrid, bei welchem eines der Felder auf einem decimal field in SQL Server 2008 basiert. Auf manchen Rechnern kann man ein Komma als dezimal trenner verwenden, auf manchen aber auch nicht. Ich dachte bisher immer das würde einzig von den Region-Einstellungen unter Windows abhängen, aber mein Kollege hier hat z.B. auch ein Komma als Trenner eingestellt, kann dies aber nicht in Dezimalfeldern verwenden. Es geht darum, das Kunden gerne immer ein Komma verwenden möchten, weil dies im numerischen Block der Tastatur verfügbar ist und die Eingabe von Dezimalzahlen dadurch sehr viel schneller vonstatten gehen kann. Kann mir jemand sagen, ob und wie ich in Delphi veranlassen kann, das grundsätzlich immer das Komma als Dezimaltrennzeichen verwendet wird? |
AW: Regionale Einstellungen
Zitat:
Code:
procedure SetDecimalSeparator(Ch: Char);
var DefLCID: LCID; Buffer: LPSTR; begin Application.UpdateFormatSettings := True; StrPCopy(Buffer, Ch); DefLCID := GetThreadLocale; if SetLocaleInfo(DefLCID, LOCALE_SDECIMAL, Buffer) then DecimalSeparator := StrPas(Buffer)[1]; Application.UpdateFormatSettings := False; end; procedure TForm1.FormActivate(Sender: TObject); begin SetDecimalSeparator(','); end; |
AW: Regionale Einstellungen
schade, hätte ich auch gebrauchen können, aber Lazarus kennt:
Application.UpdateFormatSettings ledier nicht :-( |
AW: Regionale Einstellungen
Kennt Lazarus denn die globale Variable Decimalseparator aus SysUtils?
|
AW: Regionale Einstellungen
ja, die kennt Lazarus
|
AW: Regionale Einstellungen
Solange Lazarus die Einstellungen nicht zwischendrin wiederherstellt kannst du das auch weglassen. Bei Delphi dient das dazu, dass die gesetzten Einstellungen auch bei einer Aktualisierung beibehalten werden.
|
AW: Regionale Einstellungen
Zitat:
Es sei denn es handelt sich um Window Vista oder Windows 7. Dann kann es passieren, dass Delphi-Programme alle regionalen Einstellungen als English(USA) auslesen, obwohl in der Systemsteuerung Deutsch(Deutschland) eingestellt ist. Dann muss man auf Englisch umschalten, abspeichern und wieder auf Deutsch umschalten und abspeichern. (Natürlich für jeden Windows User) |
AW: Regionale Einstellungen
Zitat:
|
AW: Regionale Einstellungen
ist doch ein bekannter Windows Bug, verfügbar in XP Vista und WIN 7 :
um den richtig Ländercode auslesen zu können zuerst die Sprache in der Systemsteuerung von Deutsch auf Isländisch (oder ...) stellen speichern und dann von Isländisch zurück auf Deutsch. Dann kann man auch Deutsch mit den Ländereinstellungen auslesen. |
AW: Regionale Einstellungen
Zitat:
In der Zeile
Code:
meldet mir der Compiler einen Fehler: Inkompatible Typen 'AnsiChar' und 'Char'
if SetLocaleInfo(DefLCID, LOCALE_SDECIMAL, Buffer) then
Kannst du deine Funktion mal testen? |
AW: Regionale Einstellungen
Wieso verwendet man hier auch LPSTR? :wall:
Zitat:
![]() Oder man nimmt einfach PChar. :roll: PS: Sowas ist übrigens einer der Gründe, warum es beim Umstieg auf Unicode (Delphi 2009 und höher) so viele Probleme gab ... schlechter/fehlerhafter Code. [add]
Delphi-Quellcode:
procedure SetDecimalSeparator(Ch: Char);
begin Application.UpdateFormatSettings := True; if SetLocaleInfo(GetThreadLocale, LOCALE_SDECIMAL, PChar(String(Char))) then DecimalSeparator := Ch; Application.UpdateFormatSettings := False; end; |
AW: Regionale Einstellungen
OK, vielen Dank.
Das Problem scheint aber doch woanders zu liegen. Der User möchte nämlich im numerischen Block der Tastatur das Komma benutzen können, wenn er numerische Werte in die Applikation eingibt. Jetzt ist mir aufgefallen, dass es Unterschiede im Num-Block bezüglich der Tastenbelegung gibt. Bei deutschen Tastaturen ist dort ein Komma, bei anderen ein Punkt. Und wenn sie auf den Punkt klicken ist das natürlich nicht erlaubt in einem numerischen Feld. Hat hier jemand eine Idee? Ich könnte mir vorstellen dass es helfen könnte, sobald jemand auf den Punkt klickt dieses automatisch in ein Komma umzuwandeln, aber ich hab ehrlich gesagt keine Ahnung... |
AW: Regionale Einstellungen
Zitat:
Dann passt die Tastatur zur Einstellung. Wenn es wirklich wichtig ist, dass ein deutschsprachiger User an einem Rechner mit englischer Tastatur effizient arbeiten kann, dann wäre die absolut billigste Lösung zusätzlich eine deutsche Tastatur (Kosten: 8 Euro) anzuschliesen. Ich würde mich hier nicht auf ein Gemurkse auf Softwarebene einlassen. |
AW: Regionale Einstellungen
Zitat:
Diese User haben einen Punkt auf der Taste im numerischen Block und leider kein Komma wie z.B. deutsche Tastaturen. Der Sinn ist nun das sie diese Taste (wegen der schnelleren Eingabe) in dezimal-Feldern nutzen können. Ich kann denen doch nicht sagen kauft euch eine deutsche Tastatur...:roll: |
AW: Regionale Einstellungen
Was Andreas meint: die Tastatur wird ja vermutlich auch zur eingestellten Windows-Sprache passen. Von daher wäre es Quatsch, dem User landesspezifische Einstellungen aufzudrängen. Wer eine englische Tastatur verwendet, benutzt ja wohl (zumindest ist davon auszugehen) auch ein englisches Windows, japanische Tastatur lässt auf japanisches Windows und klingonische Tastatur auf klingonisches Windows schließen :mrgreen:. Das soll heißen: eigentlich sollte das in den meisten Fällen schon von sich aus funktionieren.
|
AW: Regionale Einstellungen
Zitat:
|
AW: Regionale Einstellungen
Jepp :D
|
AW: Regionale Einstellungen
Wenn ich ein englisches Sprachschema im Windows ausgewählt ab und passend dazu ein englisches Tastaturlayout, dann ist das dezimaltrennzeichen ein Punkt und passend dazu ist im Ziffernblock auch ein Punkt vorhanden.
Stelle ich mir das Windows auf Deutsch um und passend datu auch das Tastaturlayout, dann ist das Dezimaltrennzeichen ein Komma und auch im Ziffernblock ist ein Komma. Wieso willst du denn unbedingt ein Komma dort haben? Es ist vollkommen egal was dort ist, solange das Programm auch richtig darauf reagiert und als Dezimaltrenner den verwendet, welcher im System eingestellt wurde. Er heißt ja nicht umsonst DecimalSeparator. (im Deutschen ein Dezimalkomma und Englischen ein Dezimalpunkt) Das Dezimaltrennzeichen im Ziffernblock hat auch absichtlich einen anderen Tastencode, als das Komma links auf unserer deutschen Tastatur, damit Windows diese Taste passend zur aktuellen Spracheinstellung mappen kann. |
AW: Regionale Einstellungen
Der Kunde möchte das so haben und, wie meist in solchen Fällen, mit der Anmerkung, das sie das in Vorgänger-Programmen auch so machen konnten. Ich erspare mir an dieser Stelle eine Diskussion mit Kunden über die Sinnhaftigkeit.:)
Mit der Prozedur "SetDecimalSeparator" hier aus diesem Thread wurde ja bereits das Dezimaltrennzeichen als Komma festgelegt und wenn ich das bisherige richtig verstanden habe wäre doch das einzige, was jetzt noch nötig wäre, die Kommataste im Num-Block IMMER als Komma zu interpretieren, jedenfalls für die Dauer der Laufzeit meines Programms. Falls das so stimmt, hat hier jemand eine Idee wie das zu bewerkstelligen ist? |
AW: Regionale Einstellungen
Zitat:
Wenn man also das Dezimalzeichen - aus welchem Grund auch immer - mittels SetDecimalSeparator() ändert und folglich zweckmäßigerweise die entsprechende Änderung auch durch den Druck der "Kommataste" des Nummernblocks gewährleisten will, kann man das nur durch Abfangen der geeigneten Message ermöglichen. Dies bezieht sich dann auf die gesamte Application, unabhängig von den verwendeten Komponenten zur Eingabe.
Code:
{...}
private { Private-Deklarationen } procedure AppOnMessage(var Msg: TMsg; var Handled: Boolean); {...} procedure TForm1.AppOnMessage(var Msg: TMsg; var Handled: Boolean); begin case Msg.Message of WM_KEYDOWN, WM_KEYUP: if (Msg.wparam = VK_DECIMAL) and (Odd(GetKeyState(VK_NUMLOCK))) then begin Msg.wparam := 190; // für Punkt // oder Msg.wparam := 188; // für Komma Msg.lparam := MakeLParam(LoWord(msg.lparam), (HiWord(Msg.lparam) and $FE00) + MapVirtualKey(Msg.wparam, 0)); end; end; end; procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMessage := AppOnMessage; end; |
AW: Regionale Einstellungen
Zitat:
Vielleicht wäre es einfacher in meiner Applikation den Punkt als Dezimalseparator zu definieren? Dann bräuchte ich nichts am System zu verändern. Weiß jemand ob das funktionieren kann, ich meine, global für die Anwendung den Punkt als Dezimaltrenner zuzulassen? |
AW: Regionale Einstellungen
|
AW: Regionale Einstellungen
Ich hab die Lösung gefunden, es ist so simpel: Es gibt die globale Variable SysUtils.DecimalSeparator die dafür verantwortlich ist, wie Delphi das Dezimaltrennzeichen interpretiert. Das hat also gar nichts mit den regionalen Einstellungen des Systems oder sonstwelchen Einstellungen zu tun wie es scheint. Vielen Dank allen hier!
|
AW: Regionale Einstellungen
![]() |
AW: Regionale Einstellungen
Mist, doch noch nicht (ganz) gelöst. Der Kunde hat sich darauf comitted, als Dezimaltrennzeichen immer ein Komma zu verwenden. Jedoch gibt es unterschiedliche Tastaturen und alle diejenigen, die das Programm nutzen, möchten die Kommataste auf dem numerischen Block der Tastatur benutzen. Das Problem ist nun, das einige dort kein Komma haben, ich aber auch nicht an den Systemeinstellungen rumfummeln möchte, weil das eventuell wieder Einfluss darauf haben könnte, das andere Programme dann nicht mehr richtig funktionieren. Gibt es also eine Möglichkeit, das Dezimaltrennzeichen immer auf Komma zu stellen (Ja: Decimalseparator := ',') und die Taste im Num-Block IMMER als ein Komma zu interpretieren?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz