2016-10-26 6 views
0

У меня есть окно редактирования и я пытаюсь заставить его принимать числа только от 0 до 12. Я написал обработчик onExit, например это:Delphi- Сделать EditBox, чтобы принимать только числа lessthan или равно (<=) 12 на событие Keypress

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; 
+0

Элемент управления TMaskEdit может ограничить ввод двух цифр, но для получения допустимого диапазона вам необходимо выполнить собственный производный контроль. –

+0

Это обработчик с именем * edtDurationExit *, но вы проверяете значения * edtDays * ... Переименуйте событие, если это обработчик edtDays.OnExit. –

+0

Используйте один из событий OnKey .... –

ответ

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 это метка рядом поле редактирования, который дает указание пользователя ошибочной записи.

+2

'ShowMessage' - ужасный вариант в обработчике' Change' - это ужасно расстраивает пользователя. Лучше дать им немодальную обратную связь, что запись недействительна. Отображение сообщения прекрасное, когда им необходимо зафиксировать значения или продолжить некоторые операции, которые зависят от полной проверки ввода, но не во время их ввода. Http://stackoverflow.com/a/32008542/327083 Это также сомнительная идея изменить содержимое элемента управления в его собственном обработчике 'Change'. –

+0

Я использовал цветные текстовые поля red-ish на ошибочном вводе и отображал только сообщения, выходящие из них (что также имеет преимущество заставлять фокус вернуться к нему). Альтернативные подходы - отображать ошибки в TStatusBar или использовать для этого подсказки. – AmigoJack

+0

@J ... Вы правы в окне сообщения, а также в отношении изменения в обработчике OnChange в качестве принципа. Я был слишком суетлив, чтобы поцарапать его вместе. Забавно (или нет), как я уже забыл о вопросе «от 1 до 49» и о вашем ответе, который я даже читал подробно, так как у меня это получилось. Я скоро удалю ответ, как только вы ответите на этот комментарий. –

 Смежные вопросы

  • Нет связанных вопросов^_^