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

Wod*_*dzu 3 delphi

在我的国家,小数点分隔符是" , ".我的一个客户希望将其作为" . "字符.如何将小数点分隔符更改为" . "?

我试过这个:

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  DecimalSeparator := '.';
  Application.UpdateFormatSettings := True;
end;
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*and 9

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

其次,DecimalSeparator当将浮点数格式化为字符串时(例如,使用FloatToStr或时 FormatFloat),Delphi例程使用它.要使数字小键盘上的小数点分隔符键产生一个point(.)而不是OS默认字符(可能是.或者,),您可以处理该OnKeyPress事件:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key = ',' then
    Key := '.'
end;
Run Code Online (Sandbox Code Playgroud)

但要谨慎-这将取代所有 ,.,即使是那些对键盘的字母部分逗号键插入.

更高级(和更安全)的方法是处理这样的OnKeyDown事件:

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  msg: TMsg;
begin
  if Key = VK_DECIMAL then
  begin
    PeekMessage(msg, Edit1.Handle, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE);
    SendMessage(Edit1.Handle, WM_CHAR, ord('.'), 0);
  end;
end;
Run Code Online (Sandbox Code Playgroud)