如何解决Delphi XE中大型枚举类型的RTTI大小问题?

4

当我尝试在Delphi XE中编译一个包含5000+个值的枚举类型的单元时,出现了以下错误:

[DCC Error] uCities.pas(5834): E2575 RTTI for 'TCity' is too large; reduce scope with $RTTI or reduce type size

我该如何解决这个问题?

有什么方法可以解决这个问题吗?

{$WEAKLINKRTTI ON}
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}

没有起到帮助作用。

提前感谢。


我目前手头没有 Delphi XE,但我成功地在 Delphi 2010 中编译了一个包含 10000 个值的枚举。 - kludg
2
这看起来像是你在硬编码本可以成为相当可观的查找表(数据库)的内容。 - Warren P
4个回答

6
你正在使用枚举列出城市?这很新颖。
最好使用查找数据结构而不是枚举。
编辑:例如,你可以使用TClientDataset或者TDictionary(来自Generics.Collections单元),如果你需要进行任何查找操作(从TCity值中获取城市的字符串名称)。
并且帮助这里的人们帮助你:对于那些无法阅读葡萄牙语的人来说,TCidade没有任何意义,但是使用TCity可以更好地了解你的问题。

5

一个拥有5000多个值的枚举类型不是你手写的枚举。而且现在有5000个值的枚举明天就会变成10000个。

你应该修改生成枚举的代码,生成简单的常量代替枚举。使用整数(或小整数)作为实际类型。这样应该可以彻底解决问题。


2
他正在使用枚举列出城市。该枚举的名称翻译成英文是 TCity - Fabricio Araujo

1
根据Mason Wheeler的建议,重构该类以减少类型大小。将其拆分为几个较小的类。
来源:Embarcadero论坛 编辑:仔细阅读后,这可能有些棘手,因为您正在处理枚举。一个选项可能是将枚举值转换为整数常量(使用Const关键字),并更改过程以使用整数。

2
哇,现在我被引用为运行时类型信息生成方面的权威了? - Mason Wheeler
1
@Mason - 这是一个很好的回答。:) 无论如何,还剩下多少位 Delphi RTTI 专家呢? - TrueWill

0

不讨论枚举中是否有5k个条目是合理的 - 快速解决方法是在第一个枚举项中添加=1。

TCharsetChar= ( csSPACE=1, csEXCLAMATION_MARK, csQUOTATION_MARK, ...

有时为了节省时间或提高性能,打破规则是值得的。所以这里就是一个例子。


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