delphi7升级到delphi delphi xedelphi xe2总结Word文档格式.docx

上传人:b****4 文档编号:8184864 上传时间:2023-05-10 格式:DOCX 页数:9 大小:17.86KB
下载 相关 举报
delphi7升级到delphi delphi xedelphi xe2总结Word文档格式.docx_第1页
第1页 / 共9页
delphi7升级到delphi delphi xedelphi xe2总结Word文档格式.docx_第2页
第2页 / 共9页
delphi7升级到delphi delphi xedelphi xe2总结Word文档格式.docx_第3页
第3页 / 共9页
delphi7升级到delphi delphi xedelphi xe2总结Word文档格式.docx_第4页
第4页 / 共9页
delphi7升级到delphi delphi xedelphi xe2总结Word文档格式.docx_第5页
第5页 / 共9页
delphi7升级到delphi delphi xedelphi xe2总结Word文档格式.docx_第6页
第6页 / 共9页
delphi7升级到delphi delphi xedelphi xe2总结Word文档格式.docx_第7页
第7页 / 共9页
delphi7升级到delphi delphi xedelphi xe2总结Word文档格式.docx_第8页
第8页 / 共9页
delphi7升级到delphi delphi xedelphi xe2总结Word文档格式.docx_第9页
第9页 / 共9页
亲,该文档总共9页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

delphi7升级到delphi delphi xedelphi xe2总结Word文档格式.docx

《delphi7升级到delphi delphi xedelphi xe2总结Word文档格式.docx》由会员分享,可在线阅读,更多相关《delphi7升级到delphi delphi xedelphi xe2总结Word文档格式.docx(9页珍藏版)》请在冰点文库上搜索。

delphi7升级到delphi delphi xedelphi xe2总结Word文档格式.docx

FreeMem(Buffer,255);

end;

在2010中PChar已经不再表示PAnsiChar而是表示PWideChar,如果依然这样写,运行时很可能会得到一个内存访问错误。

因为每次Inc(P),实际上指针向前移动了2字节,因为SizeOf(WideChar)=2,Inc(P)相当于P:

=P+SizeOf(WideChar)。

解决方法是把PChar替换成PAnsiChar2,MoveFillCharCopyMemory

这些函数依赖的是字节长度,往往我们直接使用Length(Str)来获取,这是行不通的。

P1,P2:

String;

P1:

='

test'

;

SetLength(P2,Length(P1));

Move(P1[1],P2[1],Length(P1));

end

在2010中String默认映射到UnicodeString,单个字符是2字节,所以上文中P1实际占用了8字节内存,而传给Move函数的长度只有4字节,最终结果是P2="

te"

解决办法1:

修改String为AnsiString,该方案虽然可行,但你的程序就享受不到Unicode待遇了。

解决办法2:

SetLength函数不要修改,因为他的长度参数是字符长度,而不是字节长度。

Move函数的最后一个参数Length(P1)修改成Length(P1)*SizeOf(Char)。

注意:

不要偷懒使用万一老师说的ByteLength函数,该函数并没有ForAnsiString的重载,编译器会把参数隐式转化为UnicodeString然后,ByteLength函数计算UnicodeString的长度。

例如:

一旦你不小心传入了一个AnsiString类型长度为4的字符串,函数会返回8,而不是你期望的长度4。

3,Keyin['

a'

..'

z'

'

B'

C'

]

这类代码最好替换成CharInSet(Key,['

])不然会当作AnsiChar处理。

4,WideString

代码中的所有WideString都考虑替换成String,现在WideString只是为了与COM兼容而存在,且没有引用计数,性能低下。

5,Tnt控件

如果你的工程使用了Tnt控件或以前的WideTextPosWideStringReplace之类的东西都替换成标准的吧,不用曲线救国了。

---------经过修改,可以在Delphi2010下运作的第三方组件--------------

 

1,PNGDelphi

2,EmbeddedWB

3,SynEdit的语法高亮组件unihighlighter

4,JEDIWin32APIHeader这些组件现在可以在Delphi2010下运作了。

6,引用AnsiStrings单元

如果你有必要使用AnsiUpperCaseAnsiLowerCaseAnsiCompareStr之类的函数,一定要引用AnsiStrings单元。

如果你不引用该单元,即便编译不报错,你实际上是用的还是Unicode版本的函数,会有隐式的转化。

不信你打开参数自动完成,看看IDE提示给你的类型是什么?

天啊AnsiLowerCase参数竟然还是String,而不是AnsiString。

看来Delphi2010太迫切的要抛弃Ansi字符串了,以至于你不引用AnsiStrings单元,所有Ansixxxx函数实际上还是Unicode版本。

7,AnsiCopyAnsiPosAnsiDelete

不要用AnsiCopyAnsiPosAnsiDelete,因为CopyPosDelete三个函数已经有了ForAnsi的重载。

8,把Char转化为小写用什么?

答案:

试试看Character单元的新函数ToUpperToLower。

以前我都是用System里面的UpCase函数,现在依然可用不过却找不到LowCaseDownCase之类的函数,困扰我好久好久。

索性全使用Character单元提供的新函数吧。

9,编译期警告:

[DCCWarning]Unit1.pas(31):

W1057Implicitstringcastfrom'

AnsiString'

to'

string'

如果你的代码中包含了两种字符串(Unicode、Ansi)之间进行隐式转化的时候就会出现该提示。

如下代码就会触发该警告:

varUnicode:

Ansi:

AnsiString;

beginAnsi:

test..'

Unicode:

=Ansi;

把旧版本的Delphi项目升级到2010,我通常都是借助编译警告来快速寻找需要改动的部分。

通常你可以把赋值双方都声明为String(默认影射到UnicodeString),就可以避免该警告。

但如果你确定必须在此处保留Ansi并进行转化的时候,建议你显式的转化他们(例如:

Unicode:

=String(Ansi);

),这样可以避免该警告,方便你在升级过程中继续寻找其他需要修改的地方。

10,ReadlnWriteln写入文件时候要注意

如果你传给Writeln一个AnsiString,那么它也会在文件中写入AnsiString,那么你读取得时候就必须传给Readln一个AnsiString的类型,否则就是乱码。

例如旧工程的配置文件是Ansi的,而你已经把相关读取配置的代码升级为支持Unicode,那么运行工程前你首先要用记事本之类的工具把配置文件另存为成Unicode编码。

当然你还要注意跳过Unicode文件头的两个字节FE

FF。

11,别再用String来操作二进制数据了

一定要记住String只是字符串,不要把它当作缓冲区、内存流使用。

我的项目中,有很多地方是使用字符串来处理二进制数据,导致在本次升级中颇为费脑。

如果当时用TBytes或TStream就好了。

反面教材:

varInt1,Int2,Int3,Int4:

Integer;

Buf:

beginSetLength(Buf,12);

Move(Int1,Buf[1],SizeOf(Integer));

Move(Int1,Buf[5],SizeOf(Integer));

Move(Int1,Buf[9],SizeOf(Integer));

=Buf+'

前面有3个Integer。

'

12,还是PChar

注意在2010中是这样的:

PChar=PointertoaWideChararray;

PAnsiChar=PointertoaAnsiChararray;

如果你还像是在Delphi7中那样:

PChar(AnsiString)那后果过是很严重的。

一段转换例子

D7

unitReCode;

interface

uses

Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,

Dialogs;

FunctionJiaMi(Src:

Key:

String):

FunctionJieMi(Src:

implementation

var

KeyLen:

KeyPos:

offset:

dest:

SrcPos:

SrcAsc:

Range:

begin

KeyLen:

=Length(Key);

KeyPos:

=0;

Range:

=1;

Randomize;

offset:

=Random(Range);

dest:

=format('

%1.2x'

[offset]);

forSrcPos:

=1toLength(Src)do

begin

SrcAsc:

=(Ord(Src[SrcPos])+offset)MOD255;

ifKeyPos&

lt;

KeyLenthenKeyPos:

=KeyPos+1elseKeyPos:

=SrcAscxorOrd(Key[KeyPos]);

=dest+format('

[SrcAsc]);

=SrcAsc;

end;

Result:

=Dest;

//解密函数

FunctionJieMi(Src:

TmpSrcAsc:

ifKeyLen=0thenkey:

starlin'

SrcPos:

=StrToInt('

$'

+copy(src,1,2));

=3;

repeat

try

+copy(src,SrcPos,2));

except

$00'

);

KeyLenThenKeyPos:

=KeyPos+1elseKeyPos:

=1;

ifTmpSrcAsc&

=offsetthen

=255+TmpSrcAsc-offset

else

=TmpSrcAsc-offset;

=dest+chr(TmpSrcAsc);

=srcAsc;

=SrcPos+2;

untilSrcPos&

gt;

=Length(Src);

=Copy(Result,1,Length(Result)-1);

end.XE5unitReCode;

Dialogs,AnsiStrings;

IntTemp:

integer;

SrcAnsi:

PAnsiChar;

=PAnsiChar(AnsiString(Src));

=Length(SrcAnsi);

=1toIntTempdo

=(Ord(SrcAnsi[SrcPos-1])+offset)MOD255;

IntTemp,i:

ByteArray:

arrayofByte;

=Length(Src)div2;

setlength(ByteArray,IntTemp);

i:

ByteArray[i]:

=TmpSrcAsc;

=i+1;

CopyMemory(@SrcAnsi[0],@ByteArray[0],IntTemp);

=string(AnsiStrings.strpas(SrcAnsi));

end.

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 农学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2