Ramzay |
Отправлено: 18.03.2007, 10:07 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 31
|
Переодически возникает необходимость что бы пользователь ввел в поле TEdit число. После ввода нужно сделать проверку: действительно ли ввели число или ввели просто какой-либо текст?
Обыно, я это делою так:
CODE |
int iTest=-999999; // число, которое заведомо не будет введено
try
{
iTest=StrToInt(Edit3->Text); // или StrToFloat(Edit3->Text);
}
catch(...)
{ }
if(iTest==-999999)
{
ShowMessage("...."); // Здесь я напишу все, что думаю о пользователе
Action=caNone;
return;
}
|
Может кто подскажет способ покороче?
Ps Тема "О тексте и числах" (сори)
Отредактировано Ramzay — 18.03.2007, 10:41 |
|
Ronin |
Отправлено: 18.03.2007, 11:07 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 7
|
Я считаю что приведённый тобой способ самый демократичный
если совсем короче то просто взять и обрубить возможность вводить буковки на ивэнте нажатии клавиши, тока тут тоже есть пути обхода, например через мышь...
|
|
** Admin |
Отправлено: 18.03.2007, 12:06 |
|
Не зарегистрирован
|
QUOTE | После ввода нужно сделать проверку: действительно ли ввели число или ввели просто какой-либо текст?
|
Проверки лучше делать ПЕРЕД вводом, то есть не дать
возможность ввести заведомо неправильное значение.
см. события OnKeyPress или OnEdit компонента TEdit
---
Если упростить вышеприведенный пример:
int n = Edit1->Text.ToIntDef(-99999);
if(n == -99999) ShowMessage("Не число или число -99999");
else ShowMessage("Число");
то нужна уверенность что такого числа не будет
или, если такой уверенности на 100% нет — делать это по другому,
например в цикле по строке.
|
|
Tantos |
Отправлено: 18.03.2007, 13:14 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 108
|
Лучше перехватывать в catch по EConvertError. Или воспользоваться TNumberEditEh из EhLib.
|
|
khan |
Отправлено: 20.03.2007, 14:20 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 19
|
хм, только вот если брать float или double есть хитрость с запятой, мне например нравится чтоб можно было вводить и запятую и точку. StrToFloat видит только то что настроено в языковых параметрах и если у меня стоит раша, то вводя точку вылезит ошибка, ну и вообще зачем тогда проверять число или не число кроме как для этого? Ведь StrToFloat (или Double) сам выводит инвалид флоатинг валуе. Конечно, если кого-то не устраивает эта надпись на инглише, то тогда понятно, но считаю, что если вместо запятой точка или наоборот, то это не ошибка для юзера...
Отредактировано khan — 20.03.2007, 14:34 |
|
Ramzay |
Отправлено: 20.03.2007, 18:31 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 31
|
Большое спасибо за ответы.
QUOTE | просто взять и обрубить возможность вводить буковки |
Я принципиальный противник такого метода. Например, недавно видел, как человек, искушенный в компьютерах пытался ввести дату 29.02.2007. Компьютер долго упирался изо всех сил, не давал ввести девятку и никто ничего долго не мог понять.
Другое дело дать юзеру ввести все что он хочет. Но когда он все ввел и нажал на ОК, вот тут-то он за "базар" ответит. Схватить, мордой в контрол и поюлозить.
QUOTE | хитрость с запятой, мне например нравится чтоб можно было вводить и запятую и точку |
Элементарно, Ватсон! Устанавливаем DecimalSeparator='.' После того, как юзер все ввел, мы во введеном тексте ищем запятую и меняем ее на точку. Затем можно преобразовывать в число.
|
|
Admin |
Отправлено: 20.03.2007, 23:36 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
QUOTE | Я принципиальный противник такого метода. Например, недавно видел, как человек, искушенный в компьютерах пытался ввести дату 29.02.2007. |
Для ввода дат можно использовать специальный компонент,
в котором ничего кроме дат ввести нельзя, также как и
несуществующую дату.
|
|