如果不引用该单元

时间:2022-05-01 05:51:01

你只要记住 字符串使用变了。
VCL 下面所有的 char 改 ansichar string 改 ansistring。
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单元.