|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"一つの変数で複数のBooleanを保持する例"
一つのInteger(4バイトの変数)で複数(この場合32個)のBooleanを
保持する例。
Button4をクリックすると4 と 8が表示されます。つまり
つまりT32BoolSetはInteger/Cardinalと同じ4バイト長。Integer/Cardinalにキ
ャストできます。
例えば3桁目がTrueなら、2^3=8 がInteger/Cardinalにキャストしたときの値に
なります。
(性質から考えるとCardinalにキャストするのが妥当ですね。)
ちなみに、これは例えばTSearchRec.Attrと同じ考え方です。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,
StdCtrls;
type
T32Bools = 0..31;
T32BoolSet= set of T32Bools;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private 宣言 }
{この例で使うintegerにキャスト可能な
32個のBooleanを保持する変数}
x:T32BoolSet;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
//指定桁のTrue/Falseを調べる関数
function isTrue(T32BoolSet:T32BoolSet;Digit:T32Bools):Boolean;
begin
result:=Digit in T32BoolSet;
end;
//指定桁のTrue/Falseをセットする手続き
procedure setBool(var T32BoolSet:T32BoolSet;Digit:T32Bools;TF:Boolean);
begin
if TF then Include(T32BoolSet,Digit) else Exclude(T32BoolSet,Digit);
end;
{☆以下使用例 }
//3桁目をTrueにセット
procedure TForm1.Button1Click(Sender: TObject);
begin
setBool(x,3,True);
end;
//3桁目のTrue/Falseをチェック
procedure TForm1.Button2Click(Sender: TObject);
begin
if isTrue(x,3) then showmessage('3 はTrue') else showmessage('3は
False');
end;
//3桁目をFalseにセット
procedure TForm1.Button3Click(Sender: TObject);
begin
setBool(x,3,False);
end;
//変数の構造をチェックするためのもの、、
procedure TForm1.Button4Click(Sender: TObject);
begin
ShowMessage(IntToStr(SizeOf(T32BoolSet)));
ShowMessage(IntToStr(Cardinal(X)));
end;
end.
☆☆☆ かわいいコードにゃ旅をさせよう いざサンプル蔵へ!! ☆☆☆
00/03/15(水) 00:07 凛(MXB01744)
Original document by 凛 氏 ID:(MXB01744)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|