NumbersOnly TEdit Delphi提示不起作用

时间:2016-07-14 13:43:43

标签: delphi delphi-10-seattle vcl-styles

我正在使用主题为Windows 10的Delphi Seattle,为Windows Desktop创建程序 在TEdit如果是活跃的NumbersOnly属性,在尝试输入单词时,您会看到标准的Windows提示。
如果我离开没有主题的程序,则提示正确显示,并显示消息说明您只能输入数字。但如果活动主题消息不可读。

任何人都知道我可以在哪里更改此内容,因为我正在查看Vcl.StdCtrls.pas内部并且找不到向用户生成此消息的时间。

正确提示:

enter image description here

错误提示: enter image description here

3 个答案:

答案 0 :(得分:8)

此问题已在RAD Studio 10.1 Berlin中修复。但是,如果您无法升级RAD Studio版本,请尝试VCL Styles Utils项目,其中包含针对此的修复程序。只需要将Vcl.Styles.Utils.ScreenTips单位添加到项目中。

enter image description here

答案 1 :(得分:2)

更新到Delphi 10.1(柏林) - 它似乎已修复,因为我无法重现这一点,而我可以使用10.0(西雅图)。

bugfix list for Berlin显示了与VCL样式相关的几个问题。

答案 2 :(得分:2)

对此的解决方法是不依赖于the ES_NUMBER style背后相当无用的Microsoft实现,而是实现自己的逻辑。

type
  TEdit = class(VCL.StdCtrls.TEdit)
  protected
    FInsideChange: boolean;
    function RemoveNonNumbers(const MyText: string): string;
    procedure KeyPress(var Key: Char); override;
    procedure Change; override;
  end;

  procedure TEdit.KeyPress(var Key: Char);
  begin
    if NumbersOnly then begin
      if not(Key in ['0'..'9','-',#8,#9,#10,#13,#127]) then begin
        Key:= #0;
        //Put user feedback code here, e.g.
        MessageBeep;
        StatusBar.Text:= 'Only numbers allowed';
      end else StatusBar.Text:= '';
    end;
    inherited KeyPress(Key);
  end;

  procedure TEdit.Change; override;
  begin
    if FInsideChange then exit;
    FInsideChange:= true;
    try
      inherited Change;
      Self.Text:= RemoveNonNumbers(Self.Text);
    finally
      FInsideChange:= false;
    end;
  end;

  function TEdit.RemoveNonNumbers(const MyText: string): string;
  var
    i,a: integer;
    NewLength: integer;
  begin
    NewLength:= Length(MyText);
    SetLength(Result, NewLength);
    a:= 1;
    for i:= 1 to Length(MyText) do begin
      if MyText[i] in ['0'..'9'] or ((i=1) and (MyText[i] = '-')) then begin
        Result[a]:= MyText[i];
        Inc(a);
      end else begin
        Dec(NewLength);
      end;
    end; {for i}
    SetLength(Result, NewLength);
  end;

现在不接受非数字,即使粘贴文本也不会。