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

上一页  1 2 3 4  下一页

  Init 的最后一个参数 MYWM_RGXFORM_MESSAGE 是应用程序定义的回调消息 ID,利用它可以使 CRegexForm 与你的应用程序沟通并做一些需要过程代码来定制验证的事情。如果你需要用数学算法来验证你的输入,你可以在域标志中设置 RGXF_CALLBACK,CRegexForm 将在进行验证时用通知代码 RGXNM_VALIDATEFIELD 方式向对话框发送回调消息。TestForm 使用回调来验证其 Prime Number 域;具体详细参见 Figure 4。

Figure 4 Procedural Validation Using Callback Message

//////////////////
// Handle notification from Regex Form Manager:
// Do custom validation for Prime Number.
//
LRESULT CMainDlg::OnRgxFormMessage(WPARAM wp, LPARAM lp)
{
 UINT nID = LOWORD(wp);
 UINT nCode = HIWORD(wp);
 if (nCode==RGXNM_VALIDATEFIELD) { // custom validation:
  if (nID==IDC_PRIME) {
   const CString& val = *(CString*)lp;
   if (val.IsEmpty())
    return RGXERR_OK;
   int p = _tstoi(val);
   return IsPrime(p) ? RGXERR_OK : RGXERR_NOMATCH;
  }
  ASSERT(FALSE); // shouldn't happen
 }
 return 0;
}


  CRegexForm 用其内部拥有的 CStrings 来进行 DDX,所以你不必为每个文本域定义对话框成员。你只要调用 CRegexForm 来传递数据即可。

void CMyDialog::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 m_rgxForm.DoDataExchange(pDX);
}

  当你初始化 CRegexForm 时,它分配一个 protected 类型的 FLDINFO 结构数组,映射中的每个域都有一个这样的数组。FLDINFO 结构的成员之一是 FLDINFO::val,类型为 CString,用来保存当前的域值。CRegexForm 在内部使用以此 CString 作为参数的 DDX_Text。你可以通过调用 CRegexForm::GetFieldValue 或 SetFieldValue 获取或设置该内部域值,它们都用控制ID来区分域。

m_rgxForm.SetFieldValue(IDC_ZIP,_T("10025"));

  CRegexForm 将所有值都当作文本对待,并将它们存储在 CStrings 中,同时提供 GetFieldValInt 和 GetFieldValDouble 方法来获得转换为 int 或 double 的值。对于其它类型,你得自己进行转换——或者你仍可以用 MFC DoDataExchange 中的 DDX 函数。TestForm 有一个 “Populate”按钮,它调用 CRegexForm::SetFieldValue 将样板数据填充到窗体中,如图 Figure 3 所示。通常,CRegexForm 使用控制 ID 来区分输入域。它包含有 GetFieldName、GetFieldHint 和 GetFieldError 来获取域名、提示和出错信息——它们都带有一个参数就是控制 ID。

  到此,我说明了如何创建域映射,编写资源串,初始化你的 CRegexForm 以及通过 DDX 来关联。所有这些都是序曲。真正的用户输入验证是在用户按下 OK 键后进行的:

void CMyDialog::OnOK()
{
 UpdateData(TRUE); // 拷贝屏幕输入->对话框
 int nBad = m_rgxForm.Validate();
 if (nBad>0) {
  m_badFields = m_rgxForm.GetBadFields();
  ...
}

  UpdateData 调用 MFC 的 DDX 机制,即调用对话框的 DoDataExchange。然后 DoDataExchange 调用 CRegexForm::DoDataExchange,从而将用户输入拷贝到其内部的 FLDINFO 结构。接着 CRegexForm::Validate 遍历输入域,针对域的正则表达式调用 CMRegex::Match 来验证每一个域。如果域输入无效,CRegexForm 便在其内部的 FLDINFO 中设置错误码 RGXERR_NOMATCH 或者必输于域如果为空,则设置 RGXERR_MISSING。Validate 返回无效域数量。如果有无效域,你可调用 CRegexForm::GetBadFields 来获得一个无效域 IDs 数组(STL vector)。然后你可以遍历该数组以获取各个错误吗和出错信息。这便是 TestForm 中 CMainDlg 建立其错误消息框所做的事情,如 Figure 2 所示。如果只有一个域无效,CMainDlg 调用 CRegexForm::ShowBadField 高亮该输入域并在反馈窗口显示出错信息,如图 Figure 3 所示。如果所有域都没问题,TestForm 便显示一个消息框展示输入的值(参见 Figure 5)。


Figure 5 显示输入的数据


上一页  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