이 문제를 해결하려면 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;
텍스트를 붙여 넣을 때도 번호가 허용되지 않습니다.
내 생각은 힌트 메시지가 아니라 VCL에 의해 창 자체에 의해 생성됩니다. 어쩌면 여기에 예제가있는 숫자 만 받아들이도록 처리기를 작성할 수 있습니다. http://stackoverflow.com/questions/6896870/how-can-i-change-the-tedit-default-error-message-numbersonly- mode –
예, 시스템 레벨 힌트이지 VCL 레벨 힌트가 아닙니다. 'NumbersOnly' 속성은 단지'ES_NUMBER' 윈도우 스타일을 가능하게합니다. –
감사합니다. VCL 스타일 유틸리티를 사용했습니다. 프로젝트에서 numbersOnly 속성을 사용하여 많은 수정 작업을 수행했습니다. –