Delphi, TEdit текст как триггер действия - PullRequest
0 голосов
/ 25 мая 2018

Я использую TEdit, чтобы позволить пользователю ввести число, например, 10.

Я преобразую TEdit.Text в целое число, и вызывается процедура вычисления.

В этой процедуре вычисления была встроена проверка, чтобы убедиться, что никакие числа ниже 10. не обработаны.

В настоящее время я использую событие OnChange.Предположим, пользователь хочет изменить «10» на, например, «50».Но как только удаляется «10» или набирается «5» (за которым следует «0»), я запускаю свое предупреждение о том, что минимальное число равно 10. Т.е. программа не будет ждать, пока я полностью не наберу5 и 0.

Я пытался OnEnter, OnClick, OnExit, но я, кажется, не преодолел эту проблему.Единственное решение - добавить отдельную кнопку, которая запустит расчет с новым номером.Работает, но можно ли без кнопки?

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Спасибо за вашу помощь.Я попробовал вариант таймера, но не смог заставить его работать.Теперь у меня есть этот код, который работает (почти - см. Ниже), но требует, чтобы используемый всегда вводил CR:

procedure Calculate;
begin
  // this is my calculation procedure
  ShowMessage('calculation running correctly'); 
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
N   : integer;
begin
  if Key = #13 then
  begin
    N := StrtoInt(Edit1.Text);
    if N<10 then ShowMessage('<10!') else
      if N>100 then ShowMessage('>100!') else Calculate;
  end;
end;

Я использовал здесь ShowMessage () только для того, чтобы увидеть, работает ли пример кода.В настоящей программе я это исключил, как вы все предложили.Я также включил «пожелтеть при неправильной записи» (спасибо Дэвиду).Единственная проблема заключается в том, что, если пользователь запускает это, я получаю звуковой сигнал с моего компьютера.Я не вижу, что пошло не так.Но что вызывает звуковой сигнал?

0 голосов
/ 25 мая 2018

Используйте таймер для отложенной проверки, например:

procedure TForm1.Edit1Change(Sender: TObject);
begin
  // reset the timer
  Timer1.Enabled := false;
  Timer1.Enabled := true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := false;
  // do your check here
end;

Установка таймера на 500 мс должна подойти для большинства пользователей.

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

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

...