У меня есть диалог с двумя элементами управления 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);
}