Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14506417
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:59:21

下载本文示例代码
  摘要 Visual C 是Microsoft编程工具中的老大,它功能强大,使用它几乎可以开发Windows平台上的任何程序。但同时由于其功能强大,涉及面广而让人很难进入VC 的门槛。由于是Microsoft开发工具的拳头产品,发布前都要经过严格的测试,同时不断地升级维护,因此,其中常用的功能很难发现Bug,一旦存在Bug则很难解决。  关键词 Visual C ; 控件; Bug; Debug  控件是Visual C 中的被封装的一个类,使用控件,我们能够很快的开发OOP程序; Bug是程序中的错误; Debug就是在程序运行期间进行调试。  Bug描述  如下图所示界面: Figure 1  按Confirm按钮,Debug界面如下: Figure 2  从strText的值可以看出,Figure 1中的输入内容没有" ",并且Figure 1中的内容被限制输入6×10个字符,每行最多为20个字符,现在对Figure1 中的内容作如下修改:  删除第三行的8,9两个字符,也就是说Figure 1中的内容现在只有58个字符,用空格替换Figure 1中内容的第一行与第二行的最后一个字符,如图: Figure 3  现在如果在第一行与第二行中间分别加一个字符,出现如下界面: Figure 4  那么我想问大家一个问题,在第三行中还能输入几个字符? 答案是:不能输入字符,同时在内容的任何地方都不能输入字符。通过Debug我们能够知道其中的原因,请看Debug界面: Figure 5  从Figure 5中,我们能够看见,被替换的字符(空格)在Figure 4没有被显示出来,同时第一行与第二行中变成了21个字符。少数这样的情况能够让用户明白,同时能够方便地修改输入内容,但如果存在大量这种情况,则就是一个严重的问题了,比如:如果上面的文本中有1000行,每行有10个字符,同时有200个上述替换,那么,表现给用户的是:如果用户要填满编辑框的话,编辑框中有200个字符不能输入,有200行中的每行内容是11个字符。同时,如果程序的后续处理对上面输入的每行的字符有严格要求的话(比如银行国际业务结算使用的SWIFT报文等),那么严重的问题将会发生。  问题分析  这是一个非常棘手的问题,存在以下关键必须解决:  ⑴ 确定这个问题中的空格是用户需要的,被用户手工输入的还是通过我们上述方法形成的;  ⑵ 每次输入字符后,不能取得当前输入行的字符串;  ⑶ 不能取得分隔每行的标志,比如回车换行等;  ⑷ 假如在编辑框中存在100行,每行长度为10,那么如果超过10行存在那样的问题的话,也很难确定。  解决问题的算法  针对以上存在的问题,在取得编辑框的内容后,可以使用递归算法来过滤掉相关输入。  算法思想:  从第一行开始,以回车换行为一次递归调用,把每次的结果加起来。递归的思路是:根据每行最大的字符数,对每行进行判断,如果最后一个字符是空格,则把那个空格删除,最后,把不需要的空格都删除掉了。调用程序如下: CString strText, strObjText, strExchange;CEdit *pEdit; UpdateWindow();pEdit = (CEdit *)GetDlgItem(IDC_ET_CON);int nPos = 0, nLen = 0;int nMaxCols = 20;strObjText = "";pEdit->GetWindowText(strText);nPos = strText.Find("\r\n");while(nPos != -1){ strExchange = strText.Left(nPos); strText = strText.Right(strText.GetLength() - nPos -2); TrimEndNull(nMaxCols, strExchange, nMaxCols); strObjText = strObjText strExchange "\r\n"; nPos = strText.Find("\r\n");}strExchange = strText;TrimEndNull(nMaxCols, strExchange, nMaxCols);strObjText = strObjText strExchange;pEdit->SetWindowText(strObjText);UpdateWindow();  递归函数如下: TrimEndNull(int nPos, CString &strExchange, const int nMaxCols){ if (nPos >= strExchange.GetLength())  return; if (strExchange.GetAt(nPos) == ' ') {  strExchange = strExchange.Left(nPos)   strExchange.Right(strExchange.GetLength() - nPos - 1); } nPos = nPos nMaxCols; TrimEndNull(nPos, strExchange, nMaxCols);}  现在程序运行结果如下:   原始输入   替换后   输入A,B后,能够输满编辑框  结束语  本文主要讨论了解决VC 中的CEdit控件的一个Bug,使用了大家熟习的递归算法,通过对这个Bug的分析,使用递归算法后,这个难于解决的问题就变得很简单了。   摘要 Visual C 是Microsoft编程工具中的老大,它功能强大,使用它几乎可以开发Windows平台上的任何程序。但同时由于其功能强大,涉及面广而让人很难进入VC 的门槛。由于是Microsoft开发工具的拳头产品,发布前都要经过严格的测试,同时不断地升级维护,因此,其中常用的功能很难发现Bug,一旦存在Bug则很难解决。  关键词 Visual C ; 控件; Bug; Debug  控件是Visual C 中的被封装的一个类,使用控件,我们能够很快的开发OOP程序; Bug是程序中的错误; Debug就是在程序运行期间进行调试。  Bug描述  如下图所示界面: Figure 1  按Confirm按钮,Debug界面如下: Figure 2  从strText的值可以看出,Figure 1中的输入内容没有" ",并且Figure 1中的内容被限制输入6×10个字符,每行最多为20个字符,现在对Figure1 中的内容作如下修改:  删除第三行的8,9两个字符,也就是说Figure 1中的内容现在只有58个字符,用空格替换Figure 1中内容的第一行与第二行的最后一个字符,如图: Figure 3  现在如果在第一行与第二行中间分别加一个字符,出现如下界面: Figure 4  那么我想问大家一个问题,在第三行中还能输入几个字符? 答案是:不能输入字符,同时在内容的任何地方都不能输入字符。通过Debug我们能够知道其中的原因,请看Debug界面: Figure 5  从Figure 5中,我们能够看见,被替换的字符(空格)在Figure 4没有被显示出来,同时第一行与第二行中变成了21个字符。少数这样的情况能够让用户明白,同时能够方便地修改输入内容,但如果存在大量这种情况,则就是一个严重的问题了,比如:如果上面的文本中有1000行,每行有10个字符,同时有200个上述替换,那么,表现给用户的是:如果用户要填满编辑框的话,编辑框中有200个字符不能输入,有200行中的每行内容是11个字符。同时,如果程序的后续处理对上面输入的每行的字符有严格要求的话(比如银行国际业务结算使用的SWIFT报文等),那么严重的问题将会发生。  问题分析  这是一个非常棘手的问题,存在以下关键必须解决:  ⑴ 确定这个问题中的空格是用户需要的,被用户手工输入的还是通过我们上述方法形成的;  ⑵ 每次输入字符后,不能取得当前输入行的字符串;  ⑶ 不能取得分隔每行的标志,比如回车换行等;  ⑷ 假如在编辑框中存在100行,每行长度为10,那么如果超过10行存在那样的问题的话,也很难确定。  解决问题的算法  针对以上存在的问题,在取得编辑框的内容后,可以使用递归算法来过滤掉相关输入。  算法思想:  从第一行开始,以回车换行为一次递归调用,把每次的结果加起来。递归的思路是:根据每行最大的字符数,对每行进行判断,如果最后一个字符是空格,则把那个空格删除,最后,把不需要的空格都删除掉了。调用程序如下: CString strText, strObjText, strExchange;CEdit *pEdit; UpdateWindow();pEdit = (CEdit *)GetDlgItem(IDC_ET_CON);int nPos = 0, nLen = 0;int nMaxCols = 20;strObjText = "";pEdit->GetWindowText(strText);nPos = strText.Find("\r\n");while(nPos != -1){ strExchange = strText.Left(nPos); strText = strText.Right(strText.GetLength() - nPos -2); TrimEndNull(nMaxCols, strExchange, nMaxCols); strObjText = strObjText strExchange "\r\n"; nPos = strText.Find("\r\n");}strExchange = strText;TrimEndNull(nMaxCols, strExchange, nMaxCols);strObjText = strObjText strExchange;pEdit->SetWindowText(strObjText);UpdateWindow();  递归函数如下: TrimEndNull(int nPos, CString &strExchange, const int nMaxCols){ if (nPos >= strExchange.GetLength())  return; if (strExchange.GetAt(nPos) == ' ') {  strExchange = strExchange.Left(nPos)   strExchange.Right(strExchange.GetLength() - nPos - 1); } nPos = nPos nMaxCols; TrimEndNull(nPos, strExchange, nMaxCols);}  现在程序运行结果如下:   原始输入   替换后   输入A,B后,能够输满编辑框  结束语  本文主要讨论了解决VC 中的CEdit控件的一个Bug,使用了大家熟习的递归算法,通过对这个Bug的分析,使用递归算法后,这个难于解决的问题就变得很简单了。 下载本文示例代码


用递归算法解决VC中CEdit的一个Bug用递归算法解决VC中CEdit的一个Bug用递归算法解决VC中CEdit的一个Bug用递归算法解决VC中CEdit的一个Bug用递归算法解决VC中CEdit的一个Bug用递归算法解决VC中CEdit的一个Bug用递归算法解决VC中CEdit的一个Bug用递归算法解决VC中CEdit的一个Bug用递归算法解决VC中CEdit的一个Bug用递归算法解决VC中CEdit的一个Bug用递归算法解决VC中CEdit的一个Bug用递归算法解决VC中CEdit的一个Bug用递归算法解决VC中CEdit的一个Bug用递归算法解决VC中CEdit的一个Bug用递归算法解决VC中CEdit的一个Bug
阅读(142) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~