Du kan eventuelt bruge TBits som er en klasse der kan rumme en hel stribe bits. Så behøver du ikke lave nye boolske variable hver gang du føjer noget til. Statusværdien kan gemmes i registringsdatabasen (single-user) eller i en database (multi-user). ... eller i en fil sammen med exe-filen.
Jeg bryggede lige denne lille klasse sammen. Det der fylder mest (ca 60%) er, at værdierne kan gemmes til en fil via en stream og læses derfra på samme måde. Har taget det med for at vise hvor let det kan gemmes i en fil, registreringsdatabase eller et blob-felt i en database. Det er muligt TReader og TWriter ikke er smartest, men jeg bruger dem meget.
Hvis en bit sættes så tjekker den med den eksisterende værdi og hvis den er forskellig fyrer den et event af.
Jeg har også et lille testprogram hvis du er interesseret.
unit UBitclass;
interface
uses
SysUtils, Classes;
type
TOnBitChangeEvent = procedure(const aBitNo: integer; const aNewValue: boolean) of object;
TBitActions = class
private
fBits: TBits;
fOnBitChange: TOnBitChangeEvent;
function GetBit(const aIndex: integer): boolean;
procedure SetBit(const aIndex: integer; const Value: boolean);
public
constructor Create(const aSize: integer = 16);
destructor Destroy; override;
property OnBitChange: TOnBitChangeEvent read fOnBitChange write fOnBitChange;
property Bit[const aIndex: integer]: boolean read GetBit write SetBit; default;
procedure LoadFromStream(aStream: TStream);
procedure SaveToStream(aStream: TStream);
procedure LoadFromFile(const aFilename: string);
procedure SaveToFile(const aFilename: string);
end;
implementation
{ TBitActions }
constructor TBitActions.Create(const aSize: integer);
begin
inherited Create;
fBits := TBits.Create;
fBits.Size := aSize;
fOnBitChange := nil;
end;
destructor TBitActions.Destroy;
begin
try
fBits.Free;
finally
inherited;
end;
end;
function TBitActions.GetBit(const aIndex: integer): boolean;
begin
result := fBits[aIndex];
end;
procedure TBitActions.SetBit(const aIndex: integer; const Value: boolean);
var
OldValue: boolean;
begin
OldValue := fBits[aIndex];
if OldValue <> Value then
begin
fBits[aIndex] := Value;
if assigned(fOnBitChange) then
fOnBitChange(aIndex,Value);
end;
end;
// Gem- og hent-procedurerne kommer her.
procedure TBitActions.LoadFromFile(const aFilename: string);
var
fs: TFileStream;
begin
fs := TFileStream.Create(aFilename,fmCreate);
try
LoadFromStream(fs);
finally
fs.Free;
end;
end;
procedure TBitActions.LoadFromStream(aStream: TStream);
var
i: integer;
Reader: TReader;
begin
Reader := Treader.Create(aStream,100);
try
fBits.Size := Reader.ReadInteger;
for i := 0 to fBits.Size - 1 do
fBits[i] := Reader.ReadBoolean;
Reader.FlushBuffer;
finally
Reader.Free;
end;
end;
procedure TBitActions.SaveToFile(const aFilename: string);
var
fs: TFileStream;
begin
fs := TFileStream.Create(aFilename,fmOpenRead);
try
SaveToStream(fs);
finally
fs.Free;
end;
end;
procedure TBitActions.SaveToStream(aStream: TStream);
var
i: integer;
Writer: TWriter;
begin
Writer := TWriter.Create(aStream,100);
try
Writer.WriteInteger(fBits.Size);
for i := 0 to fBits.Size - 1 do
Writer.WriteBoolean(fBits[i]);
Writer.FlushBuffer;
finally
Writer.Free;
end;
end;
end.