代码之家  ›  专栏  ›  技术社区  ›  segmentation_fault

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

  •  1
  • segmentation_fault  · 技术社区  · 6 年前

    我有一个对话框,其中有两个datetime控件,其格式设置为time。一个表示开始时间,另一个表示结束时间。

    因此,我通过 SetTime() 功能。

    我的问题是我正在初始化中的两个控件 OnInitDialog() 方法,但是 DoDataExchange() 是在 OnInitDialog() here

    如何首先初始化datetime控件?或者我可能没有正确地处理这个问题,或者我遗漏了什么?

    :

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

    }

    我只是打电话过来 数据交换()

    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 回复  |  直到 6 年前
        1
  •  4
  •   segmentation_fault    6 年前

    你总是在做验证。始终意味着,在将数据加载到对话框中以及提交数据时,您正在执行验证。

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

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