Delphi字符串/字符串数组

时间:2011-10-13 08:49:24

标签: delphi

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

1 个答案:

答案 0 :(得分:3)

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

答案很长

Delphi 1只有一种字符串 old-skool ShortString,最大长度为255个字符,声明的最大长度。

它的外观和感觉就像一个char数组,但它有一个前导长度字节。

var
  ShortString: string[100]; 

在Delphi 2中引入了longstrings(又名AnsiString),它们取代了shorttring。它们没有固定的长度,而是动态分配,并根据需要自动增长和缩小 它们会自动创建和销毁。

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

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

您需要做什么取决于您的需求:

如果您只是希望旧代码像以前一样工作,并且您不关心支持Unicode支持的所有多语言内容,则需要将所有string个关键字替换为AnsiString(对于所有字符串都是longstrings) 如果您有Delphi 1代码,则可以将string重命名为ShortString 我建议您重构代码以始终使用longstrings(读取:AnsiString)。

Delphi会自动转换所有返回函数值(Unicode字符串)的UnicodeStrings转换为AnsiStrings,反之亦然,但如果用户在AnsiString无法存储的编辑框中输入符号,则可能包括丢失数据。 /> 所有翻译都需要一些时间(我怀疑你会注意到这一点)。

在Delphi 1到Delphi 2007中,此问题不存在,因为控件不允许输入Unicode字符。

(*)粗略过度简化

相关问题