
- •Часть 2. Сборник рецептов по визуальному программированию Введение в объектно-ориентированное программирование
- •Создание проекта в VisualStudio
- •Файлы проекта
- •Сведения об объекте
- •Общие свойства всех объектов
- •Класс Form
- •Помещение компонента в форму и прочие действия с дизайнером форм
- •Свойства форм
- •События формы
- •Методы формы
- •Компоненты ввода и отображения текстовой информации Компонент Label
- •Некоторые свойства компонента Label
- •Компонент TextBox
- •Методы TextBox
- •Компонент RichTextBox
- •Ввод числовых значений в компонент TextBox
- •Проверка, введены ли значения
- •Компонент ListBox
- •Компонент ComboBox
- •Ввод данных из файла
- •Компонент MaskedTextBox
- •Кнопки, индикаторы и управляющие элементы Компонент Button
- •Компонент Panel
- •Компоненты RadioButtonиCheckBox
- •Компонент GroupBox
- •Пример. Комплектация автомобиля
- •Работа с меню Главное меню
- •Контекстное меню
- •Создание текстового редактора
- •Системные диалоги
- •Компонент OpenFileDialog
- •Компонент SaveFileDialog
- •Диалог выбора шрифта
- •Диалог выбора цвета
- •Компонент PrintDialog
- •Диалоговые окна в текстовом редакторе
- •Расширенные символы Unicode
- •Работа с графикой Использование графических файлов
- •Создание фотоальбома
- •Методы для рисования на форме и прочих компонентах
- •Работа с таймером
- •Работа с датой и временем
- •Добавление новых форм к проекту
- •Многостраничные панели
- •Способы задания страниц
- •Методы TabControl
Ввод числовых значений в компонент 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, то в окна будут введены только числовые значения.