NumbersOnly TEdit Delphi 提示无效
NumbersOnly TEdit Delphi Hint not working
我正在使用 Delphi 西雅图主题为 Windows 10,为 Windows 桌面创建程序。
在 TEdit
if active NumbersOnly
属性 中,尝试键入单词时,您会看到标准的 Windows 提示。
如果我在没有主题的情况下离开程序,提示会正确显示,并显示一条消息,说明您只能输入数字。但如果活动主题消息是不可读的。
任何人都知道我可以在哪里更改它,因为我正在查看 Vcl.StdCtrls.pas
并且找不到向用户生成此消息的时间。
正确提示:
错误提示:
更新到 Delphi 10.1(柏林)- 它似乎已修复,因为我无法重现它,而我可以使用 10.0(西雅图)。
bugfix list for Berlin 显示了几个与 VCL 样式相关的问题正在修复。
解决此问题的方法是不依赖 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;
现在不接受非数字,即使粘贴文本也不行。
此问题已在 RAD Studio 10.1 Berlin 中修复。但是,如果您无法升级 RAD Studio 版本,请尝试 VCL Styles Utils
项目,其中包含对此的修复。只需要将 Vcl.Styles.Utils.ScreenTips
单元添加到您的项目中。
我正在使用 Delphi 西雅图主题为 Windows 10,为 Windows 桌面创建程序。
在 TEdit
if active NumbersOnly
属性 中,尝试键入单词时,您会看到标准的 Windows 提示。
如果我在没有主题的情况下离开程序,提示会正确显示,并显示一条消息,说明您只能输入数字。但如果活动主题消息是不可读的。
任何人都知道我可以在哪里更改它,因为我正在查看 Vcl.StdCtrls.pas
并且找不到向用户生成此消息的时间。
正确提示:
错误提示:
更新到 Delphi 10.1(柏林)- 它似乎已修复,因为我无法重现它,而我可以使用 10.0(西雅图)。
bugfix list for Berlin 显示了几个与 VCL 样式相关的问题正在修复。
解决此问题的方法是不依赖 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;
现在不接受非数字,即使粘贴文本也不行。
此问题已在 RAD Studio 10.1 Berlin 中修复。但是,如果您无法升级 RAD Studio 版本,请尝试 VCL Styles Utils
项目,其中包含对此的修复。只需要将 Vcl.Styles.Utils.ScreenTips
单元添加到您的项目中。