Цифровой TEditНеобходимо, чтобы в TEdit пользователь мог ввести только цифры? Я часто встречаю различные решения данной задачи, которые в основном сводятся к обработке события OnKeyPress. Сегодня рассмотрим кардинально другой подход — изменение стиля TEdit с помощью WinApi.

Итак, как же чаще всего фильтруют? Этот способ я даже встречал в каких-то официальных исходниках-примерах от borland.
Суть метода состоит в том, чтобы обрабатывать событие OnKeyPress, проверять параметр Key, передаваемый обработчику. Это char, да. И если этот char — не разрешенный символ для ввода и не #8 (backspace, про него не стоит забывать), то установить тот же Key в #0. Таким образом, некавайные символы не получится ввести.
Вот из из множества возможных вариантов реализации:

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

Здесь нам помогает оператор in, который проверяет наличие символа в указанном нами массиве (от нуля до девятки и backspace). С другим набором символов это, может быть, и наиболее правильный способ, но фильтрация ввода чисел в самом TEdit уже предусмотрена, нам надо только изменить его стиль, о чём далее.

Константы, начинающиеся на WS_ (от window style) являют собой константы стилей для объектов. Обязательно указываются при создании окон через различные winapi-функции. Наш TEdit WS_CHILD и WS_VISIBLE — дочерний и видимый. Также есть специальные константы только для Edit’ов, они начинаются на ES_. ES_NUMBER — нужный нам стиль. Подробнее про стили напишу когда-нибудь на блоге :)
Для изменения стилей в 32-хбитных windows была функция SetWindowLong, для совместимости с 64-хбитными была введена api функция SetWindowLongPtr.

  SetWindowLongPtr(Edit1.Handle, GWL_STYLE, WS_CHILD or WS_VISIBLE or ES_NUMBER);

Если приведённый ниже код написать в FormCreate, то пользователь ничего не сможет ввести, кроме цифр, что и требовалось.
Да, функция SetWindowLongPtr, в отличие от SetWindowLong, отсутствует в delphi седьмой версии и ниже, если используешь, то надо импортировать из user32.dll.

Постовой:
dmitko.ru: Блог о python, django, javascript и многом другом.

(c) Всегда ваш crystalbit