提高双打的对话框数据验证

最初我把它写成一个实用程序类,用来在用户点击OK按钮时检查数据。但是,现有项目中的许多检查都是在DoDataExchange中完成的。因此,一段时间后,我意识到用改进后的代码替换DoDataExchange中现有的验证调用会很好,但方式很简单。这就是我如何想出DDV_RangeDouble的。 DDV_RangeDouble对(DDX_Text和DDX_MinMaxDouble)在一个调用中替换DDX_Text和DDX_MinMaxDouble。但这并不是唯一的区别。它的主要优点是它不是一个简单的最小值。值& lt;最大比较可以指定检查值的间隔范围。该区间与代数区间表达式相同,并以字符串的形式给出。例如,如果指定一个间隔"[0,90)",将执行以下检查:0<=value<90。写'inf'或'-inf'来指定一个无界区间的正无穷或负无穷。例如:"[0.0,inf)"将只测试值是否也大于或等于0.0,因为interval是指定为字符串的,你可以把变量的名字放在相同的字符串中,在interval部分之前(例如:“角[0,90)”)。这个名称将在一个类似于上图的错误消息中显示。最后的区别是,如果控件不可见或禁用,则不会执行验证,也不会显示错误消息。这样做的原因是,当关联变量在某种状态下与数据输入无关时,通常需要隐藏或禁用编辑控件。然而,MFC的DDV_函数仍然验证这些值并显示错误,这可能会使用户感到困惑。您还可以使用DDX_RangeDouble代替DDX_Text,而无需进行任何验证,方法是省略函数的最后一个参数(间隔范围)。它将完全像DDX_Text一样工作,只是如果编辑控件不可见或禁用,它不会为编辑控件中的非数字值显示错误消息。 要在对话框中使用这个,在对话框实现类的顶部包含头文件,并用DDX_RangeDouble替换所有相关的DDX_Text调用。删除DDX_MinMaxDouble后面的DDX_MinMaxDouble,并将值范围作为字符串放入DDX_RangeDouble调用中。隐藏,复制Code

#include "DValidateValue.h" // header for Dialog Data Validation

...

void CDlg_MyDemo::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CDlg_MyDemo)
    //}}AFX_DATA_MAP

    DDV_RangeDouble(pDX, IDC_EDIT_UNIT_WT, m_UnitWt, 
        "Unit Weight (0.0,inf)");
}

重要的 确保没有将DDV_RangeDouble放到AFX_DATA_MAP作用域内。将它放在外部,如示例所示,否则类向导将无法解析代码。 记住要用DDV_RangeDouble调用替换后面的DDX_Text和DDX_MinMaxDouble。 最后,尽管我编写这段代码是为了处理双精度数(我在字段中处理的大多是实数),但为整数添加类似的功能非常容易。最简单的方法是用一个带整型参数的函数包装DDV_RangeDouble。但是,您还需要检查编辑控件中的数字是否为实际的整数。 本文转载于:http://www.diyabc.com/frontweb/news5340.html

原文地址:https://www.cnblogs.com/Dincat/p/13462769.html