• 升级d7的代码到2010以上版本注意事项(SetLength的参数就是字符长度,而不是字节长度,但Move函数要改)


    delphi2010是delphi所有版本的分水岭,其中2010—xe10.2之间版本上的代码都有比较好的兼容性,基本上都能直接进行编译,不需要过多修改,但d7距d2010跨度4个版本以上,新版本除了增加新功能函数外,对原有的vcl控件也进行了优化和增强,并且支持64位、跨平台开发、多语言、直接支持跟随系统风格样式,所以升级相对有些麻烦,但却有价值。

    RZ、FR、EHLIB 等常用控件都有跟随delphi推出了版本,d7的绝大部分代码也可以直接在d2010以上版本中进行编译,最需要处理的问题主要在新版本字符串类型方面的变化。

    1,PChar

    因为Delphi不支持无类型指针的算术运算,很多程序员使用 PChar来代替Pointer,即使指针指向目标并不是PAnsiChar。
     
    考虑如下代码:
     
    var 
       P:PChar;
       Buffer:Pointer;
    begin
       GetMem(Buffer,255);
       P:=Buffer;
       p^:=#1;
       Inc(P);
       p^:=#2;
       FreeMem(Buffer,255);
    end;
    在2010中PChar已经不再表示PAnsiChar而是表示PWideChar,如果依然这样写,运行时很可能会得到一个内存访问错误。因为每 次Inc(P),实际上指针向前移动了2字节,因为SizeOf(WideChar)=2,Inc(P)相当于 P:=P+SizeOf(WideChar)。
     
    解决方法是把PChar替换成PAnsiChar 
     
     
     
    2,Move FillChar CopyMemory
    这些函数依赖的是字节长度,往往我们直接使用Length(Str)来获取,这是行不通的。
     
    考虑如下代码:
     
    var
       P1,P2:String;
    begin
       P1:='test';
       SetLength(P2,Length(P1));
       Move(P1[1],P2[1],Length(P1));
    在2010中String默认映射到UnicodeString,单个字符是2字节,所以上文中P1实际占用了8字节内存,而传给Move函数的长 度只有4字节,最终结果是P2="te"。
     
    解决办法1:
     
    修改String为AnsiString,该方案虽然可行,但你的程序就享受不到Unicode待遇了。
     
    解决办法2:
     
    SetLength 函数不要修改,因为他的长度参数是字符长度,而不是字节长度。
     
    Move函数的最后一个参数 Length(P1) 修改成 Length(P1)*SizeOf(Char)。
     
    注意:不要偷懒使用万一老师说的ByteLength函数,该函数并没有For AnsiString的重载,编译器会 把参数隐式转化为UnicodeString然后,ByteLength函数计算UnicodeString的长度。例如:一旦你不小心传入了一个 AnsiString类型长度为4的字符串,函数会返回8,而不是你期望的长度4。 
     
     
    3,Key in ['a'..'z','B','C']
    这类代码最好替换成CharInSet(Key,['a'..'z','B','C']) 不然会当作AnsiChar处理。
     
     
    4,WideString
    代码中的所有WideString都考虑替换成String,现在 WideString只是为了与COM兼容而存在,且没有引用计数,性能低下。 
     
    https://user.qzone.qq.com/21968578/blog/1492132900
  • 相关阅读:
    (DP+二分查找) leetcode 300. Longest Increasing Subsequence, 673. Number of Longest Increasing Subsequence
    linux
    电脑突然找不到wifi 的解决方法
    (字典序) leetcode 316. Remove Duplicate letters
    vector insert()
    randrange
    blur、medianBlur、GaussianBlur
    clip
    choice
    randint
  • 原文地址:https://www.cnblogs.com/findumars/p/6711024.html
Copyright © 2020-2023  润新知