http://blog.csdn.net/span12/article/details/42522091

你只要记住 字符串使用变了。
VCL 下面所有的 char 改 ansichar

string 改 ansistring。

array of char改为

array of ansichar


wide 版本的不用变。
移动开发下,请使用 tencdong 和 tbytes 处理所有字符串问题。

 

delphi 升级到xe7后的一些个人经验(一)...慢慢更新中
原创 2015年01月08日 11:16:43 标签:delphi 629
一: 关于string;

xe7中string默认的是unicodestring,所以计算一些中英文的字符串长度会出现不同,

unicodestring中每个字符已2个字节存储,长度为2,即使是英文也会填充空格弥补.

ansistring中汉子长度为2,英文为1.

比如如下代码:

var

s: string;
i: integer;
begin
s:= edit1.Text;
//s:= '啊是的1a';{啊和是中间有空格}
label1.Caption:= s +'(sizeof)' + ':' + inttostr(sizeof(s));{4}
label2.Caption:= s +'(length)' + ':' + inttostr(length(s));{8}

end;

但如果现在是想得到他们长度为9怎么办?可以使用如下方法;

1: 引用AnsiStrings单元.

a: 引用AnsiStrings单元, 如果不引用该单元,即便编译不报错,实际上是用的还是Unicode版本的函数,会有隐式的转化。不信打开参数自动完成,看看IDE提示的类型是什么?天啊AnsiLowerCase参数竟然还是String,而不是AnsiString。看来Delphi2010太迫切的要抛弃Ansi字符串了,以至于你不引用AnsiStrings单元,所有Ansixxxx函数实际上还是Unicode版本。

b: 把s改为ansistring;

 

2:自己写了一个函数

function GetLen(str:string): integer;
var
i,k: integer;
begin
k:= 0;
for i := 1 to length(str) do
begin
if (ord(str[i])>128) then
begin
k := k+2;
end else
k:= k+1;
end;
result := k;
end;

 

二 Timage控件,现在已经支持GIF和PNG了,但JPEG还是需要引用JPEG单元.