写了下面的代码 :
- var
- i,msg:integer;
- charArray:array[0..50] of Char;
- begin
- for i := 0 to Listbox1.Items.Count - 1 do
- begin
- StrPcopy(charArray,'是否写入卡号:'+ListBox1.Items[i]+' ? 按“否”进行下一个,按“取消”退出。');// 在执行这个函数前i的值是0,执行完之后变成41889,有时会变成其它数。
- msg := Application.MessageBox(charArray,'询问',MB_ICONQUESTION+MB_YesNoCancel);
- if msg = idyes then
- //................
- end;
- end;
- 这个问题一时让我莫不着头脑,i虽然调用了,但没有赋值啊,怎么会变了呢?
- 后来加了一个s:string,让s等于那一串提示内容:
- s:='是否写入卡号:'+ListBox1.Items[i]+' ? 按“否”进行下一个,按“取消”退出。';
- StrPcopy(CharArray,s);
- msg := Application.MessageBox(charArray,'询问',MB_ICONQUESTION+MB_YesNoCancel);
- 这下正常了,问题肯定是出在StrPcopy函数上,这是没有疑问了。但究竟是为什么呢?
- 我数了数提示字符串的长度,只数汉字就已经超过25个了,肯定是长度不够,于是我把chararray的长度调到100,再试之后,终于成功了~ 可是,还是没有找到问题的根源在哪儿。
- 即使chararray的长度不够,那也是报错或者是别的什么,怎么会影响到i呢?于是我查看了一下strpcopy的语法:
- Copies an AnsiString (long string) to a null-terminated string.
- Delphi syntax:
- function StrPCopy(Dest: PChar; const Source: string): PChar;
- Description
- StrPCopy copies Source into a null-terminated string Dest. It returns a pointer to Dest.
- StrPCopy does not perform any length checking.
- The destination buffer must have room for at least Length(Source)+1 characters.
- 但却仍然一无所获,于是我发挥自己的想象力,如果chararray长度不够,系统没有提示错误,那么多出来的那一部分到哪儿去了呢?会不会写到了I的存储区域了呢?
- 限于水平,目前我还没有什么好办法去证明这个设想,记录到CSDNblog上继续关注。告诫自己,以后一定要把内存给分配够了。