gpt4 book ai didi

c++ - MFC 在执行自定义验证之前初始化日期时间选择器控件

转载 作者:行者123 更新时间:2023-11-30 01:36:25 24 4
gpt4 key购买 nike

我有一个对话框,其中包含两个格式设置为时间的日期时间控件。一个代表开始时间,另一个代表结束时间。

其中一个要求是开始时间不能早于结束时间,结束时间不能早于开始时间。

所以我通过 SetTime() 将结束时间比当前时间提前一小时初始化。功能。

我的问题是我正在初始化 OnInitDialog() 中的两个控件方法,但是 DoDataExchange()OnInitDialog() 之前运行功能,因此开始时间和结束时间完全相同,这导致我的验证失败并且没有创建对话框。日期的检查是在我改编自 here 的自定义验证器中完成的。

如何让日期时间控件先被初始化?或者我可能没有正确处理这个问题,还是我遗漏了什么?

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);
}

最佳答案

您一直在进行验证。始终意味着,当您将数据加载到对话框中以及提交数据时,您正在执行验证。

DoDataExchange() 以两种方式调用。您可以确定 pDX->m_bSaveAndValidate 以检查您是否处于保存阶段。

if (pDX->m_bSaveAndValidate)
TimePickerValidation(pDX);

关于c++ - MFC 在执行自定义验证之前初始化日期时间选择器控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52181064/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com