度々お世話になります。
IntegerやStringの基本的な型のStreamは分かったんですが、TPenStyleやTBlushStyle、TShapeTypeなどは、どういう具合に書けばいいんでしょうか?
TColorだとIntegerにキャストすればいいというのは分かるんですが。
Ord関数で順序値にします。
Basserさん、ありがとうございます。
順序値とか集合型とかいろいろ調べてみたんですが、元に戻す方法が見あたらなかったのですいませんが、元に戻す方法も教えて頂けますか?
集合型もByte(集合型)にしたものの元に戻す方法がわかりません。
Ord(TPenStyle(5))でどうですか。
これだと、TPenStyle等には代入できそうにないんですけど。
元に戻すのは変換した順序値をその型でキャストするだけです。
集合型の場合は範囲 0〜255 を考えると要素数とそのByte配列でしょうか?
ただ、その基底となる順序型の要素数にもよりますが、私ならビット値で管理します。
先程述べた集合型のビット管理の保存と読込の例です。
// --------------------------------------------------------------
// フォームの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;
>これだと、TPenStyle等には代入できそうにないんですけど。
代入するのはTPenStyle(5)だけです。
Ord(TPenStyle(5))は5に戻るよという意味です。
>元に戻すのは変換した順序値をその型でキャストするだけです。
type
TPenStyle = (psSolid, psDash, psDot, psDashDot,
psDashDotDot,psClear,psInsideFrame);
TPenStyle(5)=TPenStyle(psClear)
要するにpsClearは6番目(0から始まるので)
のTPenStyleだと云うことです。
集合と文字列の相互変換が中村さんのホームページにありました。
http://www.asahi-net.or.jp/~HA3T-NKMR/tips024.htm
Basserさん、TSさん細かくありがとうございます。
なんとか思い通りの結果が得られました。
ただ、集合型についてはFontStyleのみだったので、
Integer型→Byte型→TFontStylesで代入することでとりあえず動くようなのでこれでいきます。
Basserさんのビット管理は僕にはちょっと難しいのでしばらく、眺めてみます。
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
勉強になります。
訂正します。
2進数 10進数
10000000 1 最初に1を与えて
01000000 2 shl でnビットづつずらす 1の場合
00100000 4 同上 n=2の場合
01110000 14 これは n=1 n=2 n=3の番号を格納した場合の結果
ツイート | ![]() |