您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:97 来源:vckbase.com

本文章共8437字,分6页,当前第1页,快速翻页:
 

在MFC中用正则表达式对窗体进行有效性验证

原著:Paul DiLascia
翻译:NorthTibet

逆@风@者

下载源代码:CATWork0504.exe (248KB)
原文出处:C At Work: Form Validation with Regular Expressions in MFC

本文发布后有更新参见文中的:[编辑更新]

  我想利用本月的专栏描述一个有趣的应用程序,这个程序是用本期我的一篇文章:“使用 ManWrap 库在本机 C 代码中调用.NET”所讨论的 RegexWrap 库生成的。RegexForm 是一个基于正则表达式的MFC窗体有效性验证系统。为了实现这个程序,我首先实现了 RegexWrap。但因为许多细节与正则表达式本身无关,所以感觉在这里描述 RegexForm 更好些。
  正如我在这篇文章中所言,正则表达式最实用的一个地方是验证用户输入。它可以轻松验证邮编、电话号码、信用卡号码——以及现实世界中各种类型的信息。一个正则表达式可以替换成打甚至上百行过程代码。UNIX 和 Web 编程语言如 Perl从一开始就有正则表达式,但在 Windows 世界或MFC,从来都是使用第三方库,一直到 .NET 框架才结束这个局面。[编辑更新——3/15/2005:ATL Server Library 中的 CAtlRegExp 和 CAtlREMatchContext 类为正则表达式提供支持。] 因此现在 .NET 提供一个完整的正则表达式库,为什么不在MFC应用程序中使用它呢?并且利用我在前述文章中描述的 RegexWrap 库,你甚至都不需要托管扩展或 /clr。
  MFC 已经具备一种称为“对话框数据交换”(Dialog Data Exchange,即 DDX)以及“对话框数据验证”(Dialog Data Validation,即 DDV)的机制来验证对话框输入。从技术上讲,DDX 只是在屏幕和你的对话框对象之间传输数据,而 DDV 才验证数据。当你从对话框的 OnOK 处理例程中调用 UpdateData 时 DDX 才开始工作。

// user pressed OK:

void CMyDialog::OnOK() {

     UpdateData(TRUE); // 获得对话框数据

     ...

}

  UpdateData 是一个虚拟 CWnd 函数,你可以在自己的对话框中重写这个函数。其布尔型(Boolean)参数告知是将信息拷贝到屏幕还是相反从屏幕拷贝信息。(你可以在 OnInitDialog 中调用 UpdateData(FALSE)以便初始化对话框)。默认的 CWnd 实现创建一个 CDataExchange 对象并将它传递到另一个虚拟函数,DoDataExchange,你得重写这个函数去调用专门的 DDX 函数来为单独的数据成员传递数据:

void CMyDialog::DoDataExchange(CDataExchange* pDX) {

    CDialog::DoDataExchange(pDX);

    DDX_Text(pDX, IDC_NAME, m_name);

    DDX_Text(pDX, IDC_AGE, m_age);

    ...

    // etc.

}

  这里 IDC_NAME 和 IDC_AGE 是编辑控制的 IDs,m_name 和 m_age 分别是 CString 和 int 数据成员。DDX_Text 将用户输入的 Name 和 Age 拷贝到 m_name 和 m_age(用一个重载顺便将 Age 转变成 int)。DDX 函数知道走哪条路,因为当从屏幕拷贝到对话框时,CDataExchange::m_bSaveAndValidate 为 TRUE,反之则为 FALSE。MFC 为各种数据和控制类型加载 DDX 函数。例如,DDX_Text 至少有一些重载函数用来将输入文本拷贝和转换成不同的类型,如 CString、int、double、COleCurrency 等等。DDX_Check 用来将复选框的状态转换成整型值,DDX_Radio 则对单选按钮做同样的事情。
  DDX 函数传输数据;DDV 函数则验证它。例如,为了限制用户名称为 35个字符,你可以这样做:

// in CMyDialog::DoDataExchange

DDX_Text(pDX, IDC_NAME, m_sName); // 获得/设置值

DDV_MaxChars(pDX, m_sName, 35); // 验证

为了限定你的用户年龄为 1-120之间的一个整数,你可以这样写:
 

本文章更多内容1 - 2 - 3 - 4 - 5 - 6 - 下一页>>
相关文章

如何在NT下获取进程的路径(增补)
高效开发与彻底测试
对话框模板,RegexTest
在MDI程序中实现类似WPS2000的文件切换标签
用DirectShow抓取影片帧
用微软的实时通信API集成丰富的客户端通信
盗QQ,我也会
对《一个完善的ODBC数据库程序》一文的补充
Python 的数据库操作
类似 MSN 信息发送框的制作(上)
对《一个简单的学生成绩管理系统》优化的一
深入浅出 CPropertySheet
实现类似Excel和Visual C 里文件夹式样的标
利用OpenGL实现动画效果
一个简单的时钟程序
一个完善的ODBC数据库程序
如何定制浮动工具条
一步步制作真彩工具条
自动查找并删除VC生成的临时文件
在VC中调用 WebService (非托管)

相关评论


本文章所属分类:首页 VC++

  热门关键字: