列表 上一篇 下一篇

转:C++控件的数据交换和数据校验

原文地址:C++控件的数据交换和数据校验

介绍

MFC采用了独特的DDX和DDV技术。
DDX将数据成员变量同对话类模板内的控件相连接,这样就使得数据在控件之间很容易地传输。
DDV用于数据的校验,例如它能自动校验数据成员变量数值的范围,并发出相应的警告。

在类向导下添加成员变量的过程很简单(选中控件右击-->添加变量),需要说明的是:

  1. 在DDV/DDX技术中,允许用户为同一个控件关联多个数据成员变量,但必须保证这些变量名是互不相同的,且这些变量在同一个类型不能有多个变量,即在Value和Control类型中各自只能有一个成员变量。
  2. 如果添加的成员变量是一个数值类型,则在类向导对话框的Member Variables页面正文还可以输入变量的范围,这就是控件的数据校验设置。
  3. 变量类型Control、Value的区别(DDX_Control、DDX_Text的区别)

如图:
向导

实际的工作

  1. 在头文件中,添加与控件关联的成员变量的声明,代码:
private: int m_edit;


2. 在 .CPP文件中的类构造函数实现代码处,添加数据成员变量的一些初始化代码

CMFCCalcDlg::CMFCCalcDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CMFCCalcDlg::IDD, pParent) , m_edit(0) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); }


3. 在 .CPP文件中的DoDataExchange函数体内,添加控件的DDX/DDV代码,它们都是一些以DDV或DDX开关的函数调用。

void CMFCCalcDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_edit); DDV_MinMaxInt(pDX, m_edit, 1, 10); }


4. 当为一个控件定义一个关联的数据成员变量后,就可以使用CWnd::UpdataData函数实现控件的控制,包括控件相关数据的输入和读取。

UpdateData(false) //数据由控件相关的成员变量向控件传输 UpdateData(true) //或参数为空  数据从控件向相关联的成员变量复制


5. 关于DDX_Control(),添加变量向导中选择Control类型,并不需要DDV信息,使用时不需要updatedata,更体现面向对象思想。但是m_edit怎么与实际控件关联呢?没有对m_edit初始化,仅仅通过DDX_Control(pDX, IDC_EDIT1, m_edit);其中的IDC吗?

CString str; m_edit.GetWindowText(str);//得到控件的内容保存到str str = _T("控件绑定变量"); m_edit.SetWindowText(str);//设置控件的内容为str