TPenStyleやTShapeTypeをStreamにするには?

解決


印刷屋  2007-06-16 03:40:41  No: 26691

度々お世話になります。

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


Basser  2007-06-16 04:11:09  No: 26692

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


印刷屋  2007-06-18 21:10:11  No: 26693

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

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

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


TS  2007-06-18 21:31:38  No: 26694

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


印刷屋  2007-06-18 22:17:37  No: 26695

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


Basser  2007-06-18 22:54:59  No: 26696

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

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


Basser  2007-06-18 23:28:41  No: 26697

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

  // --------------------------------------------------------------
  // フォームの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-19 00:56:55  No: 26698

>これだと、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-19 02:19:04  No: 26699

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


印刷屋  2007-06-19 06:09:05  No: 26700

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

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


TS  2007-06-19 07:00:12  No: 26701

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 15:54:59  No: 26702

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加