在Delphi 2010中禁用大字符串

5

我是Delphi的新手,正在将一个非常老的Delphi项目迁移到Embarcadero RAD Studio 2010。我在使用字符串时遇到了问题。以下是代码:

ProgramaResultadosType = record
    Version: string;
    TituloPrincipal   : string;
    BloquesResultados : VectorBloquesResultadosType;
end;

FileOfProgramaResultadosType  = file of ProgramaResultadosType;

错误信息如下:

"E2155 类型 '%s' 需要终结 - 不允许在文件类型中"

我知道很多Delphi开发人员都会遇到这个错误,当你没有指定字符串大小时。

基本上,我想像RAD Studio旧版本一样停用Huge strings指令,但我找不到在2010版本中的选项。


2
你是否已经厌倦了使用Embarcadero建议E2155:Type'%s'需要终止-不允许在文件类型中(Delphi),而想要使用char数组代替? - RRUZ
1
D2010无法再“停用”大字符串,因为字符串类型已变为Unicode。 Unicode支持已深度嵌入,因此无法切换回任何旧的ANSI字符串类型。 您应该开始删除所有“文件”类型。它们真的已经过时了。 - Mad Hatter
1个回答

10

只需使用:

ProgramaResultadosType = record
    Version: shortstring;
    TituloPrincipal   : shortstring;
    BloquesResultados : VectorBloquesResultadosType;
end;

但需要注意以下几点:

  • 几乎每次调用RTL函数都会先将内容无形转换为新的 string 类型: 因此最好在读取完 shortstring 内容后,再使用显式的另一个 string 变量;
  • 在更新版本的Delphi(从Delphi 2009开始),string 是Unicode字符串:因此,当从 UnicodeString 写入到 shortstring(Ansi字符串)时,可能会丢失一些数据;
  • 如果您的应用程序非常旧(默认对齐在Delphi 4左右改变),则可能需要添加 ProgramaResultadosType = packed record

因此,您可能需要:

  • 使用像上面那样的结构来读取现有内容;
  • 使用新的、支持Unicode的范例进行编写(例如嵌入式数据库,如Midas、SQLite3或任何其他类型)。

在将现有应用程序转换为较新的Delphi Unicode版本时值得阅读:


@David 你怎么知道我有一颗松动的牙齿?感谢您的编辑 - 我总是犯这个错误,而不知道它... :) - Arnaud Bouchez
有一个助记符:choose 有两个 "o",你可以从中 选择,但 lose 只有一个,因为如果你 失去 1 个,你只剩下 1 个。 - Francesca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接