文/彭建华
问题分析
这是一个非常棘手的问题,存在以下关键必须解决:
⑴ 确定这个问题中的空格是用户需要的,被用户手工输入的还是通过我们上述方法形成的;
⑵ 每次输入字符后,不能取得当前输入行的字符串;
⑶ 不能取得分隔每行的标志,比如回车换行等;
⑷ 假如在编辑框中存在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的分析,使用递归算法后,这个难于解决的问题就变得很简单了。
[上一页] [1] [2]
|