Шаг 22.
Microsoft Visual C++ 2010. Начала.
Первый проект. Внесение изменений

    На этом шаге мы рассмотрим работу с уже созданным проектом.

    Программу "Доход" можно усовершенствовать. Например, сделать так, чтобы в поля редактирования пользователь мог ввести только числа (в поле Сумма - дробное число, в поле Срок - целое), чтобы в результате нажатия клавиши Enter в поле Сумма курсор переходил в поле Срок, при нажатии этой же клавиши в поле Срок становилась активной кнопка Расчет. Кроме этого, можно сделать так, чтобы кнопка Расчет становилась доступной только после ввода данных в оба поля редактирования.

    Чтобы внести изменения в программу, нужно открыть соответствующий проект. Для этого надо в меню File (Файл) выбрать команду Open (Открыть) | Project (Решение или проект), открыть папку проекта и сделать щелчок на значке файла проекта (рисунок 1).


Рис.1. Загрузка проекта

    Нужный проект можно выбрать из списка проектов, над которыми в последнее время работал программист. Этот список становится доступным в результате выбора в меню File (Файл) команды Recent Projects (Последние проекты и решения).

    Чтобы программа "Доход" работала так, как было описано ранее, надо создать функции обработки событий KeyPress и TextChanged для полей редактирования (компонентов textBox1 и textBox2). Функция обработки события KeyPress (для каждого компонента своя) фильтрует символы, вводимые пользователем. Она проверяет символ нажатой клавиши (символ передается в процедуру обработки события через параметр e) и, если символ "запрещен", присваивает значение True свойству Handled. В результате "запрещенный" символ в поле редактирования не появляется. Процедура обработки события TextChanged (событие возникает, если текст, находящийся в поле редактирования, изменился, например, в результате нажатия какой-либо клавиши в поле редактирования) управляет доступностью кнопки Расчет. Она проверяет, есть ли данные в полях редактирования, затем, если в каком-либо из полей данных нет, присваивает свойству Enabled кнопки button1 значение False и, тем самым, делает кнопку недоступной. Следует обратить внимание, что действие, которое надо выполнить, если изменилось содержимое поля textBox1, ничем не отличается от действия, которое надо выполнить, если изменилось содержимое поля textBox2. Поэтому обработку события TextChanged для обоих компонентов может выполнить одна функция. Чтобы одна функция могла обрабатывать события разных компонентов, сначала надо создать функцию обработки события для одного компонента, а затем указать эту функцию в качестве обработчика соответствующего события другого компонента.

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

// нажатие клавиши в поле Сумма 
private: System::Void textBox1_KeyPress(System::Object^  sender, 
           System::Windows::Forms::KeyPressEventArgs^  e) {
	if ((e->KeyChar >= '0') && (e->KeyChar <= '9')) 
	// цифра 
		return; 
	// "Правильный" десятичный разделитель - запятая. 
	// Заменим точку на запятую 
	if (e->KeyChar == '.') e->KeyChar = ','; 
	if (e->KeyChar == ',') 
	{ 
		// Нажата запятая. Проверим, 
		// может, запятая уже есть в поле редактирования 
		if ((textBox1->Text->IndexOf(',') != -1) || 
			(textBox1->Text->Length == 0)) 
		{ 
			// Запятая уже есть. 
			// Запретить ввод еще одной 
			e->Handled = true; 
		} 
		return; 
	} 
	if (Char::IsControl(e->KeyChar)) 
	{ 
		if (e->KeyChar == (char)Keys::Enter) 
		{ 
			// Нажата клавиша <Enter>.
			// Переместить курсор в поле Срок 
			textBox2->Focus(); 
		} 
		return; 
	} 
	// остальные символы запрещены 
	e->Handled = true; 
} 

// нажатие клавиши в поле Срок 
private: System::Void textBox2_KeyPress(System::Object^ sender, 
		System::Windows::Forms::KeyPressEventArgs^ e) { 
	// в поле Срок можно ввести только целое число 
	if ((e->KeyChar >= '0') && (e->KeyChar <= '9')) 
		// цифра 
		return; 
	if (Char::IsControl(e->KeyChar)) 
	{ 
		if (e->KeyChar == (char)Keys::Enter) 
		{ 
			// Нажата клавиша <Enter>. 
			// Переместить фокус на кнопку Расчет 
			button1->Focus(); 
		} 
		return; 
	} 
	// остальные символы запрещены 
	e->Handled = true; 
}

// Функция обрабатывает событие TextChanged (изменился 
// текст в поле редактирования) обоих компонентов TextBox. 
// Сначала надо обычным образом создать функцию 
// обработки события TextChanged для компонента textBox1, 
// затем - указать ее в качестве 
// обработчика события TextChanged для компонента textBox2 
private: System::Void textBox1_TextChanged(System::Object^ sender, 
		System::EventArgs^ e) { 
	label3->Text = ""; // очистить поле отображения 
	// результата расчета
	if ((textBox1->Text->Length == 0) || (textBox2->Text->Length == 0)) 
		// В поле редактирования нет данных. 
		// Сделать кнопку Расчет недоступной 
		button1->Enabled = false; 
	else 
		// Сделать кнопку Расчет доступной 
		button1->Enabled = true; 
}

    В следующем листинге приведен конструктор формы. Он показывает, как можно выполнить настройку компонентов формы "в коде".

Form1(void)
{
	InitializeComponent();
	//
	//TODO: добавьте код конструктора
	// сделать кнопку Расчет недоступной 
	button1->Enabled = false; 
}
Архив проекта можно взять здесь.

    На следующем шаге мы рассмотрим завершение работы над проектом.




Предыдущий шаг Содержание Следующий шаг