При работе с формами ввода в среде Delphi бывает необходимо ограничить ввод определённых символов, например, пробелов, а также разрешить использование клавиши "Backspace" для коррекции вводимых данных. Рассмотрим, как можно решить эту задачу с помощью обработчика события KeyPress.
Описание проблемы
В коде обработчика события KeyPress уже присутствует логика, которая должна разрешать ввод только определённых символов, но при этом клавиша "Backspace" блокируется. Необходимо внести изменения, чтобы разрешить использование этой клавиши, а также исключить возможность ввода пробелов.
Решение проблемы
Для начала, давайте разберёмся с тем, как работает текущий код. В нём определяется строка s, содержащая разрешенные символы, и проверяется, что текущий вводимый символ присутствует в этой строке. Если символ отсутствует, то ввод прерывается, и отображается сообщение об ошибке.
procedure TForm1.AEditKeyPress(Sender: TObject; var Key: Char);
var
s: string;
begin
s := ('1234567890.'); // Разрешенные символы
if Pos(Key, s) = 0 then begin
Key := #0;
ShowMessage('Invalid Char');
end;
end;
Чтобы разрешить использование клавиши "Backspace", необходимо добавить её в строку разрешенных символов. В Delphi клавиша "Backspace" представлена числовым кодом #8.
Обновлённый код будет выглядеть следующим образом:
procedure TForm1.AEditKeyPress(Sender: TObject; var Key: Char);
var
s: string;
begin
s := ('1234567890.'#8); // Добавляем Backspace
if Pos(Key, s) = 0 then begin
Key := #0;
ShowMessage('Invalid Char');
end;
end;
Подтвержденный ответ
В комментариях к коду уже присутствует подсказка о том, что необходимо добавить код клавиши "Backspace" в строку разрешенных символов. Это позволит разрешить её использование.
Альтернативный ответ
Для улучшения производительности и читаемости кода можно использовать множества символов, как константу. Также стоит обработать ввод десятичного разделителя, чтобы разрешить ввод только одного такого символа.
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
const
Backspace = #8;
AllowKeys: set of Char = ['0'..'9', Backspace];
begin
if Key = '.' then Key := DecimalSeparator; // Заменяем точку на локальный разделитель
if not ((Key in AllowKeys) or
(Key = DecimalSeparator) and (Pos(Key, Edit1.Text) = 0)) then begin
ShowMessage('Invalid key: ' + Key);
Key := #0;
end;
end;
Также стоит рассмотреть использование специализированных компонентов, таких как TNumericEdit, которые предоставляются в различных библиотеках, таких как DevExpress, JVCL, EhLib, RxLib и многие другие. Эти компоненты обеспечивают более продвинутую функциональность, включая поддержку вставки текста, научного формата записи чисел и многое другое.
Заключение
В данной статье мы рассмотрели, как разрешить использование клавиши "Backspace" и блокировать ввод пробелов в элементах ввода в Delphi, используя обработчик события KeyPress. Приведённые примеры кода демонстрируют базовый подход к решению этой задачи, а также альтернативные методы, улучшающие читаемость и производительность кода.
В среде Delphi необходимо настроить обработчик события `KeyPress` для элемента ввода, чтобы разрешить использование клавиши 'Backspace' и блокировать ввод пробелов, сохраняя при этом возможность ввода других разрешенных символов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS