NumbersOnly TEdit Delphi 提示不起作用

Posted

技术标签:

【中文标题】NumbersOnly TEdit Delphi 提示不起作用【英文标题】:NumbersOnly TEdit Delphi Hint not working 【发布时间】:2016-07-14 13:43:43 【问题描述】:

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

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

正确提示:

错误提示:

【问题讨论】:

我猜提示消息是由 windows 本身生成的,而不是由 vcl 生成的。也许您可以编写自己的处理程序以仅接受数字,可以在此处找到示例:***.com/questions/6896870/… 是的,这是系统级提示,而不是 VCL 级提示。 NumbersOnly 属性只是启用 ES_NUMBER 窗口样式。 谢谢,我使用了 VCL Styles Utils,对项目中的 numbersOnly 属性进行了很多编辑。 【参考方案1】:

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

【讨论】:

谢谢,帮了我很多忙【参考方案2】:

更新到 Delphi 10.1 (Berlin) - 它似乎已修复,因为我无法在 10.0 (Seattle) 中重现此问题。

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

【讨论】:

Tks Stefan,我也看到了。最近在这里更新,这个问题不再有问题。【参考方案3】:

解决方法是不要依赖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;

现在将不接受非数字,即使在粘贴文本时也是如此。

【讨论】:

@dummzeuch,你有没有错过我说的部分://Put user feedback code here 完全不同意,接受随机字符的整数编辑框只会加重。如果只有数字适用,它不应该接受其他任何东西,除此之外,ES_NUMBERS 所做的(除了它在复制粘贴时不检查)。 @dummzeuch 所以如果我输入R2D2,你是说你想要一个只有数字的框继续接受完整的R2D2 字符串?这不是破坏了整个目的吗? @dummzeuch:那么当问题是特别关于使用带有 ES_NUMBERS 的编辑控件时,您应该避免发表评论,这在设计上旨在将控件限制为只接受数字.

以上是关于NumbersOnly TEdit Delphi 提示不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 Tedit Delphi 中更改字符

Delphi Firemonkey Android TEdit滑动滚动不聚焦

Delphi 之 编辑框控件(TEdit)

DELPHI中如何使用ADOQUERY和TEDIT,TMEMO操作数据库。

在 Delphi VCL 中通过组合两个控件(TEdit 和 TTrackBar)创建一个新组件

Delphi7如何实现让Tedit显示文字垂直居中(上下居中)