На этом шаге мы рассмотрим назначение, основные свойства и пример использования этого компонента.
Компонент NumericUpDown (рисунок 1) предназначен для ввода числовых данных.
Рис.1. Компонент NumericUpDown
Данные можно ввести в поле редактирования путем набора на клавиатуре или изменить уже введенные данные при помощи командных кнопок Увеличить и Уменьшить, которые находятся справа от поля редактирования.
Свойства компонента NumericUpDown приведены в таблице 1.
Свойство | Описание |
---|---|
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.