Получение данных из диалоговых компонент
Вы получите значения пределов из компонент тем же самым способом, как вы это делали для первой закладки. Сначала вы можете добавить некоторые новые элементы-данные к EuroLimitsDialog классу, чтобы поддерживать значения пределов, определенных пользователем:
private:
int lowerValuesLimit;
int upperValuesLimit;
int lowerStarsLimit;
int upperStarsLimit;
Вы должны инициализировать следующие элементы в конструкторе класса:
EuroLimitsDialog(void)
:lowerValuesLimit(1)
,upperValuesLimit(50)
,lowerStarsLimit(1)
,upperStarsLimit(9)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
}
Вам также необходимо несколько дополнительных свойств (public), определяемых в классе диалога, чтобы сделать пределы доступными из
объекта окна приложения:
public:
property int LowerValuesLimit
{
int get() { return lowerValuesLimit; }
void set(int limit)
{
lowerValuesLimit = limit;
lowerValuesLimits->Value = limit; // Set as selected in NumericUpDown
}
}
property int UpperValuesLimit
{
int get() { return upperValuesLimit; }
void set(int limit)
{
upperValuesLimit = limit;
upperValuesLimits->Value = limit; // Set as selected in NumericUpDown
}
}
property int LowerStarsLimit
{
int get() { return lowerStarsLimit; }
void set(int limit)
{
lowerStarsLimit = limit;
lowerStarsLimits->SelectedItem = limit; // Set as selected in ComboBox
lowerStarsLimits->SelectedIndex = // Set index for selected item
lowerStarsLimits->FindString(limit.ToString());
}
}
property int UpperStarsLimit
{
int get() { return upperStarsLimit; }
void set(int limit)
{
upperStarsLimit = limit;
upperStarsLimits->SelectedItem = limit; // Set as selected in ComboBox
upperStarsLimits->SelectedIndex = // Set index for selected item
upperStarsLimits->FindString(limit.ToString());
}
}
Функция get() для каждого свойства возвращает значение соответствующего private элемента, класса диалога. Функция set() устанавливает значение элемента данных и также модернизирует компоненту в окне диалога так, чтобы установленное значение становится выбранным.
Значение свойства SelectedIndex - индекс отобранного пункта. Вы устанавливаете его, используя функцию FindString() для компоненты ComboBox, которая возвращает значение индекса для первого появления аргумента в коллекции пунктов.
Значение в этой позиции показывается первоначально в компоненте.
Добавьте обработчик события Click для кнопки OK в EuroLimitsDialog классе, двойным нажатием на кнопку в окне Design.
Вам не нужен обработчик для кнопки Cancel. Вы можете реализовать обработчик кнопки OK следующим образом:
System::Void euroOK_Click(System::Object^ sender, System::EventArgs^ e)
{
::DialogResult result;
// get the limits for values
int valuesLower = Decimal::ToInt32(lowerValuesLimits->Value);
int valuesUpper = Decimal::ToInt32(upperValuesLimits->Value);
if(valuesUpper - valuesLower < 4) // Check for an adequate range
{
result = MessageBox::Show(this, // Range insufficient so
“Upper values limit: “+valuesUpper + // display message box
“ Lower values limit: “+ valuesLower+
“\nUpper values limit must be at least 4 greater that the lower limit.”+
“\nTry Again.”,
“Limits Invalid”,
MessageBoxButtons::OKCancel,
MessageBoxIcon::Error);
if(result == ::DialogResult::OK) // If message box OK clicked
DialogResult = ::DialogResult::None; // prevent dialog from closing
else // Messag box Cancel clicked
DialogResult = ::DialogResult::Cancel; // so close the dialog
return;
}
// Get stars limits
int starsLower = lowerStarsLimits->SelectedItem == nullptr ?
lowerStarsLimit :
Int32::Parse(lowerStarsLimits->SelectedItem->ToString());
int starsUpper = upperStarsLimits->SelectedItem == nullptr ?
upperStarsLimit :
Int32::Parse(upperStarsLimits->SelectedItem->ToString());
if(starsUpper - starsLower < 1) // Check for an adequate range
{
result = MessageBox::Show(this, // Range insufficient so
“Upper stars limit: “+starsUpper + // so display message box
“ Lower stars limit: “+ starsLower+
“\nUpper stars limit must be at least 1 greater that the lower limit.”+
“\nTry Again.”,
“Limits Invalid”,
MessageBoxButtons::OKCancel,
MessageBoxIcon::Error);
if(result == ::DialogResult::OK) // If message box OK clicked
DialogResult = ::DialogResult::None; // prevent dialog from closing
else // Message box Cancel clicked
DialogResult = ::DialogResult::Cancel; // so close the dialog
}
// Store the new limits
lowerValuesLimit = valuesLower;
upperValuesLimit = valuesUpper;
lowerStarsLimit = starsLower;
upperStarsLimit = starsUpper;
}
Свойство Value для компоненты NumericUpDown возвращает значение типа Decimal (Десятичное число). Чтобы преобразовывать его к типу Int32, Вы передаете как аргумент в статическую фнкцию ToInt32 () в классе Decimal.
Значение, которое эта функция возвращает, автоматически преобразуется так, чтобы это значение может храниться в переменной типа int.
Значение, возвращаемое свойством SelectedItem компоненты ComboBox, имеет тип Object ^. Если проверяемое значение NULL ( является пустым), Вы устанавливаете локальную переменную в текущее значение, зарегистрированное в диалоговом объекте; если значение не пусто, Вы сохраняте значение, представленное свойством SelectedItem.
Вы не можете хранить значение непосредственно, но при вызове функции ToString () для объекта производится преобразование в строку, которую Вы можете конвертировать в тип int, используя статическую функция Parse () в классе Int32.
Вам необходим private-элемент класса Form1, в котором будет храниться обработчик для нового окна диалога.
private:
EuroLimitsDialog^ euroLimitsDialog; // Dialog to set Euromillions limits
Вы можете добавить следующие операторы до конца кода в конструктор класса Form1, чтобы создать диалоговый объект и модернизировать свойства для значений пределов:
euroLimitsDialog = gcnew EuroLimitsDialog;
euroLimitsDialog->LowerStarsLimit = euroStarsLowerLimit;
euroLimitsDialog->UpperStarsLimit = euroStarsUpperLimit;
Установив свойства LowerStarsLimit и UpperStarsLimit для объекта Диалог, Вы убеждаетесь в том, что в компоненте ComboBox высвечиваются именно эти значения, когда диалоговое окно первоначально появляется. Если нет никакого выбранного пункта для компоненты ComboBox, то первоначально ничего не выводится.
Не забудьте добавить директиву #include для определения класса EuroLimitsDialog в Form1.h:
#include “EuroLimitsDialog.h”