我想验证对话框中控件的内容。
如果输入的不符合要求弹出错误信息,可是对话框也关闭了。
我曾经想过重写OnOk(),没能成功。点击确定什么事都不管了。
后来我用了个笨办法,就是做了个循环,验证完再打开对话框,虽然成功了,但是这也太麻烦了。
ddv我也试过,不能满足要求呀。用ddv验证时,弹出错误信息后对话框就不关闭,很神奇,怎么实现的呀?
如果我自己做的验证也能像ddv似的就好了,请各位高手帮忙!
我做的代码是这样的:
int i=1;
while(i)
{

if(mdlg1.DoModal()==IDOK)
{
if(mdlg1.m_mode_e1==0&&mdlg1.m_mode_e2==""&&mdlg1.m_mode_e3=="")
{
MessageBox("请至少输入一个信息!");
continue;
}
if(mdlg1.m_select==0)
{
MessageBox("请选择一个信息!");
continue;
}
if(mdlg1.m_select==1&&mdlg1.m_mode_e1==0)
{
MessageBox("选择和输入的内容不一致!");
continue;
}
if(mdlg1.m_select==2&&mdlg1.m_mode_e2=="")
{
MessageBox("选择和输入的内容不一致!");
continue;
}
if(mdlg1.m_select==3&&mdlg1.m_mode_e3=="")
{
MessageBox("选择和输入的内容不一致!");
continue;
} select=mdlg1.m_select;
...............

i=0;
}
else
{
i=0;
}
}

解决方案 »

  1.   

    很简单:在对应的DDX_xxx 的函数后面加如下内容(DoDataExchange函数内)
    void CMyDlg::DoDataExchange(CDataExchange* pDX)
    {
       DDX_Text(IDC_EDIT1, m_str);
       // 验证m_str
       if(pDX->m_bSaveAndValidate){
           if(m_str.GetLength() < 10)  // 如果m_str的内容长度不足10个字符,则不行
           {
               AfxMessageBox("请至少输入10个字符!");
               pDX->Pail();
           }
       }
       DDX_....
       
    }
      

  2.   

    其实上面这段代码,可以做成一个自定义的 DDV_xxx函数:void AFX_API DDV_MinChar(CDataExchange* pDX, const CString& str, int len)
    {
       if(pDX->m_bSaveAndValidate){
           if(str.GetLength() < len)  // 如果m_str的内容长度不足10个字符,则不行
           {
               CString  strMsg;
               strMsg.Format("请至少输入%d个字符!", len)
               AfxMessageBox(strMsg);
               pDX->Pail();
           }
       }
    }你可以根据自己的需要,按这种格式做成各种各样的数据验证函数
      

  3.   

    成功了,最后一句是pDX->Fail();
    谢谢你!!!!!!!!!!
      

  4.   

    最后一句是关键. 它指出本次数据交换失败了. 如果你调用了UpdateData,则会返回FALSE此时,对话框的焦点会转移到刚才交换数据的那个控件上.这就是为什么要放在 相应的DDX_函数后的原因.