TPenStyleやTShapeTypeをStreamにするには?

解決


印刷屋  2007-06-15 18:40:41  No: 26691  IP: 192.*.*.*

度々お世話になります。

IntegerやStringの基本的な型のStreamは分かったんですが、TPenStyleやTBlushStyle、TShapeTypeなどは、どういう具合に書けばいいんでしょうか?
TColorだとIntegerにキャストすればいいというのは分かるんですが。

編集 削除
Basser  2007-06-15 19:11:09  No: 26692  IP: 192.*.*.*

Ord関数で順序値にします。

編集 削除
印刷屋  2007-06-18 12:10:11  No: 26693  IP: 192.*.*.*

Basserさん、ありがとうございます。

順序値とか集合型とかいろいろ調べてみたんですが、元に戻す方法が見あたらなかったのですいませんが、元に戻す方法も教えて頂けますか?

集合型もByte(集合型)にしたものの元に戻す方法がわかりません。

編集 削除
TS  2007-06-18 12:31:38  No: 26694  IP: 192.*.*.*

Ord(TPenStyle(5))でどうですか。

編集 削除
印刷屋  2007-06-18 13:17:37  No: 26695  IP: 192.*.*.*

これだと、TPenStyle等には代入できそうにないんですけど。

編集 削除
Basser  2007-06-18 13:54:59  No: 26696  IP: 192.*.*.*

元に戻すのは変換した順序値をその型でキャストするだけです。

集合型の場合は範囲 0〜255 を考えると要素数とそのByte配列でしょうか?
ただ、その基底となる順序型の要素数にもよりますが、私ならビット値で管理します。

編集 削除
Basser  2007-06-18 14:28:41  No: 26697  IP: 192.*.*.*

先程述べた集合型のビット管理の保存と読込の例です。

  // --------------------------------------------------------------
  // フォームのFont.Styleを整数値に変換
  // --------------------------------------------------------------
  procedure TForm1.btnFSSaveClick(Sender: TObject);
  var
    n: TFontStyle;
    Value: Byte; // TFontStyleの要素数が4個の為、Byte型を使用
  begin
    Value:= 0;
    for n:= Low(TFontStyle) to High(TFontStyle) do
      if n in Font.Style then Value:= Value or 1 shl Ord(n);

    Edit1.Text:= IntToStr(Value);
  end;

  // --------------------------------------------------------------
  // 整数値をフォームのFont.Styleに変換
  // --------------------------------------------------------------
  procedure TForm1.btnFSLoadClick(Sender: TObject);
  var
    n: TFontStyle;
    Value: Byte;
    FontStyle: TFontStyles;
  begin
    FontStyle:= [];
    Value    := StrToInt(Edit1.Text);

    for n:= Low(TFontStyle) to High(TFontStyle) do
      if Value and (1 shl Ord(n)) <> 0 then Include(FontStyle, n);

    Font.Style:= FontStyle;
  end;

編集 削除
TS  2007-06-18 15:56:55  No: 26698  IP: 192.*.*.*

>これだと、TPenStyle等には代入できそうにないんですけど。
代入するのはTPenStyle(5)だけです。
Ord(TPenStyle(5))は5に戻るよという意味です。
>元に戻すのは変換した順序値をその型でキャストするだけです。
type
  TPenStyle = (psSolid, psDash, psDot, psDashDot,
               psDashDotDot,psClear,psInsideFrame);
TPenStyle(5)=TPenStyle(psClear)
要するにpsClearは6番目(0から始まるので)
のTPenStyleだと云うことです。

編集 削除
TS  2007-06-18 17:19:04  No: 26699  IP: 192.*.*.*

集合と文字列の相互変換が中村さんのホームページにありました。
http://www.asahi-net.or.jp/~HA3T-NKMR/tips024.htm

編集 削除
印刷屋  2007-06-18 21:09:05  No: 26700  IP: 192.*.*.*

Basserさん、TSさん細かくありがとうございます。
なんとか思い通りの結果が得られました。

ただ、集合型についてはFontStyleのみだったので、
Integer型→Byte型→TFontStylesで代入することでとりあえず動くようなのでこれでいきます。
Basserさんのビット管理は僕にはちょっと難しいのでしばらく、眺めてみます。

編集 削除
TS  2007-06-18 22:00:12  No: 26701  IP: 192.*.*.*

1 shl Ord(n)  は  n=1 2 3 4...10
に対応して 2 4 8 16 32 64...1024  を作っていって
10000000 2
01000000 4
00100000 8

11100000 14
Value or  はその数字を加算しているん様ですね。

Low(TFontStyle) はpsSolidで0
High(TFontStyle)はpsInsideFrameで6

勉強になります。

編集 削除
TS  2007-06-19 06:54:59  No: 26702  IP: 192.*.*.*

訂正します。
2進数  10進数
10000000 1  最初に1を与えて
01000000 2  shl でnビットづつずらす 1の場合
00100000 4  同上  n=2の場合
01110000 14 これは n=1 n=2 n=3の番号を格納した場合の結果

編集 削除