• 0
Draggo

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

Вопросы

Проблема заключается в следующем: мне нужно запретить ввод в 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 не нашел.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 ответов на этот вопрос

  • 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(), только в профиль

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От Barbanel
      Всем привет!
      Недавно столкнулись с особенностью двух разных смартфонов.
      При вводе в TEdit обычного емейл-адреса срабатывает автозамена. После этого, ввод текста ломается.
      Т.е. пользователь ставит курсор на последний символ слова, нажимает внопку "стереть", каретка перескакивает на второй символ в тексте, и стирает именно второй символ. Конец строки таким образом вообще невозможно удалить.
      Есть видео с багом. Утверждается что проблема воспроизводится на более древнем устройстве.
      Вопрос: кто-то сталкивался с таким, как лечили?
      Собсно предполагаемые решения
      1) отключить автозамену для конкретного поля ввода (но я не уверен что это возможно),
      2) дебажить и исправлять TEdit (шоб меня покрасили!!!)
      Всем заранее сенкс!
      TEdit Bug.mp4
    • От Bohdan
      Всем Привет!

      Платформа ios Delphi 10.2.2, хочу при нажатии на label показывать edit (для редактирования label.) Столкнулся с проблемой:
       Как отследить Tap  за пределами Edit чтобы его скрыть, не могу понять как это сделать.
    • От Sashar333
      Delphi 10,1 berlin
      Здравствуйте!
      Подскажите как отключить на android в TEdit появляющиеся кнопки ВСТАВКА КОПИРОВАТЬ и т.д.
      или как запретить вставлять из буфера в приложении?
      Спасибо!
       
    • От Ufomaster
      При использовании на форме TMS FMX WebGMaps и Edit ов, возникает зависание приложения после повторного входа в эдит и удаления там текста. 
    • От Anasazi
      Всем привет. Столкнулся со следующей проблемой после активации tedit при попытке создать любое намерение (для набора номера или открытия ссылки) программа наглухо зависает. И наоборот после создания и выполнения намерения, если перейти к tedit происходит глухое зависание. Тоже самое происходит и с memo.
      Проблема похожа на описанную в этой теме, но решение из нее не помогает
      Чем заменить tedit не знаю, пробовал все возможные варианты. Функции работы с намерениями рабочая и если не активировать tedit то все работает отлично.
      Пробовал на разных устройствах, результат тот же. Правда на всех устройствах был Android 5.
       
      Подскажите пожалуйста, возможно ли под android создать диалоговое окно с вводом текста? Или может быть есть еще какие-нибудь способы ввода текста?
       
    • От Barbanel
      Здравствуйте уважаемые,
      есть форма с множеством TEdit, при этом они не помещаются на один экран и помещена на TScrollBox.
      При скороллинге если скроллить нажимая на подложку (т.е. сам TScrollBox) все работает идеально, если же нажимать на сам TEdit и таким образом скроллить, то выезжает клавиатура, что вобщемто неудобно.
      Вопрос: как настроить приложение/форму/ТСкроллБокс так, чтобы при зажатии и движении пальца вверх/вниз на ТЕдите клавиатура не выезжала?
      На нативных приложениях описанного выше поведения я не замечал.
       
      Заранее спасибо!
       
    • От Euvene
      Добрый день, возникла такая проблемка: при добавлении в ListBoxItem компонента TEdit если поставить ему TControlType::Platform он вылазит за пределы ListBox но при Styled все норм, кто нибудь сталкивался и как с этим бороться?


    • От lala4a
      Доброе время суток .  2 вопроса по Tedit . Помогите , пожалуйста )
      1) Притормаживает ввод текста и выделения .
      2) Внешний вид меню Вставить при длительном тапе по Tedit  отличается от всех других приложений .
       


    • От chaplin.u@gmail.com
      Как реализовать такое-же окно  как на картинке ?
    • От chaplin.u@gmail.com
      при входе в TEdit появляется виртуальная клава. набираю текст. заканчиваю нажатием на Ентер - клава не убирается.
      Как её убрать с передачей текста ?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу