如何在我的Delphi应用程序中更改数字键的小数点分隔符?

时间:2010-10-13 13:28:17

标签: delphi

在我的国家/地区,小数点分隔符为“”。我的一位客户希望将其作为“”字符。如何将小数点分隔符更改为“”?

我试过这个:

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  DecimalSeparator := '.';
  Application.UpdateFormatSettings := True;
end;

但是这段代码只能帮助你。我在浮点字段中看到了“”。但是,当用户按下数字键盘上的“”键时,无论设置如何都会发送逗号。 这是与网格无关的问题,我在表单上的KeyPress事件上检查了这个。

我正在使用Delphi 2007,感谢您的帮助。

2 个答案:

答案 0 :(得分:9)

首先,您应该将UpdateFormatSettings设置为false!如果此属性为true,则DecimalSeparator将不时地重置为Windows默认值(例如,每次锁定工作站(使用Win + L),然后再次将其解锁)。默认值为true,因此当您要覆盖false时,需要将其设置为DecimalSeparator

其次,在将浮点数格式化为字符串时(例如,使用DecimalSeparatorFloatToStr时),Delphi例程使用FormatFloat。要使数字小键盘上的小数分隔符键产生一个点(.)而不是操作系统默认字符(可能是.,),您可以处理{ {1}}事件:

OnKeyPress

但要小心 - 这会将{strong>所有 procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if Key = ',' then Key := '.' end; 替换为,,甚至是用键盘字母部分的逗号键插入的那些。

更高级(更安全)的方法是处理.事件,如下所示:

OnKeyDown

答案 1 :(得分:1)

此键映射到的char不是由Delphi确定的,而是由Windows中设置的键盘布局决定的。

一个黑客只是简单地替换。在OnKeyPress处理程序中。

否则你需要以某种方式修改KeyDown / Up消息的翻译到按键消息,但我不知道该怎么做。
从虚拟键到字符的转换发生在TranslateMessage http://msdn.microsoft.com/en-us/library/ms644955(VS.85).aspx中 因此,您可以事先检查传入TranslateMessage的消息,检查它是否是numpad上的虚拟十进制密钥,然后传入另一个虚拟密钥。但你能做的一切都是非常黑的。