Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Форматный ввод в TEdit

15K
14 ноября 2006 года
Stalker-vir
9 / / 21.04.2006
Мне бы процедурку ввода чисел в компонент TEdit.
Нужно чтобы вводились числа только до 30, а остальные игнорировались.
Заранее спасибо!
344
15 ноября 2006 года
Delpher
493 / / 14.08.2005
[quote=Stalker-vir]Мне бы процедурку ввода чисел в компонент TEdit.
Нужно чтобы вводились числа только до 30, а остальные игнорировались.
Заранее спасибо![/quote]

советую сформулировать проблему понятнее, иначе тема так и будет без ответов.... или будет удалена...
547
16 ноября 2006 года
Hydra
488 / / 20.06.2006
Используй TMaskEdit свойство EditMask
Или обрабатывай TEdit событие OnChange
8
16 ноября 2006 года
mfender
3.5K / / 15.06.2005
[QUOTE=Hydra]Используй TMaskEdit свойство EditMask
Или обрабатывай TEdit событие OnChange[/QUOTE]
В OnChange следует проверять число ("если больше 30, то message backspace"), т.к. это событие происходит после всего перед прорисовкой. А нажатие букв нужно ловить в OnPressKey или OnKeyDown.
547
16 ноября 2006 года
Hydra
488 / / 20.06.2006
[QUOTE=mfender]
В OnChange следует проверять число ("если больше 30, то message backspace")
[/QUOTE]
Необязательно. Что-нть типа:
 
Код:
cPos=Edit1.SelStart;
  for i=1 to Edit1->Text.Length do
   if (Edit1.Text<'0' || Edit1.Text>'9') then
   Edit1->Text=Edit1.Text.Delete(i,1);
  Edit1.SelStart=cPos;

повесить на OnChange - и все Ок.
P.S. писал на билдере и переводил - верно с точностью до алгоритма.
8
16 ноября 2006 года
mfender
3.5K / / 15.06.2005
[quote=Hydra]Необязательно. Что-нть типа:
 
Код:
cPos=Edit1.SelStart;
  for i=1 to Edit1->Text.Length do
   if (Edit1.Text<'0' || Edit1.Text>'9') then
   Edit1->Text=Edit1.Text.Delete(i,1);
  Edit1.SelStart=cPos;

повесить на OnChange - и все Ок.
P.S. писал на билдере и переводил - верно с точностью до алгоритма.[/quote]

Тогда уж надо if (Edit1.Text<'0' || Edit1.Text>'30') then...

И потом, подумай, что будет со всем этим, если юзерь кликнет по "нецифре"? Это-то тут не отслеживается...
339
17 ноября 2006 года
verybadbug
619 / / 12.09.2005
Код:
//проверка нажатия цифр
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if not (Key in ['0'..'9', #8]) then Key := #0;
end;

//проверка числа 0-30
procedure TForm1.Edit1Change(Sender: TObject);
var
  Edit: TEdit;
  I: Integer;
  ss: Integer;
begin
  Edit := TEdit(Sender);
  ss := Edit.SelStart;
  if not TryStrToInt(Edit.Hint, I) then Edit.Hint := '0';
  if not TryStrToInt(Edit.Text, I) then I := 0;
  if (I < 0) or (I > 30) then begin
    Edit.Text := Edit.Hint;
    Edit.SelStart := ss;
  end else Edit.Hint := Edit.Text;
end;
303
17 ноября 2006 года
makbeth
1.0K / / 25.11.2004
Еще вариант:
Код:
procedure Form1.Edit1KeyPress(Sender: TObject; var Key: Char);
var AcceptKey: boolean;
     CurrentText: string;
     CurrentTextLength: Integer;
begin
    if Key = #8 then Exit; // BackSpace
    AcceptKey:=false;
    CurrentText:=Edit1.Text;
    CurrentTextLength:=Length(CurrentText);
    if (Key in ['0'..'9']) and (CurrentTextLength < 2) then
    begin
        if (CurrentTextLength = 0) then
        begin
            if (Key <= '3') then AcceptKey:=true
        end else if CurrentText[1] = '3' then
        begin
            if Key = '0' then AcceptKey:=true;
        end else AcceptKey:=true;
    end;
    if not AcceptKey then Key:=#0;
end;
302
17 ноября 2006 года
Sagittarius
648 / / 12.04.2003
[QUOTE=mfender]Тогда уж надо if (Edit1.Text<'0' || Edit1.Text>'30') then...[/QUOTE]
Сдается мне, что это неправильное сравнение. :)
Text - это один символ, а '30' - это уже строка.
309
17 ноября 2006 года
el scorpio
1.1K / / 19.09.2006
А лучше всего, не изобретать велосипед, а "прицепить" к Edit'у стандартный VCL компонент TUpDown, сделав его "невидимым" (Visible = false).
Соответственно, в свойствах компонента, указать Min = 0, Max = 30 и Increment = 1. И ВСЁ :)
Естественно, данный способ будет реализовывать ввод только целых чисел.

А вот для дробных, придётся постараться. Вот только одно свойство OnChange тут не поможет - нужно перехватывать ещё "нажатие клавиши" OnKeyPress. Если вводимый символ оказвается недопустимым с точки зрения дробных чисел (нецифровой либо вторая запятая), то символ обнуляется.
А вот в OnChange будет производиться непосредственно проверка значения числа
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог