Обработка событий нажатия кнопок диалога
Добавьте функцию-обработчик события Click для объекта “Кнопка OK”, таким образом, возвращаетесь к Designtab для формы LottoLimitsDialog, и дважды нажмите на кнопку OK для добавления скелета кода.
Нет необходимости добавлять обработчик для события Click кнопки Cancel. Эффект нажатия кнопки - закрыть окно диалога, и никаких дальнейших действий не требуется.
Обработчик события Click для кнопки OK может выглядеть следующим образом:
System::Void lottoOK_Click(System::Object^ sender, System::EventArgs^ e)
{
// If there’s a currently selected upper limit item, save it
if (lottoUpperList->SelectedItem != nullptr)
upperLimit = safe_cast<Int32>(lottoUpperList->SelectedItem);
// If there’s a currently selected lower limit item, save it
if(lottoLowerList->SelectedItem != nullptr)
lowerLimit = safe_cast<Int32>(lottoLowerList->SelectedItem);
}
Функция вначале хранит значение верхнего предела из объекта lottoUpperList ListBox в переменной-элементе, который вы добавили для этой цели. Свойство SelectedItem объекта ListBox делает текущий отобранный пункт доступным как обработчик типа Object ^, и код проверяет, что возвращаемое значение не null. Перед сохранением отобранного пункта Вы должны преобразовать его к типу Int32.
Автоматическое преобразование позаботится о преобразовании объекта в целое число. Следующий обработчик сохраняет значение нижнего предела из другого объекта ListBox тем же самым способом. Когда обработчик заканчивает выполнение, окно диалога автоматически закрывается.
Управление состоянием объектов ListBox
Один и тот же диалоговый объект используется для обработки события Click пунктов меню Limits > Upper и Limits > Lower, но Вы не хотите, чтобы оба списка изменялись в любом случае.
Для пункта меню Upper вы должны запретить выбор нижнего предела, а для пункта меню Lower должен быть запрещен верхний предел. Вы можете добавить несколько public функций-элементов к классу LottoLimitsDialog, чтобы сделать это возможным.
Вот функция для управления состоянием объектов ListBox для пункта меню Upper:
void SetUpperEnabled()
{
lottoUpperList->Enabled = true; // Enable upper list box
lottoLowerList->Enabled = false; // Disable lower list box
}
Вы устанавливаете свойство Enabled для объекта lottoUpperList в значение true, чтобы позволять пользователю взаимодействовать с ним. Установка свойства Enabled lottoLowerList в false делает его доступным только для чтения.
Для пункта меню Lower вы делаете обратное:
void SetLowerEnabled()
{
lottoUpperList->Enabled = false; // Disable upper list box
lottoLowerList->Enabled = true; // Enable lower list box
}
Вы проделали много работы, чтобы объект "Диалог" вел себя так, как вы хотите, но у Вас все еще нет объекта "Диалог". Объект "Окно приложения" позаботится об этом.
Создание объекта "Диалог"
Конструктор класса Form1 может создать объект "Диалог". Он также может инициализировать объекты ListBox в окне диалога.
Добавьте private элемент к классу Form1, который хранит обработчик для диалогового окна:
private: LottoLimitsDialog^ lottoLimitsDialog;
Добавьте следующие строки кода в тело конструктора Form1:
lottoLimitsDialog = gcnew LottoLimitsDialog;
lottoLimitsDialog->SetLowerLimitsList(1, lottoUpperLimit-lottoValuesCount+1, lottoUserMinimum);
lottoLimitsDialog->SetUpperLimitsList(lottoValuesCount, lottoUpperLimit,
lottoUserMaximum);
Этот код очень прост. Первый оператор создает объект "Диалог". Следующие два оператора вызывают функции, которые инициализируют списки в объектах ListBox.
Максимальное значение в ListBox, которое устанавливает нижний предел, рассчитывается так, чтобы можно было вводить требуемое количество чисел. Если максимальное значение - 49, а число значений на входе - 6, максимум для нижнего предела будет 44. Если число будет больше, Вы не сможете создать шесть различных значений.
Та же самая причина в минимальном значении верхнего предела; оно не может быть меньше, чем число значений на входе. Для списков ListBox для этой цели - значения lottoUserMinimum и lottoUserMaximum.
Поскольку Вы обращаетесь к LottoLimitsDialog в конструкторе класса Form1, необходимо добавить директиву #include в определении класса в Form1.h:
#include “LottoLimitsDialog.h”