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);
}
Проверка на максимальное значение в Edit1
Код:
Но это проверка только на ввод числа.
А как сделать проверку на ввод максимального значения?
Допустим если я ввожу 65535 то всё впорядке, а если 65536 должно выскакивать сообщение об ошибке.
Я конешно могу сделать в кнопке провеку
написав там текст
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (StrToInt(Edit1->Text) > 65535)
MessageBox(0, "Вы ввели значение больше чем 65535!","Сообщение",
MB_OK);
}
{
if (StrToInt(Edit1->Text) > 65535)
MessageBox(0, "Вы ввели значение больше чем 65535!","Сообщение",
MB_OK);
}
Но хотелось бы сделать это в момент набора в Edit1.
Подскажите пожалуйста, как это сделать.
Код:
if(Key < '0' || Key > '9')
{
// вы ввели не число
}
{
// вы ввели не число
}
А по поводу ограничения значения вводимого числа - почему бы не проверять его точно там же, - не вижу причин, мешающих этому. Тем более, что, по-моему, удобнее объединить эти две проверки в одно действие:
Код:
int value;
if(!TryStrToInt(Edit1->Text, value))
{
// вы ввели не число
}
else
{
if(value > 65535)
{
// слишком большое число
}
}
if(!TryStrToInt(Edit1->Text, value))
{
// вы ввели не число
}
else
{
if(value > 65535)
{
// слишком большое число
}
}
Работает
Код:
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
if (StrToInt(Edit1->Text) > 65535)
MessageBox(0, "Вы ввели значение больше чем
65535!","Сообщение", MB_OK);
}
{
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();
}
}
{
if (StrToInt(Edit1->Text) > 65535)
{
MessageBox(0, "Вы ввели значение больше чем
65535!","Сообщение", MB_OK);
Edit1->Clear();
}
}
В чём тут дело скажите пожалуйста.
Цитата: zuze
Я сделал так
Работает
А так ошибка во время выполнения
В чём тут дело скажите пожалуйста.
Работает
Код:
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
if (StrToInt(Edit1->Text) > 65535)
MessageBox(0, "Вы ввели значение больше чем
65535!","Сообщение", MB_OK);
}
{
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();
}
}
{
if (StrToInt(Edit1->Text) > 65535)
{
MessageBox(0, "Вы ввели значение больше чем
65535!","Сообщение", MB_OK);
Edit1->Clear();
}
}
В чём тут дело скажите пожалуйста.
на какой строке и че пишет?
Выскакивает окно Debugger Exception Notification в этом окне написано
Project factorial.exe raised exception EConvertError with message "" is not a valid integer value'. Process stopped. Use step or Run continue.
делай так, например:
Код:
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
if (Edit1->Text.ToInt() > 65535)
{
MessageBox(0, "Вы ввели значение больше чем
65535!","Сообщение", MB_OK);
Edit1->OnChange = NULL;
Edit1->Clear();
Edit1->OnChange = Edit1Change;
}
}
{
if (Edit1->Text.ToInt() > 65535)
{
MessageBox(0, "Вы ввели значение больше чем
65535!","Сообщение", MB_OK);
Edit1->OnChange = NULL;
Edit1->Clear();
Edit1->OnChange = Edit1Change;
}
}
замени на TryStrToInt и не надо будет отключать/подключать Edit1Change
Всё работает.
Вопрос закрыт.
Код:
void __fastcall TForm1::Button3Click(TObject *Sender)
{
if (!Edit1->Text.IsEmpty())
Edit1->Clear();
if (!Edit2->Text.IsEmpty())
Edit2->Clear();
if (!Edit3->Text.IsEmpty())
Edit3->Clear();
}
{
if (!Edit1->Text.IsEmpty())
Edit1->Clear();
if (!Edit2->Text.IsEmpty())
Edit2->Clear();
if (!Edit3->Text.IsEmpty())
Edit3->Clear();
}
Такаяже ошибка, а как сдесь подправить скажите пожалуйста.
Я сделал так
Код:
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();
}
}
{
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();
}
{
if (!Edit1->Text.IsEmpty())
Edit1->Clear();
if (!Edit2->Text.IsEmpty())
Edit2->Clear();
if (!Edit3->Text.IsEmpty())
Edit3->Clear();
}
Прошу прощения, может я немного поздновато пишу ответ! Но помоему вы просто страдаете фигней! Почему нельзя это все сделать в обработчике события нажания клавиши? Тогда уходит надобность в очистве Edita! Просто делаешь Key=0 и ничего у тебя не напечатается!