Как сделать чтобы в edit вводились только цифры делфи
Программа состоит из двух процедур. Первая, работающая в обработчике события KeyPress компонента Edit, не допускает появления нежелательных символов, то есть любых, не равных цифре или символу-разделителю целой и дробной частей числа. Последний может быть равен точке или запятой, в зависимости от текущих настроек Windows. Поэтому используется встроенная в Delphi константа DecimalSeparator, содержащая нужный символ. Вторая процедура, базирующаяся на обработчике события KeyUp, приводит вводимое число к привычному, общеупотребительному виду. Например, не допускает появления числа, у которого символ-разделитель — первый из символов.
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
private
public
end;
procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var n: Integer;
S: String;
begin
with (Sender as TEdit) do
begin
if pos(DecimalSeparator, Text)=1 then
begin
Text:=’0’+Text;
SelStart:=Length(Text);
end;
if (pos(DecimalSeparator, Text)<>Length(Text)) then
if Text[Length(Text)]<>‘0’ then
if FloatToStr(StrToFloat(Text))<>‘0’ then
Text:=FloatToStr(StrToFloat(Text));
if Key=8 then
begin
n:=SelStart;
S:=Text;
Delete(S, n, 1);
Text:=S;
end;
SelStart:=Length(Text);
end;
end;
Сначала положите на Форму компонент Edit. Затем, открыв вкладку Events в Инспекторе Объектов и дважды щёлкнув по обработчикам событий OnKeyPress и OnKeyUp компонента Edit, создайте заготовки обработчиков этих событий. Затем замените обработчики предлагаемыми процедурами — и ваш Edit сможет содержать только числа. Если у вас несколько компонентов, то достаточно создать тоько одну пару предлагаемых процедур, для одного, любого из них. К остальным их нужно подключить, выбрав в Инспекторе Объектов в качестве обработчиков соответствующих событий.
Дополнительно можно обеспечить размещение числа у правого края Edit, как в калькуляторе Windows. Для этого сразу после
добавьте следующий код:
type
TMEdit = class(TEdit)
procedure CreateParams(var Params: TCreateParams); override;
end;
procedure TMEdit.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.Style := Params.Style or ES_RIGHT;
end;
а также в обработчике события OnCreate Формы (если его нет — создайте!) добавьте строку
Естественно, Edit1 замените на имя вашего компонента.
Здравствуйте дорогие друзья. Сегодня я расскажу о том, как организовать работу программы так, чтобы в edit можно было вводить только цифры и десятичный разделитель.
В Delphi делается это достаточно просто. Все, что требуется — написать обработчик события OnKeyPress
Стоит заметить, что это не единственный способ запретить вводить символы в Edit. В последних версиях Emb a rcadero у класса Tedit появилось свойство NumbersOnly, поставив это свойство в true, вы запретите вводить в поле буквы.
Приведу пример, где можно применить полученные знания. Допустим вы пишете приложение, которое производит расчет на основе введеных данных. Пользователь программы вводит начальные значения, на основе которых происходит расчет. В таком случае стоит запретить ввод символов, иначе это может привести к ошибке. Лучше преодостерчься от этого и подстраховаться. Используйте полученные знания везде, где от юзера требуется получить исключительно цифры. Это поможет предотвратить нелепые ошибки.
Используйте любой, понравившийся Вам метод. Надеюсь, что я смог помочь. Спасибо за внимание.
Очень часто возникает необходимость ограничить ввод в поле TEdit, разрешив, например, только цифры. Сделать это можно с помощью несложного обработчика, назначаемого на событие OnKeyPress нужного компонента TEdit:
Альтернативное решение данной задачи предложил наш читатель dunin:
В Си билдере я пока еще деревянен. К сожалению помоч сейчас не смогу. Могу дать пример на дельфе:
Частичное знание билдера тут не поможет. Поэтому м.б. народ более знающий поможет перевести )
Во-первых, возможно, потом потребуется проверять не только цифры, но и десятичный разделитель и другие знаки.
Во-вторых, проверять всю строку правильнее с точки зрения перспективы. Может, туда нужно будет программно вставлять символы.
Ну по поводу разделителя десятичного, тогда можно использовать try-catch. А по поводу перспективы, так я предлогаю максимально простое решение для поставленной задачи. Впрочем, пусть автор решает, как ему больше подойдет.
Ввод и редактирование текста выполняется в специальных полях или областях формы. При необходимости пользователь может изменить отображаемые данные. Для этих целей система Delphi предлагает различные компоненты, например, Edit, MaskEdit, Memo, RichEdit и LabeledEdit.
Однострочный редактор, или поле редактирования (поле ввода), представляет собой поле ввода текста, в котором возможно отображение и изменение текста. В Delphi есть несколько однострочных редакторов, из них наиболее часто используется компонент Edit.
Компонент ввода и редактирования текста Edit
Компонент Edit позволяет вводить и редактировать с клавиатуры различные символы, при этом поддерживаются операции, такие как перемещение по строке с использованием клавиш управления курсором, удаление символов с помощью клавиш и , выделение части текста и др. Отметим, что у однострочного редактора отсутствует реакция на управляющие клавиши и .
Свойство CharCase
Для изменения регистра символов в поле редактирования служит свойство СharСase типа TEditcharCase, которое может принимать одно из трех значений:
- ecLowerCase — текст преобразуется к нижнему регистру;
- ecNormal — регистр символов не изменяется (по умолчанию);
- ecUpperCase — текст преобразуется к верхнему регистру.
Свойство PasswordChar
При использовании компонента Edit для ввода пароля можно воспользоваться свойством PasswordChar типа Char, задающим символ для отображения в поле ввода. Этот символ при вводе текста появляется вместо фактически введенного символа. Например, после выполнения инструкций
в поле редактирования появится строка ******, в то время как в действительности свойство Text имеет значение — 'Пароль'.
Компонент MaskEdit
Компонент MaskEdit также является однострочным редактором, но по сравнению с компонентом Edit он предоставляет дополнительную возможность ввода информации по шаблону. С помощью шаблона (маски) можно ограничить число вводимых пользователем символов, тип вводимых символов (алфавитный, цифровой и т. д.). Кроме того, во вводимую информацию можно вставить дополнительные символы (разделители при вводе даты, времени и т. п.). С помощью редактирования по маске удобно вводить телефонные номера, даты, почтовые индексы и другую информацию заранее определенного формата.
Свойство EditMask
Маска задается в свойстве EditMask типа string и представляет собой последовательность специальных кодов, определяющих для поля редактирования формат содержащегося в ней текста.
Маска состоит из разделенных символом трех полей:
- первое поле является собственно маской;
- второе поле— это символ, определяющий, считаются ли литеральные символы частью данных. По умолчанию используется 1, и литеральные символы маски являются частью не только значения, редактируемого в визуальном компоненте, но и значения, содержащегося в поле. Если вместо 1 установить символ о, то литеральные символы маски по-прежнему будут отображаться при редактировании значения, однако в поле не сохраняются. Литеральные символы удобно применять в качестве разделителей, например, при вводе телефонных номеров;
- третье поле содержит символ, используемый для указания незаполненных символов во вводимом тексте, по умолчанию это символ подчеркивания.
Если второе и/или третье поля не определены, то для них действуют значения по умолчанию.
В маске могут использоваться следующие специальные символы:
Примеры масок:
Для составления маски можно использовать редактор шаблонов (Input Mask Editor). Редактор шаблонов вызывается двойным щелчком мыши в поле значения свойства EditMask или командой Input Mask Editor контекстного меню.
Маска вводится в поле Input Mask, ее также можно выбрать из образцов в поле Sample Masks и затем изменить. Флажок Save Literal Characters управляет включением в маску литеральных символов, а поле Character for Blanks содержит символ, используемый для указания незаполненных позиций во входной строке. Поле Test Input позволяет проверить функционирование подготовленной маски. Маску также можно загрузить из файла с расширением dem, который выбирается в окне Open Mask File, открываемом нажатием кнопки Masks.
Подготовить маску можно и самому, но это более сложно. Удобно, воспользовавшись редактором маски, выбрать наиболее близкую к требуемой маску, а затем уже откорректировать ее вручную.
Компонент LabeledEdit
Компонент LabeledEdit представляет собой однострочный редактор с надписью и, в отличие от обычного однострочного редактора Edit, дополнительно имеет три свойства, управляющие надписью: EditLabel, LabelPosition и LabelSpacing.
Свойство EditLabel
Свойство EditLabel типа TBoundLabel указывает объект надписи, основные свойства которого (Caption, Alignment, AutoSize, Transparent, Color, Font) не отличаются от свойств рассмотренной ранее надписи Label.
Свойство LabelPosition
Свойство LabelPosition типа TLabeiPosition задает расположение надписи относительно поля редактирования и может принимать значения:
- lpAbove (над полем) — по умолчанию;
- lpBelow (под полем);
- lpLeft (слева от поля);
- lpRight (справа от поля).
Свойство LabelSpacing типа Integer указывает расстояние (в пикселах) между надписью и полем редактирования (по умолчанию 3).
Обработчик события onKeyPress
Для проверки информации, вводимой в редакторы, можно использовать обработчики событий нажатия клавиш, например обработчик события onKeyPress.
В следующем примере для редактора Edit1 установлено разрешение ввода только десятичных цифр:
В поле редактирования может содержаться одна строка без символа конца строки, поэтому при нажатии клавиши не выполняются никакие действия и в строку ничего не вводится. При необходимости программист должен сам написать код действий, связанных с нажатием клавиши . Чаще всего нажатие этой клавиши служит признаком окончания ввода информации в поле редактора, после чего следует перейти к другому элементу управления, т. е. передать ему фокус ввода, например, с помощью метода SetFocus или установки значения свойства ActiveControl.
Задать реакцию однострочного редактора на нажатие клавиши можно так:
Информация последовательно вводится в три поля, являющихся компонентами Edit1, Edit2 и Edit3. При окончании ввода в первое или второе поля нажатие клавиши автоматически активизирует очередное поле. Из третьего поля фокус ввода автоматически не передается. Передача фокуса ввода из разных полей реализована двумя способами: с использованием свойства ActiveControl формы и с помощью метода SetFocus.
Часто при окончании ввода в элемент редактирования и переходе к следующему (в порядке табуляции) элементу управления удобнее использовать разделяемый (общий) обработчик события, связанного с нажатием клавиши . Эта процедура должна быть общей для всех элементов редактирования и может выглядеть так:
При нажатии клавиши выполняется метод SelectNext, передающий фокус ввода следующему элементу управления. Процедура SelectNext (CurControl: TWinControl; GoForward, CheckTabStop: Boolean) имеет три параметра, из которых CurControl указывает оконный элемент управления, относительно которого выполняется передача фокуса. Параметр GoForward определяет направление передачи фокуса. Если его значение равно True, то фокус получает следующий элемент управления, в противном случае — предыдущий элемент управления. Параметр CheckTabStop определяет, нужно ли учитывать значение свойства TabStop элемента управления, который должен получить фокус. При значении True параметра элемент управления получит фокус, если его свойство Tabstop также имеет значение True.
Чтобы приведенная процедура вызывалась в качестве обработчика для всех трех редакторов, ее нужно включить в описание класса формы и указать в качестве обработчика события OnKeyPress:
Аналогично можно создать разделяемую процедуру, общую для нескольких компонентов (в том числе и разных, например, Edit и Memo), выполняющую обработку других событий.
Аналогичным образом выполняется обработка нажатия клавиши и других клавиш.
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
Репутация: 10
Репутация: 55
Репутация: 10
Репутация: 10
Немного непонятно как данную операцию связать с конкретными эдитами. У меня на форме их 3 и я хочу чтобы именно в 2х из них можно было вводить только цифры. Я описал процедуру описанную вами выше, изменив соответсвенно название формы на свою. Программа запускается но ни в одном не работает: во все 3 эдита можно вводить и цифры и буквы.
Репутация: 55
Репутация: 10
Репутация: 0
извеняюс наверно за глупый вопрос а какой код клавиши нужно добавить чтобы BackSpace работал в данном Edite
Репутация: 0
вот если так пропимано то при нажатии на бекспэйс ничего не происходит.
Кстати, ты думаешь, тебя это спасет от ввода НЕ цифр?
Copy + Paste еще никто не отменял .
Репутация: 0
Кстати, ты думаешь, тебя это спасет от ввода НЕ цифр?
Copy + Paste еще никто не отменял .
а есть ещё варианты.
пока вышел из ситуёвины тем что проверяю значение едита после его ввода непосредственно перед началоп операций с его значением. ИМХО както это неправильно
Варианты есть всегда.
На вкладке Additional есть компонент TMaskEdit. Вот если ты туда внесешь маску, позволяющую вводить только числа, то никакими Copy/Paste буквы не запишешь.
Репутация: 55
Ctrl+V и так не работает.
А вот щелчок правой кнопкой. Можно, конечно, отлавливать.
volvo, у MaskEdit свои недостатки. Можно, например, ввести такое: "1 22" при маске "только цифры"
хотя. если кол-во цифр заранее известно, можно забить не 9, а 0.
Читайте также: