1. 我们在做项目的时候,经常会在使用的控件中关联一个变量.但是你们可知道就在我们为一个控件关联了一个变量的时候.其实VS2003已经为我们增加了一个关联(这咋看起来像是废话,其实不是的.你先看完先)
当我们再修改程序时,或许由于某种原因(ID冲突,重定义ID等).再把刚刚定义的ID修改了.当我们把程序调起来的时候.此时并没有编译链接错误,甚至在启动以后如果没有显示当前的对话框也不会出现错误.但是,当我们做某个操作时,这个对话框显示的时候就会出现断言错误.而这个断言错误,我们一般都肯难定位到错误.
其实,正是由于我们先前将ID修改了,所以在资源文件里面我们找不到先前的ID,但是在resource.h文件里面确实有先前的ID.这是因为对话框资源文件与.rc是一致的.而resource.h则不随我们修改ID而删除.而编译器正是用的这个.h文件的ID.所以.很难排查.
2.关于string的一些错误处理问题.
1). 首先关于string和CString和char*以及int之间的转化问题.
这里并不想全部讨论,只是抽出一些容易犯错的地方:
string转化为CString:这里介绍两种方法,一种是根据string的成员函数.c_str()来进行转化.但是如果要将多个string(或int)转化为CString,这种方法就无能为力了.这里我们在说说另外一种方法:Format.
这个函数在使用的时候要注意了,当我们使用%s直接将string转化进去的话,既不出现编译错误,也没有链接错误,但是运行的时候,错误来了.这里也比较难定位的.究其原因,是应为%s的参数不能是string类型的.而应该是char*类型.
2).最后是关于string的操作符问题.
我们在处理时间的时候,经常需要处理从1970-1-1以来的秒数.当我们获取到这个秒数以后进行对比时经常犯一个错误,请看实例:
StringstrTime1;
StringstrTime2;
if(strTime1 >strTime2)
{
Something;
}
Else
{
Something;
}
这里常常认为只要这样简单的判断下就可以搞定两者之间的大小比较了.其实不是.
如果我输入如下两个值进去会出现什么结果呢?
8
10
显然10>8但是程序却不能正常输出.究其原因,主要是因为string的关系操作符会按照顺序比较,它才不管你那个字符串长.
解决此问题的办法最简单有,居然我们是要比较大小.干脆我们就直接把他利用atoi转化为int来处理.这总没问题吧.
我们在编码的时候经常出现将某一个字符串截取多少多少个字符.
比如字符串:"ysl袁孙良"我想截取前四个字符.我们就不能简单的使用CString::Left函数.因为"袁"这里有问题,在显示的时候就会以?来代替(即输出的是"ysl?")
其实,我们如果已知字符串都是中文或者都是英文,这个问题就比较简单.但是混合的话还是要一些技巧的.
这里我给出一个函数:
//将str字符串取出钱nMaxLen个字符.
void InterceptLenth(CString& str,int nMaxLen,CString& strOut)
{
int i= 0;
int last = 0;
//将首地址复制给s
char *s = str.GetBuffer(str.GetLength());
char *pre = s;
while(i<nMaxLen)
{
char *next = (char*)CharNext(s); //保存下一个字符
int n = strlen(pre)-strlen(next);
CString str1;
str1= str.Mid(last,n);
strOut += str1;
last += n;
s+=n;
pre = next;
i++;
}
}
关于菜单的一些比较容易出错的地方:
我们利用AppendMenu来为系统增加菜单.当我们需要动态操作这个菜单的时候,有时难免会使用清空菜单操作.
3. 我们的清空操作一般如下:
VoidClearMenu()
{
// 移除原有的菜单项
int subMenu1Count = m_Menu.GetMenuItemCount();
for(int i = 0; i >= subMenu1Count- 1; i++)
{
m_Menu.DeleteMenu(i, MF_BYPOSITION);
}
return;
}
这样做,表面上看起来是没有什么问题.但是我们没有注意到,当我们删除第一项的时候,整个菜单都会改变.即原来的1变成了0,原来的2变成了1.以此类推.所以我们应该使用下面的这种方式来删除.
Void ClearMenu()
{
// 移除原有的菜单项
int subMenu1Count = m_Menu.GetMenuItemCount();
for(int i = subMenu1Count - 1; i>= 0; i--)
{
m_Menu.DeleteMenu(i, MF_BYPOSITION);
}
return;
}
总结:当我们在使用循环的时候,大都是采用向前搜索方式和向后搜索方式都可以,但是就是某些时候,向前搜索的通用性会好很多.