WriteComponentでTPoint型プロパティを保存するには?

解決


デル太  2006-04-04 22:40:01  No: 20847  IP: 192.*.*.*

オブジェクトをWriteComponentで保存すると、TPoint型のプロパティは保存されませんでした。
X座標とY座標を別に持って、Integer型のプロパティにすると保存できます。

ヘルプを見ても、この違いには触れたところを見つけられませんでした。
保存されるプロパティとされないプロパティにはどのような違いがあるのでしょう・・?
ご存知の方がいらっしゃいましたら、どうぞ、教えていただけますか?
または、どこを参照するとよいか教えてください。

また、何か方法を取ればWriteComponentでTPoint型を保存することも可能になるでしょうか?

いつもありがとうございます。
今回もよろしくお願いします。

編集 削除
えーと  2006-04-05 00:44:02  No: 20848  IP: 192.*.*.*

D6 だとヘルプで「格納指定子」をみると分かりますね。

編集 削除
えーと  2006-04-05 00:55:50  No: 20849  IP: 192.*.*.*

すみません、「格納指定子」じゃなくて

「パブリッシュメンバー」です。以下ヘルプより引用

published を指定できるプロパティの中には,ストリーミングシステムによる
サポートが完全ではないものがあります。レコード型のプロパティ,published 
の指定が可能なすべての型の配列プロパティ,無名の値を含む列挙型の
プロパティなどがそうです。このようなプロパティに published を指定した
場合,オブジェクトインスペクタはプロパティを正しく表示できず,
ストリーミング処理でディスクにオブジェクトが書き込まれる際に
プロパティの値が保護されません。

編集 削除
デル太  2006-04-05 19:38:43  No: 20850  IP: 192.*.*.*

えーとさん、いつもありがとうございます。
昨夜は0時ごろまでで退出してしまい、回答が遅くなり失礼してしまいました。
今日も朝からアクセスできずこの時間になってしまいました。ごめんなさい。

ご指摘の文中、ストリーミングシステムによるサポートが完全でないものに「レコード型」が含まれていますね。
そして、TPointはレコード型ですから、サポートされないんですね。
了解できました。
今回は、Integerに変更して対処しようと思います。

他に、published指定できると説明され、かつ、サポートが不完全と指摘されていない型にすれば保存できると考えて大丈夫でしょうか?
例えば、クラス型にすれば、保存できる・・と読み取ってOKですよね?

というのは、実はヘルプの説明が次の構造になっているので正確に把握しにくく、若干不安を感じています。

  published指定できるもの:                          :A,B,C  ←ほんとはここにDが必要ですよね?
  published指定できるがストリーミングサポートが不完全:Dなど      ←しかも「など」なのでD以外もある・・?

結論としては、

  プログラマが試してから実装しなさい

ということなのかもしれませんが・・。

編集 削除
デル太  2006-04-05 20:30:22  No: 20851  IP: 192.*.*.*

直前の発言で「ヘルプでpublished指定できると説明され」の部分は実物をみないと分かりにくいと気づきました。以下に引用します。

published が指定できるプロパティは特定のデータ型に限られます。順序型,文字列型,クラス型,インターフェース型,およびメソッドポインタ型は published が指定できます。したがって,集合型は,基本型の上限と下限が 0 〜 31 の範囲の順序値(バイト,ワード,ダブルワードのいずれかに収まる集合)であれば published が指定できます。実数型は,Real48 を除いて published が指定できます。配列型のプロパティ(以下に説明する配列プロパティとは異なる)には published を指定することはできません。

編集 削除
デル太  2006-04-07 00:06:46  No: 20852  IP: 192.*.*.*

他のスレッドで指導していただき、

□インデックス指定子をこのように使っても問題ないでしょうか?
https://www.petitmonte.com/bbs/answers?question_id=3827

次のように実装できました。

-----
TMyClass = class
private
  FStartX, FStartY: Integer; //始点
  procedure SetStartPoint(Index, Value: Integer); //始点設定
published
  property StartX: Integer index 0 read FStartX write SetStartPoint;
  property StartY: Integer index 1 read FStartY write SetStartPoint;

procedure TLine.SetStartPoint(Index, Value: Integer);
begin
  Case Index of
    0: FStartX := Value;
    1: FStartY := Value;
  end;
end;
-----

クラス型でも取り掛かってみたんですが、生成と破棄はどうするのか?と新たな疑問も出てきてしまい、時間の余裕もなく保存実験済みのIntegerで実装しました。

おかげさまで「保存できないが、Integerで保存すればOK」という形で決着できました。ありがとうございます。
保存・復元については、もとのコードをそのまま利用できました。

編集 削除