,VC   工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛,VC
您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > VC > 正文
MFC中用正则表达式进行有效性验证
[文章信息]
作者:NorthTibet编译
时间:2005-04-29
出处:VCKBASE
责任编辑:方舟
[文章导读]
正则表达式最实用的一个地方是验证用户输入
advertisement
热点推荐
· VB实现SQL Server 2000存储过程调用
· Java解析网络数据流的三种特殊方法
· 多媒体教程:网页表单文本域类型
· 体验V5E地形编辑:整体控制
· 打造完美可随意安装的WinXP镜像
[正文]

1 2 3 4  下一页

  正则表达式最实用的一个地方是验证用户输入。它可以轻松验证邮编、电话号码、信用卡号码——以及现实世界中各种类型的信息。一个正则表达式可以替换成打甚至上百行过程代码。UNIX 和 Web 编程语言如 Perl从一开始就有正则表达式,但在 Windows 世界或MFC,从来都是使用第三方库,一直到 .NET 框架才结束这个局面。因此现在 .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之间的一个整数,你可以这样写:

// m_age is int
DDX_Text(pDX, IDC_AGE, m_age);
DDV_MinMaxInt(pDX, m_age, 1, 120);

  虽然 DDX 工作表现得很好,DDV 是不免有点老土。MFC 在有效性验证方面所能做到的很有限。你可以在文本域中限制数字字符,不同类型的最小/最大约束。最小/最大是不错,但如果你想验证邮编或电话号码怎么办?MFC 对此无能为力。你不得不编写自己的 DDV 函数。当我第一次用正则表达式实现有效性验证时,我只要写一个函数即可,就像这样:
 
void DDV_Regex(CDataExchange* pDX, CString& val,
LPCTSTR pszRegex)
{
 if (pDX->m_bSaveAndValidate) {
  CMRegex r(pszRegex);
  if (!r.Match(val).Success()) {
   pDX->Fail(); // throws exception
  }
 }
}

  这使你很容易象下面这样用正则表达式验证输入:

// in CMyDialog::DoDataExchange
DDX_Text(pDX, IDC_ZIP, m_zip);
DDV_Regex(pDX, m_zip,_T("^\\d{5}(-\\d{4})?$"));

  好酷啊,仅用四行代码就搞掂。(当然,那要假设你有 RegexWrap——否则你得使用托管扩展直接调用框架 Regex 类。)DDV_Regex 在 MFC 的 DDX/DDV 方案中工作表现很完美,但是当我开始添加更多的域时,我马上发现一些 DDX/DDV 的主要缺点,其一,如果域输入无效,则每个 DDV 函数都显示一个出错消息框并丢出异常,那么要是有五个无效域,用户就会看到五个消息框——真实糟透了!此外,在对 DDV 的调用中,我不想将正则表达式写死在代码中。但我拒绝 DDX/DDV 的主要理由是它太程序化。为了验证新的域,你不得不添加另外的数据成员以及在 DoDataExchange 加更多的代码,不久这个函数便膨胀臃肿,就像下面这样:

DDX_Text(pDX, IDC_FOO,...);
DDV_Mumble(pDX, ...)
DDX_Text(pDX, IDC_BAR,...);
DDV_Bletch(...)
... // etc for 14 lines

  为什么我非得要墨守成规编写过程指令来描述固有的验证规则呢?我的五条编程最高准则之一是:拒斥程序化代码。另一个是:一个表格胜过一千行代码。你肯定猜到我要干什么了。最终,我编写自己的对话框验证系统,一个基于规则的、表格驱动的验证系统。它依靠在 DDX 的最上层,但废掉了 DDV 并有好得多的用户接口。当然,它还易于使用,借助正则表达式进行验证。所有细节都封装在一个类中,CRegexForm,你可以在任何 MFC 对话框中使用这个类。


Figure 1 TestForm 里的工具提示


1 2 3 4  下一页

发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
天极社区邀请您:写博客日记  上传相片   论坛聊天  订阅电子杂志  推荐网摘   免费图铃工具
笔名:   请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。
评论:
 
,VC相关内容,VC焦点新闻
  • 用Visual C++ 6.0模拟仿真生态系统
  • 利用VC+OpenGL实现几种特殊图形效果
  • VC6中用DOM遍历网页中的元素
  • VC编程实现动态截获并显示窗口DC
  • MFC六大关键技术剖析之动态创建
  • FVD刺激高清碟机加速商业化 抢占商机最重要
  • 3家搜索引擎集体诉讼8848 吕春维未敢出席
  • 杨元庆:没有准备不会获批的备用方案
  • 军队信息化诞生新领域 电子军务呼之欲出
  • 世界经济论坛公布信息化程度全球最新排名
  • 2004政务绩效评估:政府门户尚处于发展阶段
  • 甲骨文出资5.15亿美元 意图收购RetekInc
  • 技术并购:帮你突破传统增长的“天花板”
  • ,VCAdvertisement

    天极无线
    经典名曲 华语流行 欧美风情 人声音效 原声大碟
    你好周杰伦-安又琪
    直线-张韶涵
    天边-张韶涵
    看我72变-蔡依林
    乱世佳人-Twins
    全世界下雨-张娜拉
    我们的爱-飞儿乐队
    分手快乐-梁静茹
    爱在西元前-周杰伦
    三万英尺-迪克牛仔
    爱如潮水-张信哲
    爱情宣言-齐秦
    寻找玛依拉-刀郎
    驼铃-刀郎
    老鼠爱大米-杨臣刚
    功夫主题曲
    仙剑主题曲杀破狼
    天下无贼片尾曲
    冲动的惩罚-刀郎
    情人-刀郎
    爱情-莫文蔚
    挪威的森林-伍佰
    奔跑 - 羽泉
    因为爱 - 羽泉
      ·时尚女人圈
    ·经典影视专集
    ·美女秀场
    ·美丽大自然专题
    ·流行金曲
    ·科幻电影特区
    | 最新推荐
    ·你好周杰伦
    ·杀破狼
    ·寻找玛依拉
    ·孤单公园
    ·男人海洋
    | 魔术铃声
    ·少女丰胸
    ·少妇丰胸
    ·减肥魔铃
    ·增高魔铃
    ·美容魔铃

    今日报价查询 更多报价