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

Ввод числа - самый простой способ фильтрации


Вопрос

Намучавшись с не работающим FilterChar и кучей способов ввода по маске, сделал свой способ. По моему мнению самый простой.

Код позволяет вводить только числа, включая дробные и отрицательные.

procedure TFormMain.Edit1ChangeTracking(Sender: TObject);
Var FEdit : TEdit;
    FFloat : Single;
begin
  If Not (Sender is TEdit) Then // Защитимся от не выспавшегося самого себя
    Exit;
  FEdit:=(Sender as TEdit); // Для удобства...
  FEdit.Text:=FEdit.Text.Replace(' ',''); // Убираем случайные пробелы
  if FEdit.Text.IsEmpty then // Если пусто (ничего не введено или все удалено), ничего не делаем
    Exit;
  FEdit.Text:=FEdit.Text.Replace('.',','); // Заменяйм точку запятой
  if FEdit.Text.Equals(',') then // Если введен разделитель, добавляем перед ним ноль для красоты (не обязательно)
  begin
    FEdit.Text:='0,';
    FEdit.CaretPosition:=FEdit.CaretPosition+1; // без этого курсор останется между нулём и запятой
  end;
  if FEdit.Text.Equals('-') then // Если введен только минус, не пытамся его драконить
    Exit;
  if TryStrToFloat(FEdit.Text,FFloat) Then // Пробуем преобразовать в число
    FEdit.TagString:=FEdit.Text // Если удалось, сохраняем в временном хранилище
  Else
    FEdit.Text:=FEdit.TagString; // Если не удалось, восстанавливаем из временного хранилища
end;

В качестве временного хранилища использовано TagString, дабы не разводить глобальных переменных.

Возможно понадобиться очистка временного хранилища при многократном использовании:

procedure TFormMain.Edit1Enter(Sender: TObject);
begin
  If Not (Sender is TEdit) Then
    Exit;
  (Sender as TEdit).TagString:='';
end;

Буду рад услышать замечания и предложения.

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

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

  • 0

Посмотрел на код и решил еще на пару строк сократить, совместил проверку на "пусто" и минус в одном условии

procedure TFormMain.Edit1ChangeTracking(Sender: TObject);
Var FEdit : TEdit;
    FFloat : Single;
begin
  If Not (Sender is TEdit) Then // Защитимся от не выспавшегося самого себя
    Exit;
  FEdit:=(Sender as TEdit); // Для удобства...
  FEdit.Text:=FEdit.Text.Replace(' ',''); // Убираем случайные пробелы
  if (FEdit.Text.IsEmpty) or (FEdit.Text.Equals('-')) then // Если пусто (ничего не введено или все удалено) или только минус, ничего не делаем
    Exit;
  FEdit.Text:=FEdit.Text.Replace('.',','); // Заменяйм точку запятой
  if FEdit.Text.Equals(',') then // Если введен разделитель, добавляем перед ним ноль для красоты (не обязательно)
  begin
    FEdit.Text:='0,';
    FEdit.CaretPosition:=FEdit.CaretPosition+1; // без этого курсор останется между нулём и запятой
  end;
  if TryStrToFloat(FEdit.Text,FFloat) Then // Пробуем преобразовать в число
    FEdit.TagString:=FEdit.Text // Если удалось, сохраняем в временном хранилище
  Else
    FEdit.Text:=FEdit.TagString; // Если не удалось, восстанавливаем из временного хранилища
end;
Ссылка на комментарий
  • 0

вместо tagString можно использовать Model.Data, это более концептуально верно

Хм, а можно подробнее? С наскока нагуглить ничего не удалось, а собственные знания у меня пока в зачаточном состоянии :-)

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

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

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

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

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

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

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

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

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

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