|
Вопрос # 4 116/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты! Ничего у меня не получается: на форме есть много Edit'ов для ввода чисел (высота в миллиметрах), хочу сделать так, чтобы в эти Edit'ы можно было ввести только "правильное" real число (как в калькуляторе). Исключить возможный ввод 00 ; 0,0, ; ,0123 ; и т.п. Помогите пожалуйста!
Ниже - то, как я пытался это реализовать.
Приложение: Переключить в обычный режим- implementation
- uses Unit2;
- {$R *.dfm}
- function IsFloat(ch : char; st: string) : Boolean;
- begin
- if (ch >= '0') and (ch <= '9')
- or (ch = #13)
- or (ch = #8)
- then
- begin
- IsFloat := True;
- Exit;
- end;
- case ch of
- ',': if (Pos('0,',st) = 0)
- and (st[Length(st)] >= '0') and (st[Length(st)] <= '9')
- then
- IsFloat := True; else
- IsFloat := False; end;
- end;
- procedure TForm1.FormShow(Sender: TObject);
- begin
- EditD11.Text := '0,';
- Sbros1.Enabled:=false;
-
- end;
-
- procedure TForm1.EditD11KeyPress(Sender: TObject; var Key: Char);
- var st: string;
- begin
- if (Key = Char(VK_RETURN)) then
- EditD12.SetFocus
- else If not IsFloat(Key,EditD11.Text)
- then Key := Chr(0);
- end;
-
Ответ #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™ (статус: Доктор наук), 5 мая 2010, 08:22 [#3]:
Цитата (Емельянов Константин Игоревич):
Осталось в начале строки ноли запретить (00, 000, и т.п.).
А зачем?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Емельянов Константин Игоревич (статус: Посетитель), 5 мая 2010, 18:23 [#4]:
Чтобы было как в калькуляторе. Не было возможности вписать не то. Чисто эстетические вещи... А то можно 000,1234 написать..
|
|
Вадим К (статус: Академик), 5 мая 2010, 18:34 [#5]:
Напишу свое мнение - так ограничивать - плохо. есть много случаев, когда такое поведение может вылезти боком. например, пользователь берет и вставляет данные, например с блокнота, а потом хочет отредактировать... а нельзя, код начинает портить то, что он вставляет или никак не реагирует на это, но зато потом не дает отредактировать (так как удаление одного символа с заведомо неверной строки может быть заведомо неверной строкой, то код не дает изменить, считая, что исходная строка заведомо верная).
мое решение, которое опробовано на многих пользователях. Давать вводить как угодно, но справа от поля ввода добавить обычный TImage, который будет показывать восклицательный знак или зеленую галочку в зависимости от введённых данных. А при наведении (или по мере ввода) показывать балун с описанием, что же там не так введено.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
bugmenot (статус: 3-ий класс), 11 сентября 2010, 13:45 [#7]:
Можно преобразовывать строку к действительному числу и, при успехе, отображать число в стандартном формате обратно в поле ввода
{ примерный набросок }
try
X := StrToFloat(Edit.Text); // здесь бывает EConvertError
Edit.Text := FloatToStr(X);
except
end;
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|