【问题标题】:Delphi String / Array of StringsDelphi 字符串/字符串数组
【发布时间】:2011-10-13 08:49:24
【问题描述】:

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

【问题讨论】:

  • 显示你得到的代码和错误。
  • 我猜这些不是字符串数组,而是像这样声明的短字符串:s: string[10] - 但向我们展示一些代码都是一样的
  • ..Is there an easy way to solve this problem (without changing every variable)。与字符串和旧的delphi应用程序有关的主要问题是delphi 2009中添加的unicode支持,因此您必须重点关注这一点,也不可能给您easy way在不知道实际代码的情况下将旧应用程序升级到 Unicode(新版本的 Delphi)。现在处理转换为 Unicode 的最佳方法是了解如何在 Delphi 中实现 Unicode 支持,一个极好的资源是 Delphi and Unicode Whitepaper edn.embarcadero.com/article/38980

标签: delphi


【解决方案1】:

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

长答案

Delphi 1 只有一种类型的字符串。
最大长度为 255 个字符和声明的最大长度的老式 ShortString。

它看起来和感觉就像一个 char 数组,但它有一个前导长度字节。

var
  ShortString: string[100]; 

在 Delphi 中引入了 2 个长字符串(又名 AnsiString),它们替换了短字符串。它们没有固定长度,而是动态分配并根据需要自动增长和收缩。
它们会自动创建和销毁。

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
不过,我建议您重构代码以始终使用长字符串(阅读:AnsiString)。

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

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

(*) 过于简单化了

【讨论】:

    猜你喜欢
    • 2022-01-08
    • 2013-04-15
    • 1970-01-01
    • 2014-10-24
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多