2011-10-13 33 views
2

我有一个旧的程序在Delphi 1(或2,我不知道)编程,我想建立它的64位版本(我使用Delphi XE2)。现在的问题是,在源代码中,一方面是字符串和其他字符串数组(我想限制字符串长度)。 由于不兼容的类型,编译时会出现很多错误。 最重要的是有处理这两种类型的程序。 有没有简单的方法来解决这个问题(不改变每个变量)?德尔菲弦/字符串数组

+5

显示你的代码和错误。 –

+0

我猜这些不是数组的字符串,而是像这样声明的短字符串:'s:string [10]' - 但向我们展示一些代码全部相同 –

+2

'..有没有简单的方法来解决这个问题而不会改变每个变量)。与字符串和旧的delphi应用程序相关的主要问题是在delphi 2009中添加了unicode支持,所以你必须关注这一点,也不可能给你一个简单的方法来升级旧的在不知道实际代码的情况下应用于Unicode(新版本的Delphi)。现在,处理转换为Unicode的最佳方式是了解如何在Delphi中实现Unicode支持,一个很好的资源是“Delphi和Unicode”白皮书http://edn.embarcadero.com/article/38980 – RRUZ

回答

3

简短的回答
搜索和替换: string =>: ansistring
确保您使用length(astring)setLength(astring),而不是操纵string[0]

龙答案

Delphi 1中只有一个字符串类型。
最大长度为255个字符并声明最大长度的old-skool ShortString。

它看起来和感觉像一个char数组,但它有一个前导长度字节。在Delphi 2个longstrings(又名AnsiString类型)引入

var 
    ShortString: string[100]; 

,这些取代ShortString短。它们没有固定长度,而是动态分配,并根据需要自动增长和缩小。
它们被自动创建并销毁。

var 
    Longstring: string; //AnsiString, can have any length up to 2GB. 

在Delphi 2009中引入了Unicode。
这改变了长字符串,因为现在每个char no langer占用1个字节,但占用2个字节(*)。 此外,您可以指定一个字符集为AnsiString,而新的Unicode长字符串使用UTF-16。

你需要做什么取决于你的需要:

如果你只是想旧代码与以前一样工作,你不关心,支持所有的多语种东西的Unicode支持,你将需要全部更换您的string关键字与AnsiString(适用于所有长串的字符串)。
如果您有Delphi 1代码,则可以将string重命名为ShortString
虽然我建议您重构代码以始终使用longstrings(阅读:AnsiString)。

Delphi会自动把这一功能(Unicode字符串)所有的返回值被翻译成AnsiStrings,反之亦然的UnicodeStrings,然而,这可能包括数据丢失,如果您的用户在编辑框中,你AnsiString类型不能存储输入符号。
此外,所有的翻译需要一点时间(我怀疑你会注意到这一点虽然)。

在德尔福1到德尔福2007年这个问题并不存在,因为控件不允许输入Unicode字符。

(*)过于简单化