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

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

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

  在实际应用中,你会将这些值拷贝到其最终目的地。Figure 6 是 CMainDlg::OnOK 的全部代码。通过数据交换中的非耦合式的数据验证,CRegexForm 给予你更充分的 UI 控制,并使你避免 MFC 固有的缺陷。
 

本文章更多内容<<上一页 - 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++

  热门关键字: