2011-07-15 6 views
4

私は、Delphi XEで5000の+値Delphi XEで大きなEnum型のRTTIサイズの問題を解決するにはどうすればよいですか?

[DCCのエラー] uCities.pas(5834)に列挙型でユニットをコンパイルしようとすると、私はこのエラーを取得:「TCity」のE2575 RTTIが大きすぎます。 $ RTTIで範囲を縮小するか、型サイズを小さくする

どうすればこの問題を解決できますか?

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

よう

物事は助けにはなりませんでした。メイソンウィーラーパー事前

+0

私は現在Delphi XEを手にしていませんが、Delphi 2010で10000値の列挙を正常にコンパイルしました。 – kludg

+2

かなりルックアップテーブル(データベース)をハードコーディングしているようです。 –

答えて

1

おかげで、タイプのサイズを小さくするために、クラスをリファクタリング。いくつか小さなものに分解してください。

出典:Embarcadero forums

編集:あなたが列挙型を扱っているので、近い読書では、これは難しいかもしれません。 1つのオプションは、enum値を整数定数(Constキーワード)に変換し、整数を使用するようにプロシージャを変更することです。

+2

うわー、私はRTの権威として引用されているTIの世代は今ですか? –

+1

@Mason - 良い答えでした。 :)とにかく、何人のDelphi RTTI専門家が残っていますか? – TrueWill

5

5000以上の値を持つ列挙型は、手作業で書いた列挙型ではありません。そして今5kの値を持つ列挙型は明日10kを持つでしょう。

単純な定数を生成するためにenumを生成したコードを変更する必要があります。実際の型はInteger(またはSmallint)を使用します。それは良いためにそれを修正する必要があります。

+2

彼はEnumを使って都市をリストしています。英語に翻訳されたenumの名前は 'TCity'です。 –

6

enumを使用して都市をリストしていますか?それは新しいものです。

ルックアップデータ構造を列挙型よりも使用する方が良いです。

EDIT:たとえばTClientDatasetを使用するか、または任意の種類の参照(TCity値から都市の文字列名を取得する)を行う場合は、TDictionary(Generics.Collections単位)を使用できます。

そして、ここの人々はあなたを助けるために役立つ:TCidadeはポルトガル語を読むことができませんが、TCity人とあなたの問題が何であるかについての理解を得ることができるものには何の意味も持たないであろう。

+0

完了、アドバイスをいただきありがとうございます。 – Haruki

0

列挙型の5kエントリが正当化されているかどうか議論しないで、簡単な修正は最初の列挙型アイテムに= 1を追加することです。

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

は、時にはルールを破るために価値がある - 時間の節約、またはパフォーマンスのためにそうここにあなたがいる

関連する問題