Я работаю над диалоговым окном, в котором необходимо выполнить несколько правил, прежде чем кнопка ОК будет включена.
В настоящее время любое действие на странице, такое как ввод данных или выбор элемента из раскрывающегося списка (среди прочего), вызывает одну функцию с именем ProcessEvent () - эта функция обрабатывает всю логику и либо включает, либо отключает кнопку OK.
Моя проблема в том, что мне трудно сделать правила краткими и понятными.
Некоторые из правил могут быть отменены другим действием в диалоговом окне, и теперь у меня закончились операторы if else повсеместно или которые трудно читать, следовать и расширять.
Приведенный ниже код упрощает проблему, но хорошо ее демонстрирует. Как мне лучше справиться с этой проблемой (если это возможно)
bool CWorkstation::ProcessEvent(void)
{
UpdateData();
CharCount = GetDlgItemInt(IDC_CharCount, NULL, FALSE); //get latest
if ( IsDlgButtonChecked(IDC_USEDBNAME))
{
if (!IsDlgButtonChecked(IDC_MAXDBNAME))
{
EnableNext(TRUE);
}
}
if (IsDlgButtonChecked(IDC_MAXDBNAME) && CharCount)
{
if (IsDlgButtonChecked(IDC_USEXMLNAME))
{
if ( PrefixName.IsEmpty() )
{
EnableNext(FALSE);
}
else
{
EnableNext(TRUE);
}
}
}
if (IsDlgButtonChecked(IDC_USEXMLNAME) && PrefixName.GetLength() > 1)
{
EnableNext(TRUE);
}
if ( IsDlgButtonChecked(IDC_WSAUTONAME) || IsDlgButtonChecked(IDC_RENAMEIFDUP))
{
// TRACE("IDC_WSAUTONAME is Checked\n");
if ( IsDlgButtonChecked(IDC_USEXMLNAME) && PrefixName.GetLength() > 1 )
{
if ( IsDlgButtonChecked(IDC_IDC_USESHORTNAME) )
{
EnableNext(TRUE);
}
else if ( IsDlgButtonChecked(IDC_USELONGNAME) )
{
EnableNext(TRUE);
}
else
{
EnableNext(FALSE);
}
}
if ( !IsDlgButtonChecked(IDC_USEPREFIX) )
{
if ( IsDlgButtonChecked(IDC_IDC_USESHORTNAME) || IsDlgButtonChecked(IDC_USELONGNAME) )
{
EnableNext(TRUE);
}
}
return false;
}
}