我用的是d7
是这样的,两个memo里面有字符串
type
a=record
s:pchar;
x:pchar;
end;
b=record
s:string;
x:string;
end;
var
aa:array[0..10]of a;
bb:array[0..10]of b;
cc:arrar[0..30]of pchar;
..............for n:=0 to 9 do
begin
aa[n].s:=pchar(memo1.line[n]); aa[n].x:= pchar(memo2.line[n]);
bb[n].s:=pchar(memo1.line[n]); bb[n].s:=pchar(memo2.line[n]);
cc[n]:=pchar(memo1.line[n]); cc[n+10]:=pchar(memo2.line[n]);
end;
结果aa是混乱的数据,bb和cc是预期的结果。
aa中各pchar值没有变,但指向的内容变了
为什么?
是这样的,两个memo里面有字符串
type
a=record
s:pchar;
x:pchar;
end;
b=record
s:string;
x:string;
end;
var
aa:array[0..10]of a;
bb:array[0..10]of b;
cc:arrar[0..30]of pchar;
..............for n:=0 to 9 do
begin
aa[n].s:=pchar(memo1.line[n]); aa[n].x:= pchar(memo2.line[n]);
bb[n].s:=pchar(memo1.line[n]); bb[n].s:=pchar(memo2.line[n]);
cc[n]:=pchar(memo1.line[n]); cc[n+10]:=pchar(memo2.line[n]);
end;
结果aa是混乱的数据,bb和cc是预期的结果。
aa中各pchar值没有变,但指向的内容变了
为什么?
解决方案 »
- 如何将带文本格式的文字保存到数据库中?
- 只剩62分 在数据库表中字段Time定义为varchar(20),值的形式yyyy—mm-dd 现在小弟想把他转变为整型 yyyymmdd 并赋值给整型变量i 怎么实现
- 做过连锁配送的朋友,请帮我看看方案,如何解决异地数据交互?嫌分不够单独给!
- 关于查询的代码问题?
- Memo中根据特定字符定位!在线等.....
- 请高手帮忙,如何将三方控件的源码add到工程文件中??
- 急急急急急,在线请教
- 程序怎么样去实现共享文件夹!
- 这个程序是哪儿错了?请各位指出,谢谢!
- 如问如果在delphi中进行SOL的后台查询
- 请教高手dbgrid问题。。各位帮帮忙
- 用控件TREEVIEW 编写好目录树,如何编写相应的响应代码呀
aa中pchar的值和bb中相应位置的是一样的
但是……
StrPcopy(aa[n].s,Memo1.Lines)
s:pchar;
在结构体中声明s时,编译器为其分配了一个地址
而s:=PChar(Memo1.Lines[1])时
Delphi不是简单地将Memo1.Lines[1]中的字符串拼接到在结构体中刚刚申请的堆地址上,而是做了如下动作!
1.GetMem()//重新创建一块内存,长度为Length(Memo1.Lines[1])
2.s=@(Memo1.Lines[1])把刚分配的堆首址发给栈变量s
这时在结构体中声明的PChar的指向已不是刚刚分配内存的指向了结论:
要想避免这种情况,我们自然就想到把Memo1.Lines拼接到PChar后,而不用新创建一块内存单元!
能实现这种功能有几种方法:比如:Move\CopyMemory\StrpCopy等