Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проверка на максимальное значение в Edit1

11K
17 апреля 2008 года
zuze
84 / / 07.03.2008
Я сделал так

 
Код:
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
    Set <char, '0', '9'> symbol;
    symbol << '0' << '1' << '2' << '3' << '4' << '5' << '6' << '7' << '8' << '9';
    if ( ! symbol.Contains(Key))
       Key = 0;
    if (Key == 0)
       MessageBox(0, "Вы ввели не число!","Сообщение", MB_OK);
}


Но это проверка только на ввод числа.
А как сделать проверку на ввод максимального значения?
Допустим если я ввожу 65535 то всё впорядке, а если 65536 должно выскакивать сообщение об ошибке.

Я конешно могу сделать в кнопке провеку

написав там текст

 
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    if (StrToInt(Edit1->Text) > 65535)
       MessageBox(0, "Вы ввели значение больше чем 65535!","Сообщение",
       MB_OK);        
}


Но хотелось бы сделать это в момент набора в Edit1.

Подскажите пожалуйста, как это сделать.
37K
18 апреля 2008 года
leshich
7 / / 17.04.2008
С конструкцией "Set <...>" по-моему вы погорячились... куда проще проверить обычным сравнением

 
Код:
if(Key < '0' || Key > '9')
{
      // вы ввели не число
}


А по поводу ограничения значения вводимого числа - почему бы не проверять его точно там же, - не вижу причин, мешающих этому. Тем более, что, по-моему, удобнее объединить эти две проверки в одно действие:

Код:
int value;
if(!TryStrToInt(Edit1->Text, value))
{
      // вы ввели не число
}
else
{
   if(value > 65535)
   {
         // слишком большое число
   }
}
11K
18 апреля 2008 года
zuze
84 / / 07.03.2008
Я сделал так

Работает

 
Код:
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
     if (StrToInt(Edit1->Text) > 65535)
        MessageBox(0, "Вы ввели значение больше чем
                         65535!","Сообщение", MB_OK);
}


А так ошибка во время выполнения

 
Код:
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
     if (StrToInt(Edit1->Text) > 65535)
     {
        MessageBox(0, "Вы ввели значение больше чем
                         65535!","Сообщение", MB_OK);
        Edit1->Clear();
     }
}


В чём тут дело скажите пожалуйста.
11
18 апреля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: zuze
Я сделал так

Работает

 
Код:
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
     if (StrToInt(Edit1->Text) > 65535)
        MessageBox(0, "Вы ввели значение больше чем
                         65535!","Сообщение", MB_OK);
}


А так ошибка во время выполнения

 
Код:
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
     if (StrToInt(Edit1->Text) > 65535)
     {
        MessageBox(0, "Вы ввели значение больше чем
                         65535!","Сообщение", MB_OK);
        Edit1->Clear();
     }
}


В чём тут дело скажите пожалуйста.



на какой строке и че пишет?

11K
18 апреля 2008 года
zuze
84 / / 07.03.2008
Ввожу я например 65536 выскакивает сообщение (в виде окна с кнопкой "ОК") Вы ввели значение больше чем 65535!, пока всё правильно. Нажимаю "OK" и возникает такая ошибка.
Выскакивает окно Debugger Exception Notification в этом окне написано
Project factorial.exe raised exception EConvertError with message "" is not a valid integer value'. Process stopped. Use step or Run continue.
535
18 апреля 2008 года
Нездешний
537 / / 17.01.2008
При выполнении Edit1->Clear() генерится сообщение Edit1->OnChange. Соответственно, опять вызывается твой обработчик. И функция StrToInt от пустой строки выдает исключение, что пустая строка не есть целое число.

делай так, например:
Код:
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
     if (Edit1->Text.ToInt() > 65535)
     {
          MessageBox(0, "Вы ввели значение больше чем
                         65535!","Сообщение", MB_OK);
          Edit1->OnChange = NULL;        
          Edit1->Clear();
          Edit1->OnChange = Edit1Change;
     }
}
11
18 апреля 2008 года
oxotnik333
2.9K / / 03.08.2007
Edit1->Text.ToInt()

замени на TryStrToInt и не надо будет отключать/подключать Edit1Change
11K
18 апреля 2008 года
zuze
84 / / 07.03.2008
Большое спасибо!!!
Всё работает.
Вопрос закрыт.
11K
18 апреля 2008 года
zuze
84 / / 07.03.2008
Прошу прощения у меня возник ещё один вопрос на такуюже тему

 
Код:
void __fastcall TForm1::Button3Click(TObject *Sender)
{
    if (!Edit1->Text.IsEmpty())
       Edit1->Clear();
    if (!Edit2->Text.IsEmpty())
       Edit2->Clear();
    if (!Edit3->Text.IsEmpty())
       Edit3->Clear();
}


Такаяже ошибка, а как сдесь подправить скажите пожалуйста.
11K
18 апреля 2008 года
zuze
84 / / 07.03.2008
Вопрос решён.
Я сделал так

Код:
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
  if (Edit1->Text.IsEmpty())
     return;
  int i;
  if (TryStrToInt(Edit1->Text, i))
  {
     if (i > 65535)
     {
        MessageBox(0, "Вы ввели значение больше чем
                         65535!","Сообщение", MB_OK);
        Edit1->Clear();
     }
  }
  else
  {
      MessageBox(0, "Введённый тект не является числом!","Сообщение",
                       MB_OK);
      Edit1->Clear();
  }
}


С этим кодом и это работает

 
Код:
void __fastcall TForm1::Button3Click(TObject *Sender)
{
    if (!Edit1->Text.IsEmpty())
       Edit1->Clear();
    if (!Edit2->Text.IsEmpty())
       Edit2->Clear();
    if (!Edit3->Text.IsEmpty())
       Edit3->Clear();
}
16K
20 апреля 2008 года
iRain
72 / / 12.03.2008
Прошу прощения, может я немного поздновато пишу ответ! Но помоему вы просто страдаете фигней! Почему нельзя это все сделать в обработчике события нажания клавиши? Тогда уходит надобность в очистве Edita! Просто делаешь Key=0 и ничего у тебя не напечатается!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог