Шаг 41.
Microsoft Visual C++ 2010. Начала.
Базовые компоненты. Компонент NumericUpDown

    На этом шаге мы рассмотрим назначение, основные свойства и пример использования этого компонента.

    Компонент NumericUpDown (рисунок 1) предназначен для ввода числовых данных.


Рис.1. Компонент NumericUpDown

    Данные можно ввести в поле редактирования путем набора на клавиатуре или изменить уже введенные данные при помощи командных кнопок Увеличить и Уменьшить, которые находятся справа от поля редактирования.

    Свойства компонента NumericUpDown приведены в таблице 1.

Таблица 1. Свойства компонента NumericUpDown
Свойство Описание
Value Значение, соответствующее содержимому поля редактирования
Maximum Максимально возможное значение, которое можно ввести в поле компонента
Minimum Минимально возможное значение, которое можно ввести в поле компонента
Increment Величина, на которую увеличивается или уменьшается значение свойства Value при каждом щелчке мышью на кнопках Увеличить или Уменьшить
DecimalPlaces Количество цифр дробной части числа

    Если в поле редактирования компонента NumericUpDown введено дробное число, то в результате нажатия клавиши Enter оно будет округлено до DecimalPlaces цифр дробной части. При этом если значение свойства DecimalPlaces равно нулю, то значение в поле компонента будет округлено до целого.

    Программа "Таймер" (ее форма приведена на рисунке 2, а текст - в листинге ниже) демонстрирует использование компонента NumericUpDown.


Рис.2. Форма программы "Таймер"

    Компоненты numericUpDown1 и numericUpDown2 используются для ввода значения интервала времени. Во время создания формы свойству Maximum обоих компонентов надо присвоить значение 59.

    Приведем текст приложения.

.   .   .   .   .
    private: DateTime^ t1; // время пуска таймера 
    private: DateTime^ t2; // время срабатывания таймера 
.   .   .   .   .
// Обработка события ValueChanged компонентов 
// numericUpDown1 и numericUpDown1 
private: System::Void numericUpDown_ValueChanged(System::Object^ sender, 
		System::EventArgs^ e) 
{ 
		if ((numericUpDown1->Value == 0) && 
			(numericUpDown2->Value == 0)) 
				button1->Enabled = false; 
		else 
				button1->Enabled = true; 
} 
// щелчок на кнопке Пуск/Стоп 
private: System::Void button1_Click(System::Object^  sender, 
System::EventArgs^  e) {
		if (!timer1->Enabled)
		{ 
			// пуск таймера 
			// t1 - текущее время 
			// t2 = t1 + интервал 
			t1 = gcnew DateTime(DateTime::Now.Year, 
					DateTime::Now.Month, DateTime::Now.Day); 
			t2 = t1->AddMinutes((double)numericUpDown1->Value); 
			t2 = t2->AddSeconds((double)numericUpDown2->Value); 
			groupBox1->Enabled = false; 
			button1->Text = "Стоп"; 
			if (t2->Minute < 10) 
				label1->Text = "0"+t2->Minute.ToString()+":"; 
			else 
				label1->Text = t2->Minute.ToString() + ":"; 
			if (t2->Second < 10) 
				label1->Text += "0" + t2->Second.ToString(); 
			else 
				label1->Text += t2->Second.ToString(); 
			// период возникновения события Tick - 1 секунда 
			timer1->Interval = 1000; 
			// пуск таймера 
			timer1->Enabled = true; 
			groupBox1->Enabled = false; 
		} 
		else 
		{ 
			// таймер работает, останавливаем 
			timer1->Enabled = false; 
			button1->Text = "Пуск"; 
			groupBox1->Enabled = true; 
			numericUpDown1->Value = t2->Minute; 
			numericUpDown2->Value = t2->Second; 
		} 
 }

// обработка сигнала от таймера 
private: System::Void timer1_Tick(System::Object^  sender, 
System::EventArgs^  e) {
		t2 = t2->AddSeconds(-1); 
		if (t2->Minute < 10) 
			label1->Text = "0" + t2->Minute.ToString() + ":"; 
		else 
			label1->Text = t2->Minute.ToString() + ":"; 
		if (t2->Second < 10) 
			label1->Text += "0" + t2->Second.ToString(); 
		else 
			label1->Text += t2->Second.ToString(); 
		if (Equals(t1, t2)) 
		{ 
			timer1->Enabled = false; 
			this->Activate(); 
			MessageBox::Show(textBox1->Text, "Таймер", 
				MessageBoxButtons::OK, 
				MessageBoxIcon::Information); 
			button1->Text = "Пуск"; 
			groupBox1->Enabled = true; 
			numericUpDown1->Value = 0; 
			numericUpDown2->Value = 0; 
		} 
 }
Архив проекта можно взять здесь.

    Прокомментируем приведенный текст.

    При изменении значения, находящегося в поле редактирования компонента NumericUpDown, возникает событие ValueChanged. Функция обработки этого события (одна для обоих компонентов) управляет доступностью кнопки Пуск. Она проверяет значения свойств Value и, если интервал не задан (равен нулю), делает кнопку недоступной. Процедура обработки события Click, возникающего при щелчке на кнопке button1, запускает или, если таймер работает, останавливает таймер. При запуске таймера в переменную t1 записывается текущее время, а в переменную t2 - значение, сдвинутое вперед на величину интервала (t2 = момент запуска + интервал). Процедура обработки события Tick таймера уменьшает на единицу значение t2 и, если оно становится равным t1, останавливает таймер. Она же обеспечивает индикацию - выводит в поле компонента label1, сколько времени (минут и секунд) осталось до момента "срабатывания" таймера.

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




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