.... hat hier jemand eine Idee wie das zu bewerkstelligen ist?
Die windowsinterne Umsetzung des virtuellen Tastencodes (VK_SEPARATOR) der "Kommataste" auf dem Nummernblock wird durch die Ausführung der Funktion SetDecimalSeparator() nicht beeinflusst, bleibt also konstant wie vom System vorgegeben.
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;
Nee sorry, die Routine scheint nicht zu funktionieren bzw. zeigt keinerlei verändertes Verhalten.
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?