Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 116

/ вопрос открыт /

Здравствуйте, уважаемые эксперты! Ничего у меня не получается: на форме есть много Edit'ов для ввода чисел (высота в миллиметрах), хочу сделать так, чтобы в эти Edit'ы можно было ввести только "правильное" real число (как в калькуляторе). Исключить возможный ввод 00 ; 0,0, ; ,0123 ; и т.п. Помогите пожалуйста!

Ниже - то, как я пытался это реализовать.

Приложение:
  1. implementation
  2. uses Unit2;
  3. {$R *.dfm}
  4. function IsFloat(ch : char; st: string) : Boolean;
  5. begin
  6. if (ch >= '0') and (ch <= '9')
  7. or (ch = #13)
  8. or (ch = #8)
  9. then
  10. begin
  11. IsFloat := True;
  12. Exit;
  13. end;
  14. case ch of
  15. ',': if (Pos('0,',st) = 0)
  16. and (st[Length(st)] >= '0') and (st[Length(st)] <= '9')
  17. then
  18. IsFloat := True; else
  19. IsFloat := False; end;
  20. end;
  21. procedure TForm1.FormShow(Sender: TObject);
  22. begin
  23. EditD11.Text := '0,';
  24. Sbros1.Enabled:=false;
  25.  
  26. end;
  27.  
  28. procedure TForm1.EditD11KeyPress(Sender: TObject; var Key: Char);
  29. var st: string;
  30. begin
  31. if (Key = Char(VK_RETURN)) then
  32. EditD12.SetFocus
  33. else If not IsFloat(Key,EditD11.Text)
  34. then Key := Chr(0);
  35. end;
  36.  


Емельянов Константин Игоревич Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Емельянов Константин Игоревич (статус: Посетитель)
Вопрос отправлен: 4 мая 2010, 20:50
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Amidamaru

Здравствуйте, Емельянов Константин Игоревич!
Попробуйте вот так:

procedure TForm1.EditD11KeyPress(Sender: TObject; var Key: Char);
var s:string;
begin
if (Sender is TEdit) then
with Sender as TEdit do
try
s:=Text;
Insert(key,s,SelStart+1);
StrToFloat(s);
except
Key:=#0;
end;
end;

Ответ отправил: Amidamaru (статус: 4-ый класс)
Время отправки: 4 мая 2010, 21:01


Мини-форум вопроса

Всего сообщений: 7; последнее сообщение — 11 сентября 2010, 13:45; участников в обсуждении: 5.
Егор

Егор (статус: 10-ый класс), 5 мая 2010, 03:14 [#1]:

примерно в феврале был вопрос, в котором была приведена функция, которая и решала данную проблему.
поищите - может найдёте
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Емельянов Константин Игоревич

Емельянов Константин Игоревич (статус: Посетитель), 5 мая 2010, 03:58 [#2]:

Спасибо (Вопрос # 3 677) с запятыми разобрался:). Осталось в начале строки ноли запретить (00, 000, и т.п.).
min@y™

min@y™ (статус: Доктор наук), 5 мая 2010, 08:22 [#3]:

Цитата (Емельянов Константин Игоревич):

Осталось в начале строки ноли запретить (00, 000, и т.п.).

А зачем?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Емельянов Константин Игоревич

Емельянов Константин Игоревич (статус: Посетитель), 5 мая 2010, 18:23 [#4]:

Чтобы было как в калькуляторе. Не было возможности вписать не то. Чисто эстетические вещи... А то можно 000,1234 написать..
Вадим К

Вадим К (статус: Академик), 5 мая 2010, 18:34 [#5]:

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

мое решение, которое опробовано на многих пользователях. Давать вводить как угодно, но справа от поля ввода добавить обычный TImage, который будет показывать восклицательный знак или зеленую галочку в зависимости от введённых данных. А при наведении (или по мере ввода) показывать балун с описанием, что же там не так введено.
Галочка "подтверждения прочтения" - вселенское зло.
Емельянов Константин Игоревич

Емельянов Константин Игоревич (статус: Посетитель), 5 мая 2010, 18:37 [#6]:

Спасибо, Вадим К, я как-то не подумал об этом:)
bugmenot

bugmenot (статус: 3-ий класс), 11 сентября 2010, 13:45 [#7]:

Можно преобразовывать строку к действительному числу и, при успехе, отображать число в стандартном формате обратно в поле ввода
{ примерный набросок }
try
X := StrToFloat(Edit.Text); // здесь бывает EConvertError
Edit.Text := FloatToStr(X);
except
end;
виконання програми розпочинається з того самого мiсця, де призупинилося.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:58
Выполнено за 0.02 сек.