2

次の型宣言があるとします。

  TMyEnum = (onehundred,twohundred,threehundred);
  TMyEnum2 = (Aonehundred = 100 , Atwohundred = 200 , Athreehundred = 300);

  TMyComponent = class(TComponent)
  private
    FMyEnum: TMyEnum;
    FMyEnum2: TMyEnum2;
  published
    property MyEnum: TMyEnum read FMyEnum write FMyEnum;
    property MyEnum2: TMyEnum2 read FMyEnum2 write FMyEnum2;
  end;

TStream.WriteComponent を使用しても、MyEnum2 はストリーミングされません。その理由を知っている人はいますか?これを修正できる場合は?

4

2 に答える 2

5

残念ながら、これはストリーミングシステムの制限です。ドキュメントには(私の強調)と書かれています:

一部のプロパティは公開可能ですが、ストリーミングシステムで完全にはサポートされていません。これらには、レコードタイプのプロパティ、すべての公開可能なタイプの配列プロパティ、および匿名値を含む列挙型のプロパティが含まれます。この種のプロパティを公開すると、オブジェクトインスペクターはそれを正しく表示しません。また、オブジェクトがディスクにストリーミングされるときにプロパティの値が保持されません。

これを簡単に回避することはできず、独自のカスタムストリーミングを提供する必要があります。

于 2012-07-04T15:38:03.447 に答える
2

Davidが言うように、TMyEnum2匿名の値があり、それがストリーミングメカニズムが型を適切に処理できない理由です。実際に独自のカスタムストリーミングを提供することも、列挙型を省略して(型安全性を少しあきらめる)、Integer定数を使用することもできます。

type
  TMyEnum = (onehundred, twohundred, threehundred);
  TMyEnum2 = type Integer;

const
  Aonehundred = 100; 
  Atwohundred = 200; 
  Athreehundred = 300;

TMyEnum2これで、(名前を変更した後)好きなように使用してストリーミングできます。

于 2012-07-04T15:51:36.830 に答える