在DoDataExchange中取消错误消息

时间:2015-10-22 09:39:40

标签: validation mfc

我想在数据验证时禁止MFC错误消息:

    void CMotorView::DoDataExchange(CDataExchange* pDX)
    {
        DDX_Text(pDX, IDC_AMBIENTTEMP, m_pSet->m_AmbientTemp);
    }

如果editcontrol IDC_AMBIENTTEMP中的文本在将数据保存到变量时不是数字,则框架将显示一个消息框,提示用户输入数字。我想压制此消息,并在我自己的代码中处理错误。

我认为框架将在验证错误的情况下抛出异常,但似乎并非如此。 DDX_Text也没有返回值我做错了什么?

void CMotorView::DoDataExchange(CDataExchange* pDX)
{
   try
   {
       DDX_Text(pDX, IDC_AMBIENTTEMP, m_pSet->m_AmbientTemp);
   }
   catch(CUserException* ex)
   {
       // nothing caught here
   }
   catch(...)
   {
       // nothing caught here either
   }
}

2 个答案:

答案 0 :(得分:1)

如果出现错误dl首先显示错误对话框,则会抛出异常。您可以使用DDX_Text来捕获此信息。请注意,抛出一个指针!

我建议你把DDX_Text写成一个字符串。这不会失败,然后您可以检查字符串是否真的是一个数字。或者您可以编写自己的DDX_TextMyFn来执行您想要的操作。您可以将MFC原始函数用作基本实现。

答案 1 :(得分:1)

将ES_NUMBER设置为编辑控件的样式。这将减少用户可以犯的错误。

DDX例程中的消息框无法被抑制或重定向。

这是一些使用CEditInt类的伪代码,该类具有成员函数GetValue / SetValue。

您还可以编写一个适用于CEdit控件的DDX_EditInt例程,并使用Get / SetDlgItemInt。

void AFXAPI DDX_EditInt(CDataExchange* pDX, int nIDC, int &iValue)
{
    // Get pointer to control
    HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC);     
    CEditInt *pWnd = (CEditInt *)CWnd::FromHandle(hWndCtrl);
    // Must be an CEditInt
    ASSERT(pWnd->IsKindOf(RUNTIME_CLASS(CEditInt)));
    // get the information from the defined window  
    if (pDX->m_bSaveAndValidate) 
        // Get the Value
        iValue = pWnd->GetValue();
    else 
        pWnd->SetValue(iValue);     
}