Delphi-使一个EditBox只接受Keypress事件中小于或等于(< =)12的数字

时间:2016-10-26 09:38:44

标签: delphi vcl delphi-10.1-berlin

我有一个编辑框,我试图让它只接受0到12之间的数字。我写了一个像这样的onExit处理程序:

procedure TfrmCourse.edtDurationExit(Sender: TObject);
begin
     if not string.IsNullOrEmpty(edtDuration.Text) then
          begin
            if StrToInt(edtDuration.Text) > 12 then
            begin
              edtDuration.Clear;
              edtDuration.SetFocus;
            end;
          end;
end;

...但我想在输入时检查此。 TEdit应该只接受数字输入并在值>>时发出警告。 12。

我提出这个问题的答案是

最终答案

procedure TfrmCourse.edtDurationKeyPress(Sender: TObject; var Key: Char);
var
  sTextvalue: string;
begin
  if Sender = edtDuration then
  begin
    if (Key = FormatSettings.DecimalSeparator) AND
      (pos(FormatSettings.DecimalSeparator, edtDuration.Text) <> 0) then
      Key := #0;

    if (charInSet(Key, ['0' .. '9'])) then
    begin
      sTextvalue := TEdit(Sender).Text + Key;
      if sTextvalue <> '' then
      begin
        if ((StrToFloat(sTextvalue) > 12) and (Key <> #8)) then
          Key := #0;
      end;
    end
  end;
end;

1 个答案:

答案 0 :(得分:2)

如果输入的字符不是数字,转换函数StrToInt()会引发EConvertError。您可以通过设置TEdit.NumbersOnly属性来处理此问题。我建议改为使用TryStrToInt()函数(或者另外)。虽然您说要在键入时检查,但我还建议您使用OnChange事件,因为它还会通过从剪贴板粘贴来捕获错误的输入。

procedure TForm5.Edit1Change(Sender: TObject);
var
  ed: TEdit;
  v: integer;
begin
  ed := Sender as TEdit;
  v := 0;
  if (ed.Text <> '') and
    (not TryStrToInt(ed.Text, v) or (v < 0) or (v > 12)) then
  begin
    ed.Color := $C080FF;
    errLabel.Caption := 'Only numbers 0 - 12 allowed';
    Exit;
  end
  else
  begin
    ed.Color := clWindow;
    errLabel.Caption := '';
  end;
end;

errLabel是编辑框附近的标签,用于指示用户错误输入。