Как мне проверить, что текстовое поле содержит только цифры в Delphi? - PullRequest
7 голосов
/ 23 июня 2011

Может быть, это очень простой вопрос, но я никогда не касался Delphi.У меня есть поле для редактирования, и это может принять характер.Но при некоторых особых условиях я должен убедиться, что в окне редактирования есть только цифры.

Как мы можем это сделать?

Примечание: пользователь может ввести любой символ, но во время проверки у меня естьпроверить выше одного.

Ответы [ 4 ]

10 голосов
/ 23 июня 2011

Я не знаю, какое событие вы намереваетесь использовать для вызова проверки, но проверка может быть выполнена следующим образом:

if TryStrToInt(Edit1.Text, Value) then
  DoSomethingWithTheNumber(Value)
else
  HandleNotANumberError(Edit1.Text);
6 голосов
/ 23 июня 2011

Я не понимаю, почему вы хотите разрешить пользователю вводить символ, а позже не разрешить ему пройти проверку.

Если вам действительно нужно заблокировать вход, то лучше сделать такой элемент управления, чем взломать его самостоятельно. Если ваша версия delphi действительно старая, попробуйте JVCL: TJvValidateEdit в библиотеке компонентов JVCL, например, во всех версиях delphi. Однако в обычных последних версиях Delphi (2009 и более поздние версии) уже встроено несколько возможных решений, включая TMaskEdit и TSpinEdit.

Если вам действительно нужно написать метод проверки, рассмотрите возможность использования регулярного выражения или функции проверки с ручным кодированием и держите этот код отдельно от элемента управления.

// Taking OP question obsessively literally, this 
// function doesn't allow negative sign, decimals, or anything
// but digits
function IsValidEntry(s:String):Boolean;
var
  n:Integer;
begin
  result := true;
  for n := 1 to Length(s) do begin
    if (s[n] < '0') or (s[n] > '9') then
    begin
       result := false;
       exit;
    end;
  end;
end;
3 голосов
/ 23 июня 2011

Но при некоторых особых условиях я должен убедиться, что в окне редактирования есть только цифры.

Вам нужны два элемента управления редактированием.Один для значения только для чисел и один для значения для всех.Включить или отключить элемент управления, который соответствует условию.Если два элемента управления имеют правильные заголовки (и, возможно, подсказки, почему элемент управления включен или отключен), поэтому пользователь знает, что он должен ввести и почему.

  • Мне не нравится блокировать пользователя.Сценарий:
  • Я ввожу " abc123 "
  • при выходе из режима редактирования. Я получаю сообщение об ошибке "разрешены только числа"
  • Я понимаю, чтоЯ забыл выполнить специальное условие
  • Я хочу сделать что-то для достижения специального условия
  • , но не могу, потому что я всегда получаю сообщение об ошибке «разрешены только цифры»
  • поэтому мне нужно исправить значение на « 123 »
  • выполнить все, чтобы достичь особого условия
  • еще раз набрать мое старое значение «abc123»

aarrgghh : -)

Для простых форм ввода данных я делаю следующее: я допускаю неправильный ввод, но меняю цвет шрифта на красный для каждого элемента управления редактирования с помощьюневерный ввод (красный цвет шрифта не достаточно, когда пустое значение не допускается).Если пользователь пытается опубликовать данные, которые я отправляю, выдается одно сообщение об ошибке, информирующее пользователя о всех недопустимых полях ввода и отмене сообщения.

3 голосов
/ 23 июня 2011

Я знаю, что вы сказали user can enter any char but at the time of validation.
Однако я хотел бы предложить альтернативу, потому что кажется очень глупым разрешать пользователю вводить значения, только чтобы пожаловаться пользователю через 1 минуту; это просто пахнет хорошо ... не приятно.

Я бы запретил вводить что-либо, кроме цифр.
Если у вас есть целые числа, это особенно просто:

Заполните событие OnKeyPress для поля ввода.

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char) ;
begin
  if not(Key IN ['0'..'9', #8, #9, #13, #27, #127]) then key:= #0;
end;

Это отбросит все, что не является числом.

Если вы разрешите отрицательные числа, вам потребуется дополнительная проверка, чтобы убедиться, что - не был введен ранее.

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char) ;
var
  Edit1Text: string;
begin
  if (Key = '-') and Pos('-',Edit1.Text) = 0 then begin
    Edit1.Text:= '-' + Edit1.Text;  //Force the '-' to be in the front.
  end
  else if (Key = '-') and Pos('-',Edit1.Text) <> 0 then begin  //else flip the sign
    Edit1Text:= Edit1.Text;
    Edit1.Text:= StringReplace(Edit1Text, '-', '',[]);
  end;
  if not(Key IN ['0'..'9', #8, #9, #13, #27, #127]) then key:= #0;
end;

Поскольку пользователь также может вставлять данные в поле редактирования, вам все равно придется проверять данные при изменении текста в редактировании.
Поскольку в событии ONKeyPress это происходит довольно сложно, я использую пользовательский компонент редактирования, который выполняет такую ​​проверку и не позволяет пользователю вводить вводимые данные в поле ввода.

Лично я не верю, чтобы когда-либо выдавалось сообщение об ошибке, вы всегда должны стремиться не допустить, чтобы пользователь вводил неверные данные.

...