Перейти к содержанию
Fire Monkey от А до Я
  • 0

Запрет ввода определенных символов в TEdit


Draggo

Вопрос

Проблема заключается в следующем: мне нужно запретить ввод в TEdit всех символов, кроме цифр и запятой, а если вводится точка, то подменить ее на запятую.

Запретить пробовал так:

procedure TForm.EditKeyDown(Sender: TObject; var Key: Char);
begin
if not (Key in ['0'..'9', 'А'..'Я', 'а'..'я', 'A'..'Z', 'a'..'z', #8 ]) then Key:=#0;
end;

Символы продолжают вводиться. Запрет должен происходить при нажатиях на экранную клавиатуру Android'а.

События KeyPressed я в XE6 не нашел.

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Модераторы

Честно говоря, я тоже не знаю, почему так происходит…

Но могу подсказать временное решение: используем событие OnChangeTracking, проверяем последний введённый символ (или даже лучше сразу все символы проверять) и решаем, что с ним делать.

Ссылка на комментарий
  • 0

Честно говоря, я тоже не знаю, почему так происходит…

Но могу подсказать временное решение: используем событие OnChangeTracking, проверяем последний введённый символ (или даже лучше сразу все символы проверять) и решаем, что с ним делать.

Не могли бы вы поподробней рассказать про OnChangeTracking. Никогда с этим не сталкивался.

Ссылка на комментарий
  • 0
  • Модераторы

А что именно не понятно?

Событие срабатывает каждый раз, когда вы вводите новый символ в поле Edit1 (Edit1.Text).

Пишем цикл, в котором пробегаем по всем введённым символам и проверяем их на соответствие списку запрещённых символов. Если находим запрещённый символ, то сразу удаляем его из строки или можно ещё предупреждение выдать.

Ссылка на комментарий
  • 0

Обновитесь до Update 1. Там процедура выглядит немного иначе и все работает (по крайней мере у меня) Android 4.1:

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; var KeyChar: Char;
  Shift: TShiftState);
begin
  if not (KeyChar in ['0'..'9', 'А'..'Я', 'а'..'я', 'A'..'Z', 'a'..'z', #8 ]) then
    KeyChar := #0;
end;
Ссылка на комментарий
  • 0

А что именно не понятно?

Событие срабатывает каждый раз, когда вы вводите новый символ в поле Edit1 (Edit1.Text).

Пишем цикл, в котором пробегаем по всем введённым символам и проверяем их на соответствие списку запрещённых символов. Если находим запрещённый символ, то сразу удаляем его из строки или можно ещё предупреждение Спасибо уже разобрался.

Спасибо, уже разобрался. Может мое решение и не лучшее или даже плохое, но может кому-то (с такой же проблемой) поможет:

procedure TForm1.Edit1ChangeTracking(Sender: TObject);
var c1:string; lc1,lc11:integer;
begin
c1:=Edit1.Text;
lc1:=length(c1)-1;
lc11:=length(c1);
  if c1<>'' then begin
  if Edit1.Text[lc1]='.' then begin delete(c1, lc11, 1);
                                    c1:=c1+',';
                                    Edit1.Text:=c1;
                              end;

  if not(CharInSet(Edit1.Text[lc1], ['0'..'9', ',', '-'])) then begin
                                    delete(c1, lc11, 1);
                                    Edit1.Text:=c1;
                                                                end;
                 end;
end;
Ссылка на комментарий
  • 0

Может мое решение и не лучшее или даже плохое

 

Странно, у меня этот код работает криво (XE6 Upd1)

 

Ввожу в Edit любую цифру, но попадаю в условие

if not(CharInSet(Edit1.Text[lc1], ['0'..'9', ',', '-'])) then begin
delete(c1, lc11, 1);
Edit1.Text:=c1;
end;

в итоге Edit остается пустой... что за бред?

Ссылка на комментарий
  • 0

Может мое решение и не лучшее или даже плохое

 

Странно, у меня этот код работает криво (XE6 Upd1)

 

Ввожу в Edit любую цифру, но попадаю в условие

if not(CharInSet(Edit1.Text[lc1], ['0'..'9', ',', '-'])) then begin
delete(c1, lc11, 1);
Edit1.Text:=c1;
end;

в итоге Edit остается пустой... что за бред?

 

У меня все нормально работает. Точку заменяет запятой, а при блокировке оставляет только цифры, запятую и минус.

Ссылка на комментарий
  • 0

Проблема заключается в следующем: мне нужно запретить ввод в TEdit всех символов, кроме цифр и запятой, а если вводится точка, то подменить ее на запятую.

Запретить пробовал так:

procedure TForm.EditKeyDown(Sender: TObject; var Key: Char);
begin
if not (Key in ['0'..'9', 'А'..'Я', 'а'..'я', 'A'..'Z', 'a'..'z', #8 ]) then Key:=#0;
end;

Символы продолжают вводиться. Запрет должен происходить при нажатиях на экранную клавиатуру Android'а.

События KeyPressed я в XE6 не нашел.

 

Я делаю проверку следующим образом

procedure TForm1.Edit1ChangeTracking(Sender: TObject);
var
  i: integer;
  sb: string;
begin
  sb:=Edit1.Text;
  i:= low(sb); //так как разное начало строки в Win и Android платформах использую такую запись
  while i <= High(sb) do
  begin
    if Pos(sb[i],CharOfSimv)<1 then //CharOfSimv - простая строка вида '+-0123456789'
    begin
    delete(sb,i+1-Low(sb),1); // от платформы пляшем )
    end;
    inc(i);
  end;
  if sb<>Edit1.Text then
    ShowMessage('Вы ввели не верный символ');
  Edit1.Text:=sb;
//ставим каретку в конец Edit
  Edit1.CaretPosition:=High(sb);
//Update
  Label1.Text:= Edit1.Text;
end;

Update: При тестировании на платформе Android выявил следующее:

1. При вводе с экранной клавиатуры в Edit текст после обработки не меняется на исправленный (12345р67)

2. При передаче значения в Label (коммент Update) метке присваивается истинное значение (1234567)

Как обойти данный баг?

Платформа тестирования XE7 update1, Android 4.4.4 Sony Z1Compact

Изменено пользователем Николай Ряполов
Ссылка на комментарий
  • 0
  • Модераторы

вообще с разными клавиатурами код работает по разному, на моем нексусе (в одном из приложении делал ввод только цифр, пароль при входе программы) ввод работает, а на самсунговских девайсах проскакивали и буквы. решение сделал таким

Screenshot_2014-10-30-00-03-35.png

Ссылка на комментарий
  • 0
если правильно понял вам нужна это:
 
в FireMonkey и в Android свойстве TEdit добавлена FilterChar и выглядит это так:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Edit1.FilterChar:= '0123456789';
end;
Ссылка на комментарий
  • 0

 

если правильно понял вам нужна это:
 
в FireMonkey и в Android свойстве TEdit добавлена FilterChar и выглядит это так:
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Edit1.FilterChar:= '0123456789';
end;

 

 Из-за не знания основных свойств компонентов, городил такие Небоскребы ))))

Благодарю, для Windows подходит, для Android так же не работает (

Ссылка на комментарий
  • 0

Не получается заблокировать различные знаки - плюс, минус, равно, скобки и т.д. Цифры код блокирует, нажать не даёт, а вот знаки проходят спокойно. Даже не знаю что и придумать. Android 4.4, Delphi XE7 Update 1

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; var KeyChar: Char;
Shift: TShiftState);
begin
if (KeyChar in ['0'..'9', '+', '-', '=' #8 ]) then
KeyChar := #0;
end;
Изменено пользователем Schekhovtsov
Ссылка на комментарий
  • 0

может как-то так:

procedure TForm1.edSumKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
begin
  case KeyChar of
    #8, '0'..'9' :  ; // цифры и <Back Space>
    '.', ',' :        // разделитель целой и дробной частей числа
      begin
        if KeyChar <> FormatSettings.DecimalSeparator then
          KeyChar := FormatSettings.DecimalSeparator; // заменим разделитель на допустимый
        if Pos(FormatSettings.DecimalSeparator, edDepositing_Sum.Text) <> 0 then
        begin
          Key := 0; // запрет ввода второго разделителя
          KeyChar := Chr(0);
        end;
      end;
    else   // остальные символы запрещены
    begin
      Key := 0;
      KeyChar := Chr(0);
    end;
  end;
end;
Ссылка на комментарий
  • 0

пора забывать в юникоде про set of char

там компилятор делает преобразование и могут быть ошибки при совмещении widechar и ansichar

я пользуюсь строковыми константами и поиском типа

if '123478906zxcvmnwerqoipu'.Contains(ch) then

те же яйца pos(), только в профиль

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...