Фильтрация клавиш в TEdit (вводим только цифры)
Очень часто возникает необходимость ограничить ввод в поле TEdit, разрешив, например, только цифры. Сделать это можно с помощью несложного обработчика, назначаемого на событие OnKeyPress нужного компонента TEdit:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: char); begin // проверяем нажатую клавишу case Key of // цифры разрешаем '0'..'9': key:=key; // разрешаем десятичный разделитель (только точку) '.', ',': key:='.'; // разрешаем BackSpace #8: key:=key; // все прочие клавиши "гасим" else key:=#0; end; end;
По аналогии можно осуществить другие виды фильтрации. Например, запретить ввод русских букв, или добавив в список разрешённых не только цифры, но и математические символы. Главное здесь — понять принцип: нужные клавиши пропускаются, лишние — «обнуляются». Также можно «на лету» заменять некоторые символы (в приведённом примере осуществляется замена десятичного разделителя, что может быть удобно при работе с SQL-базами данных, поскольку отпадает необходимость в дополнительное проверке содержимого поля.
Альтернативное решение данной задачи предложил наш читатель dunin:
procedure TMainForm.Edit1KeyPress(Sender: TObject; var Key: char); begin Edit1.ReadOnly:= not (Key in ['0'..'9','.',',',#8]); end;
А совсем правильно — присвоить контролу ES_NUMBER через SetWindowLong; начиная с D2010 это доступно как св-во TEdit.
Не совсем правильно. В Lazarus нет такого свойства. Да и вообще не понятно причём тут D2010?
Хм, а если я захочу вставить в Edit текст из буфера обмена путём CTRL+V, он не вставится, так что пример не доработан… Исправьте пожалуйста!
Edubuntu 10.10, Lazarus 0.9.28-2,вариант с case не работает с русскими буквами. Делаем калькулятор на уроках, английские буквы фильтруются, русские пролетают.
Такое ощущение, что нажатие на буквенную клавишу в русском регистре пролетает мимо события OnKeyPress
Спасибо за нужную информацию , но отсюда у меня возникает вопрос как запретить ввод допустим трехзначного числа , мне нужно чтобы вводились только двухзначные подскажите плз
Сделай длину (MaxLength) равным 2, и будет норм)
А почему бы просто не использовать компонент TMaskEdit. Он более универсален.
Примеры масок и описание можно подглядеть в Delphi:
http://docwiki.embarcadero.com/Libraries/XE2/en/Vcl.Mask.TMaskEdit
Phone | 4155551212 | !(999)000-0000;1;_
Extension | 15450 | !99999;1;_
Social Security | 555555555 | 000-00-0000;1;_
Short Zip Code | 90504 | 00000;1;_
Long Zip Code | 905040000 | 00000-9999;1;_
Date | 062794 | !99/99/00;1;_
Long Time | 090515PM | !90:00:00>LL;1;_
Short Time | 1345 | !90:00;1;_