下载首页 | 资讯中心 | 下载分类 | 最近更新 | 排 行 榜 | 国产软件 | 国外软件 | 汉化补丁 |
文章搜索: 分类 关键字 收藏本站设为首页
您的位置:首页网页设计ASP程序 → MFC中用正则表达式进行有效性验证 2__教程
MFC中用正则表达式进行有效性验证 2__教程
日期:2007-5-20 0:35:48 人气:64     [ ]
上一页 [1] [2] 下一页
 与往常一样,我编写了一个测试程序来示范它的工作原理。初看起来,TestForm 有点像再平常不过的基于 MFC 的对话框程序。它的主对话框中有几个编辑框——邮编、SSN(社会保险号),电话号码等。但当你通过对 TestForm 的测试,你会很快认识到它蕴含着许多玄机。如果你用tab键在输入域间移动,TestForm 会显示一个工具提示,它描述在这个输入域能输入什么如果你敲入了一个非法字符——例如,在电话号码输入域敲入一个字符——TestForm 将拒绝接受该字符并发出蜂鸣声。当你按下确认键或OK键,你会得到一个描述所有无效输入域的出错信息框,如图 Figure 2 所示。所有的错误都显示在一个消息框中,而不是每个错误一个消息框。接着当用户tab到其中一个无效输入域时,TestForm 会再次在对话框本身的一个应用程序提供的“反馈”窗口内显示出错信息(如 Figure 3),因此用户不必记住错误信息所描述的内容,当他们更正每个无效输入域时,窗体会提醒他们。如果只有一个输入域无效,TestForm 会放弃消息框而直接在“反馈”窗口显示错误信息。
所有这些神奇的特性都是由 CRegexForm 自己实现的。你只需使用它即可,使用方法相当直白,首先你得定义一个自己窗体。下面是 TestForm 的窗体内容,这些定义位于 MainDlg.cpp:

// form/field map
BEGIN_REGEX_FORM(MyRegexForm)
RGXFIELD(IDC_ZIP,RGXF_REQUIRED,0)
RGXFIELD(IDC_SSN,0,0)
RGXFIELD(IDC_PHONE,0,0)
RGXFIELD(IDC_TOKEN,0,0)
RGXFIELD(IDC_PRIME,RGXF_CALLBACK,0)
RGXFIELD(IDC_FAVCOL,0,CMRegex::IgnoreCase)
END_REGEX_FORM()

   这个宏定义了一个静态表格,表格描述每个编辑控制域。大多数情况下你只需要控制 ID,还要有地方放标志和 RegexOptions。例如,在 TestForm 中,邮政编码是必输域(RGXF_REQUIRED),质数(Prime Number)输入域使用回调(稍后会详细讨论),最喜爱的专栏作家(IDC_FAVCOL)指定 CMRegex::IgnoreCase,它使得大小写 不敏感。
看着表格你可能想知道正则表达式在哪。回答是:在资源文件中。对于每个域/控制ID,CRegexForm 都期望有一个具有相同ID的资源串。资源串由五个子串组成,子串之间用新行符(''\n'')分隔。一般格式为:
“Name\nRegex\nLegalChars\nHint\nErrMsg”。以下是 IDC_ZIP 所用的串:

 "Zip Code\n^\\d{5}(-\\d{4})?$\n[\\d-]\n##### or #####-####"
   第一个子串“Zip Code”是域名。第二个“^\d{5}(-\d{4})?$”,是用于验证邮编的正则表达式。(在资源串中必须敲入两个反斜线,目的是转义正则表达式中反斜线)。第三个子串是另外一个正则表达式,用来描述合法字符。对于邮编来说,即是“[\d-]”,意思是允许数字和连字符(hyphen)。如果输入域无字符限制,你可以通过敲入两个连续的新行符(“\n\n”意思是空子串)省略 LegalChars 检查。第四个子串全部为工具提示串。最后你可以提供第五个子串,如果该输入域无效则显示错误信息。对于邮编来说,它没有错误信息,所以 CRegexForm 产生一个默认的信息,形式为“Should be xxx”,xxx 被工具提示替代。“Should be”本身即是另一个资源串(稍后还要说到)。这些子串中,只有第一个域是必输域。

   为什么用资源串来保存所有信息,而不直接在域映射中编码处理呢?首先,将它放在映射中使得代码很笨拙。把这些乱七八糟的字符串放在不显眼的地方有利于代码更整洁。此外宏无法处理可选参数,根据你所用参数的多少,你需要多个宏,如:RGXFIELD3、RGXFIELD4 和 RGXFIELD5。这样不是太笨拙了嘛?使用资源串真正的好处在于容易本地化。翻译者可以翻译字符串并创建不同的资源 DLLs。甚至正则表达式本身都需要翻译(不同的国家和地域邮编可能是不同的),所以它们也放在资源串中。

   此外,再让我顺便指出用正则表达式解析这些子串是多么容易。MFC 有一个 26 行的专门用来解析子串的函数 AfxExtractSubString,但 CRegexForm 使用 CMRegex 来做只要一行代码!

CString str;
str.LoadString(nID);
vector<CString> substrs = CMRegex::Split(str, _T("\n"));

   现在 substrs[i] 是第 i 个子串,如果你想知道有多少个子串,调用 substrs.size()即可。我真的很高兴我包装了 Split 函数来返回 STL vector。

   一旦你用 BEGIN/END_REGEX_FORM 定义了自己的域映射并编写了自己的资源串,下一步要做的就是在对话框中实例化 CRegexForm 并进行初始化:

// in OnInitDialog
m_rgxForm.Init(MyRegexForm, this, IDS_MYREGEXFORM, MYWM_RGXFORM_MESSAGE);


   自然,CRegexForm 需要域映射并指向你的对话框;第二和第三个参数是另一个资源串和回调消息ID。与单独的域字符串一样,初始串由包含新行符分隔的多个子串组成。对于 TestForm,IDS_MYREGEXFORM 是“Error: %s\nRequired\nShould be: %s\nBad Value”。第一个子串“Error: %s”是错误前缀。CRegexForm 用来显示“Error: xxx,”,xxx 是实际的出错信息。第二个子串,“Required,”是一个词/短语,当该域为必输域(RGXF_REQUIRED)时使用。第三个子串“Should be: %s,”我前面已经描述过,CRegexForm 用它来产生出错信息。“Should be: xxx”中的 xxx 是域提示。最后一个子串,“Bad Value,”CRegexForm 可以用它来放任何信息,当域没有提示也没有出错信息时使用

出处:本站原创 作者:佚名
 阅读排行
01.精美qq空间横幅代码
02.最酷qq个性女生网名
03.最新又有免费QQ秀啦《..
04.巧用透明FlaSh扮靓你的..
05.花之神匠代码(最新代码..
06.最新QQ空间免费导航
07.最新免费个人形象设置..
08.最新qq空间flash代码m..
09.CSS技术结合图像实现动..
10.Photoshop光影魔术师:..
11.QQ音速种子狂刷
12.最新QQ空间透明代码
13.PS实例教程:教你制作结..
14.Photoshop光影魔术师:..
15.制作背景图__教程
16.用Photoshop制作漂亮的..
17.如何获得QQ音速种子
18.≤QQ空间代码≥在日志..
19.网页浮动广告的制作代..
20.用Photoshop制作大红灯..
21.常用CSS
22.Photoshop给靓丽美女打..
 推荐文章
·Photoshop 表现技法之..
·快速将你的相片矢量化..
·PHOTOSHOP制作炽热的太..
·用Photoshop制作美丽的..
·流行杀手的娃娃工厂__..
·打造8号台球__教程
·PHOTOSHOP制作待机MM图..
·用Photoshop帮MM做纹身..
·PHOTOSHOP美眉着色绝招..
·PHOTOSHOP花露的制作_..
·PHOTOSHOP渐变工具的巧..
·PHOTOSHOP手绘奥兰多-..
·高难度抠图两种方法__..
·Photoshop高尔夫球的制..
·Photoshop打造精美玉佩..
Eqxia_COM下载站 版权所有 Copyright© 2001-2005 Www.eqxia.COM, All Rights Reserved.