Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual C++(.Net) / Visual C++(.Net).doc
Скачиваний:
160
Добавлен:
09.05.2015
Размер:
1.18 Mб
Скачать

Ввод числовых значений в компонент TextBox

Если вводимый текст не соответствует числу (например, содержит недопустимые символы), то функции преобразования выдают ошибку. Можно, конечно, воспользоваться конструкцией try{…}catch(){…} для обработки этой ситуации, однако это не лучший вариант для предотвращения неправильного ввода. Пользователь узнает о своей ошибке только после того, как программа попытается использовать введенные данные. Окно для ввода текста можно спроектировать таким образом, чтобы пользователь не мог ввести в него неправильные данные.

Для этого используется событие KeyPress, в который передается параметрe, в котором содержится код введенного символа и некоторая сопутствующая информация.

Для того чтобы преобразование типов было выполнено корректно, пользователь может вводить только цифры, запятую (для обозначения дробной части действительных чисел), а также пользоваться клавишами удаления символов и клавишей Enterдля фиксации ввода. Будем считать правильным символом и точку, но в функции автоматически заменим ее запятой. Все остальные символы будут считаться запрещенными. Чтобы такой символ не отображался в поле редактирования, присвоим значениеtrueпараметруeфункции-обработчика.

Сначала проверим, является ли введенный символ цифрой. Если да, то прекращаем выполнение функции, этот символ может быть добавлен в поле Text. Код для проверки выглядит следующим образом.

if ((e->KeyChar>='0')&&(e->KeyChar<='9')){

return;

}

Далее заменим точку на запятую, если в этом есть необходимость.

if (e->KeyChar=='.'){

e->KeyChar=',';

}

Теперь необходимо правильно обработать введенную запятую.

if (e->KeyChar==','){

if(litr->Text->IndexOf(',')!=-1){

e->Handled=true;

}

return;

}

Наконец, осталось обработать нажатие клавиш Enter, Backspace и Delete. При нажатии Enter фокус устанавливается на кнопку.

if (Char::IsControl(e->KeyChar)){

if (e->KeyChar==(char)Keys::Enter)

button1->Focus();

return;

}

Остальные символы запрещены, поэтому следует написать

e->Handled=true;

Таким образом, написана функция для одного текстового компонента. Однако в приложении, рассмотренном в примере, таких компонентов два. Не нужно копировать функцию и писать то же самое для второго компонента. Достаточно выделить этот компонент в окне дизайна формы и в списке событий указать для KeyPressed имя функции для первого компонента. Те же самые действия необходимо повторить, если количество компонент будет больше.

Проверка, введены ли значения

Прежде, чем проводить расчеты, необходимо проверить, введены ли данные в поле редактирования. Если в этом поле нет данных, то при попытке преобразовать пустую строку в число, возникает исключение. Данный код следует поместить в обработчик события Clickдля кнопки «Рассчитать».

try{

double l,v;

l=Convert::ToDouble(litr->Text);

v=Convert::ToDouble(vol->Text);

MessageBox::Show("Стоимость заправки равна " +s.ToString("n")+" руб.", "Бензиновый калькулятор", MessageBoxButtons::OK, MessageBoxIcon::Asterisk);

}catch{

MessageBox::Show("Надо ввести исходные данные", "Бензиновый калькулятор", MessageBoxButtons::OK, MessageBoxIcon::Asterisk);

litr->Focus();

}

Еще один способ– делать кнопку управления расчетами активной только в том случае, когда введены все значения. Это можно реализовать с помощью обработчика событияTextChangedдля компонентаTextBox. Сначала создается функция обработки события для компонентаlitr, а затем ее следует указать в качестве обработчика событияTextChangedдля компонентаvol.

Текст функции выглядит следующим образом.

if ((litr->Text->Length==0)||(vol->Text->Length==0))

button1->Enabled=false;

else

button1->Enabled=true;

Таким образом, кнопка управления расчетами становится активной только тогда, когда в текстовые поля введены какие-либо значения. Если при этом написан обработчик события OnKeyPress, то в окна будут введены только числовые значения.