Другие языки программирования и технологии
Проверка 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 всех едитов. Эти пляски в результате дают то, что в едит невозможно запихать не цифру. Причем не только путем ввода с клавы, но и посредством вставки из буфера обмена.
Если у вас иной смысл корректности данных, то, думаю, и в этом случае возможно использовать подобный подход.
Надеюсь, что хоть немного помог.
Удачи!
Трудно не зная тонкостей задачи дать вменяемый ответ. Попробую в качестве примера показать куски из рабочего проекта. На форме несколько экземпляров 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 всех едитов. Эти пляски в результате дают то, что в едит невозможно запихать не цифру. Причем не только путем ввода с клавы, но и посредством вставки из буфера обмена.
Если у вас иной смысл корректности данных, то, думаю, и в этом случае возможно использовать подобный подход.
Надеюсь, что хоть немного помог.
Удачи!
if pos(строка, символ) <>0 then?
Похожие вопросы
- [Delphi] Обработка Edit. Как ввести проверку, чтобы первый символ в Edit был числом?
- Согласны с этим - Глубинные причины ненависти к Delphi/Pascal ?
- Delphi:Прочитал, что если при динамическом создании компонента если указать Name объекта, то в последующем можно ->
- Как на Pascal'е обнулить значение Edit? (что-то типа Edit.Caption:=' ')
- Как в Delphi сделать справку?
- Помогите найти ошибку Delphi легкая программка
- Delphi ПОМОГИТЕ ПОЖАЛУЙСТА!
- Задача на Delphi. Аааа решите пожалуйста :'(
- Про Delphi
- Delphi. Обьясните подробно, что, как, и для чего нужен\используется "while" ?
if Edit1.Text = '' then
begin
MessageDlg('Введите число!', mtWarning, [mbOK], 0);
Edit1.SetFocus;
Edit1.SelectAll;
end;
Вот вроде так...