sun2000: string类型是一个二义类型,在Delphi中如果在默认的编译器开关指示下({$H+}),string类型等价于AnsiString,这是一个由编译器动态从堆中分配内存并自动管理的且和char*内存布局兼容的长字串类型,能多长?2G,而不是255。相反,由于历史原因,以前也存在过string类型,即所谓的短字串,ShortString。他的内存布局和C中常见的char*是不同的,它的首元素字节为长度(因此其最大长度为0xFF),后面才是字串内容。Ary: 简单的使用内存拷贝技术即可以完成你的第一个问题:procedure Test; var a: array [0..1023] of char; s: string; begin CopyMemory(@a,PChar(s),Length(s)+1); // plus 1 because the null-terminal ShowMessage(a); end;当然相反的过程就不必费劲了,s:=a就成了。
我写过一个函数去做这个事情 procedure strtoarr(s:string;var a: array of char); var p:pchar; I,leng:integer; begin p:=pchar(s); leng:=length(s); for I := 0 to (leng-1) do begin a[i]:=p^; inc(p); end; end;
for i:=0 to length(string)-1 do begin
...
...
end;
2.字符型字段长度不能超过255,不过可以用别的类型,如MEMO
好象不可以吧。
第二个问题同第一个问题本质上差不多,亦出现此类问题!换成别的数据库是没问题,但是可呢出现更烦人的问题——如果SQL语句中包含MEMO字段,那很不幸,你的查询出的记录条数有问题,是-1条!我只在ACCESS数据库下试过,估计SALSERVER下难逃厄运!
以上两个问题估计均是BORLAND系列开发工具的BUG,不过没有在ORACLE、SYBASE数据库下试过有没有此类问题!烦请各位高手提供资料!
var
a: array [0..1023] of char;
s: string;
begin
CopyMemory(@a,PChar(s),Length(s)+1); // plus 1 because the null-terminal
ShowMessage(a);
end;当然相反的过程就不必费劲了,s:=a就成了。
var p:pchar;
I,leng:integer;
begin
p:=pchar(s);
leng:=length(s);
for I := 0 to (leng-1) do
begin
a[i]:=p^;
inc(p);
end;
end;