MFC инициализирует элемент управления выбора даты и времени перед выполнением пользовательской проверки - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть диалог с двумя элементами управления datetime, формат которых установлен на время. Один представляет время начала, а другой - время окончания.

Одним из требований является то, что время начала не может быть раньше времени окончания, а время окончания не может быть раньше времени начала.

Итак, я инициализирую время окончания на один час раньше, чем текущее время, с помощью функции SetTime().

Моя проблема в том, что я инициализирую два элемента управления в методе OnInitDialog(), но DoDataExchange() выполняется до функции OnInitDialog(), поэтому время начала и время окончания точно совпадают, и это вызывает мою проверку потерпеть неудачу и диалог не будет создан. Проверка дат выполняется в специальном валидаторе, который я адаптировал с здесь

Как я могу получить инициализацию элементов управления datetime? Или я, возможно, не правильно подхожу к этому или я чего-то упускаю?

В OnInitDialog():

BOOL CNewManualEntryDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    m_dtStartTime.SetRange(&GetTodayTimeMin(), &GetTodayTimeMax());
    m_dtEndTime.SetRange(&GetTodayTimeMin(), &GetTodayTimeMax());

    m_dtEndTime.SetTime(&SetEndTimeOneHourAhead());

    return TRUE;
}

Приведенные выше функции просто возвращают объект CTime. Для справки валидатор выглядит так:

void CNewManualEntryDlg::TimePickerValidation(CDataExchange* pDX)
{
    CTime startTime;
    CTime endTime;
    m_dtStartTime.GetTime(startTime);
    m_dtEndTime.GetTime(endTime);

    BOOL isStartTimeBehindEndTime = startTime > endTime;
    CString errorMsg;
    if (!isStartTimeBehindEndTime)
    {
        errorMsg += "Error - Start time cannot be ahead of end time\n";
    }
    if (!errorMsg.IsEmpty())
    {
        ::AfxMessageBox(errorMsg);
        pDX->Fail();
        return;
    }

}

И я просто называю это в DoDataExchange() так:

void CNewManualEntryDlg::DoDataExchange(CDataExchange* pDX)
{
   CDialogEx::DoDataExchange(pDX);

   DDX_Control(pDX, IDDT_STARTTIMEPICKER, m_dtStartTime);
   DDX_Control(pDX, IDDT_ENDTIMEPICKER, m_dtEndTime);

   TimePickerValidation(pDX);
}

1 Ответ

0 голосов
/ 05 сентября 2018

Вы делаете проверку всегда. Всегда означает, что вы выполняете проверку при загрузке данных в диалоговое окно и при фиксации данных.

DoDataExchange() вызывается в обоих направлениях. Вы можете определить pDX->m_bSaveAndValidate, чтобы проверить, находитесь ли вы в фазе сохранения.

if (pDX->m_bSaveAndValidate)
   TimePickerValidation(pDX);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...