.

Немного истории…

При написании своего проекта был момент, когда требовалось разработать основную форму для занесения данных лица, от которого будет подано заявление: ФИО, адрес, паспортные данные и так далее.

Я накидал на форму поля ввода, все подписал, и думал это всё 😉 Затем дал протестировать одному агенту, чтобы узнать его мнение. И тут началось... Выяснилось, что на все поля нужно наложить проверку на вводимые данные. Например, в поле "Фамилия", "Имя" и "Отчество" нельзя вводить латиницу и всякие символы и так далее (допустима только кириллица, одинарные пробелы и дефис). Как позже показала практика, люди не смотрят, что вводят… По этому я стал применять ограничение для вводимых пользователем символов.

Фильтрация букв и цифр заносимых поля ввода (TEdit)

Итак, перейдем от лирического отступления к делу. У компонента edit, есть замечательное событие OnKeyPress. Событие возникает при вводе в поле любого символа, символ сохраняется в переменную  Key (тип Char). Вот то самое место, где можно ограничить ввод символов, делается это следующим образом:

 

Ограничение ввода в TEdit
OnKeyPress для TEdit

 

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if not (Key  in ['А'..'Я', #08]))  then  Key := #0;
end;

Разберем код. Сравниваем переменную Key с массивом символов, в данном случает от А до Я в верхнем  регистре, и, если условие выполняется, то символ отобразится в поле ввода. Если условие не выполняется, просто обнуляем переменную Key. То есть мы вводим программное ограничение на вводимые символы, которых нет в массиве 'А'..'Я'. В нашем случае мы делаем фильтрацию букв при вводе в поле edit. Но что вам мешает, например, делать тоже самое в ComboBox и других компонентах для ввода текстовых данных? Обратите внимание, что в условие стоит «not», это означает,  что за истину будет принято как раз то, что символ не входит в диапазон от А до Я.

Заметили в условие  код символа #08? Это код из таблицы ASCII – означает  он клавишу Backspace. При написание этого кода я столкнулся с тем, что если не указать это символ, получится следующие: можно внести любые буквы от А до Я, но нельзя редактировать запись… Поэтому мы дополнительно разрешаем вводить символ #08, тем самым позволяя пользователю редактировать текст.

Такое событие есть у большинства текстовых полей ввода, просто вставляете код и все. Правда есть одно «НО» - данный код я тестировал при написании DLL на Delphi XE 4… У меня возникли проблемы, о них я тоже напишу. Дабы вас предупредить…

Фильтрация ввода TEdit в DelphiXE4… Ложка дегтя в бочке меда…

Среда Delphi XE 4, и студии работают со строками в кодировке utf8 вместо cp1251. Тут скрывается корень зла и код, приведенный выше, уже не отработает. Поэтому следует его модернизировать, ниже приведу код для Delphi XE…

  
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
 simvol: AnsiString;
begin
simvol:=String(Key);
if not ( Char(simvol [1]) in ['А'..'Я',#08]) then Key := #0;
end;

Эпилог

Еще хотелось бы дать один совет.  Я делал следующую схему для ввода данных:

Заполняем поле edit и нажимаем Enter (в качестве подтверждения ввода) --> Проверяем в целом введенные данные--> Подсвечиваем поле или пропускаем дальше.

Ниже я приведу реализацию данной схемы.

  
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key  in ['А'..'Я', #08,#13]))  then  Key := #0;

if Key :=#13 then //Проверяем действительно ли нажата клавиша Enter
begin
  if    (Здесь условие проверки того, что ввели. Например, проверка введенного Имени по справочнику)      then
  begin
     Edit1.Color:=clWindow;  //Окрашиваем в белый цвет, можете заменить на другой
     Edit2.Enabel:=True; //Активируем следующие поле ввода
     Edit2.SetFocus; // Передаем в него фокус, такой порядок важен… Нельзя передавать фокус в не активирование поле – это вызовет ошибку.
  Else Edit1.Color:=clRed;  //Окрашиваем в красный. Если условие не выполнено…
End;

Вот все, что я хотел написать по этой теме.  Напоследок, скажу, что цифры указывайте вот так «’0’..’9’».  Надеюсь, данная статья будет вам полезна, дорогие читатели!

2 комментария

  1. Бабайка

    Хм. А на xe4 использовать вместо этого извращения utf8encode религия запрещает???

    Ответить
    • admin_shinobi

      Запрещает))) Если внимательно приглядеться к описанию процедуры, то можно заметить, что переменная Key имеет тип данных «Char». И по-моему utf8encode применяется для смены кодировки строки!!!!!!!, но мне надо сравнивать значения нажатых клавиш. Для проверки данного утверждения, я написал код: «if not ( utf8encode(Key) in [‘А’..’Я’,#08]) then Key := #0;». И получил ошибку «E2015 Operator not applicable to this operand type». Поэтому поставил костыль: символ->строку->символ.

      Ответить

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *