Другие языки программирования и технологии

Проверка Edit в Delphi

Подскажите, как организовать проверку на корректность ввода в поле Edit? Имеется в виду следующее: если данные некорректны, вывести сообщение, вернуть фокус ввода и, самое главное, заставить ввести данные заново (т.е. не пускать дальше)?
Доброго времени суток.

Трудно не зная тонкостей задачи дать вменяемый ответ. Попробую в качестве примера показать куски из рабочего проекта. На форме несколько экземпляров TEdit, корректными значениями которых являются только цифры. Процесс расчета запускается по нажатию кнопки. Обработчик клика делаем таким.

procedure TForm1.btnCalcClick(Sender: TObject);
begin
if not (ValidData(i1, Edit1) and
ValidData(i2, Edit2) and
ValidData(i3, Edit3) and
ValidData(i4, Edit4) and
ValidData(i5, Edit5)) then Exit;

if (ActionID < 9) or (btnCalc.Caption = 'Принять') then AddElements
else CalcIntersect;
end;

i1 .. i5 - локальные поля формы (не спрашивайте почему так сделано) . Т. е. перед запуском вычислений просто проверяем содержимое едитов. Эта миссия возложена на метод

function TForm1.ValidData(var i: Longint; Edit: TEdit): Boolean;
begin
Result := True;
if Edit.Visible then begin
try
i := StrToInt(Edit.Text);
except
DrawErrMessage(ErrMsg[eMsgDataError]);
ActiveControl := Edit;
Result := False;
end;
end;
end;

В методе проверяется видимость элемента, поскольку в различных ситуациях некоторые могут быть скрыты. Далее выполняется попытка преобразовать текст в число. При ошибке выводится сообщение, фокус устанавливается на едит с "левыми" данными и все завершается.

Пару слов о том, как не дать ввести в едит не цифры.

Реализуем пару функций. Причем даже не методами формы.

function CheckKey(Key: Char): Char;
begin
Result := Chr(0);
case Key of
'0'..'9', #8 : Result := Key; // цифры и <backspace>
end;
end;

function CorrectText(s: String; Idx: Longint ): String;
begin
Result := s;
Delete(Result, Idx, 1);
end;

А обработчики делаем такими.

procedure TForm1.KeyPress(Sender: TObject; var Key: Char);
begin
Key := CheckKey(Key);
end;

В принципе, реализацию функции CheckKey можно было внести в этот обработчик, но просто она используется еще в других местах.

procedure TForm1.TextChanged(Sender: TObject);
const
ValidChar : Set of Char = ['0'..'9'];
var
i : Longint;
begin
for i:=1 to Length((Sender as TEdit).Text) do begin
if not ((Sender as TEdit).Text[ i ] in ValidChar) then
if (i > 0) and (i <= Length((Sender as TEdit).Text)) then begin
(Sender as TEdit).Text := CorrectText((Sender as TEdit).Text, i);
(Sender as TEdit).SelStart := i - 1;
// Beep;
Break;
end;
end;
end;

Первый из них вешаем на событие OnKeyPress, а второй на OnChange всех едитов. Эти пляски в результате дают то, что в едит невозможно запихать не цифру. Причем не только путем ввода с клавы, но и посредством вставки из буфера обмена.

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

Надеюсь, что хоть немного помог.

Удачи!
Талгат Каймульдинов
Талгат Каймульдинов
59 613
Лучший ответ
Берiк Маханбетов Да, немало интересного... Я вспомнил, что именно мне было надо (давно делфи не трогал): всего-то поставить обработчик на onExit, а там проверяю:

if Edit1.Text = '' then
begin
MessageDlg('Введите число!', mtWarning, [mbOK], 0);
Edit1.SetFocus;
Edit1.SelectAll;
end;

Вот вроде так...
if pos(строка, символ) <>0 then?