Search code examples
delphibitwise-operatorsobject-state

How use bit/bit-operator to control object state?


I want to create light object data-package to pass between client and server applications.

It is a so simple task, that I can control with only 1 byte, so each bit in a byte will have a different meaning,

Using only the bit

0 = False 
1 = True

Itens I need now:

1 - Loaded from database 
2 - Persisted
3 - Changed
4 - Marked to Delete
5 -
6 - 
7 - Null Value 
8 - Read Only


1) How do I use bit operators in Delphi to check each bit value? 
2) How do I set the bit Values?

Solution

After all help, Ill use the next Set

  TStateType = (
    stLoaded    = 0,   // loaded from persistance
    stNative    = 2,   // value loaded and converted to native type
    stPersisted = 3,   // saved
    stChanged   = 4,   // object or member changed
    stToDelete  = 5,   // marked to delete
    stReadOnly  = 6,   // read only object, will not allow changes
    stNull      = 7    // value is null
  );
  TState = Set of TStateType;

And for stream -> persistance, this will be the record to be used:

  TDataPackage = record
    Data: TBytes;
    TypeInfo: TMetaInfo;
    State: Byte;
    Instance: TBuffer;
  end;

Thank you guys, for all the answers and comments.


Solution

  • I'd really use a set for this. However, I see you really want a byte. Use sets everywhere then typecast to a byte in the end.

    This solution will require much less typing, has support for standard delphi operators and really carries no performance penalty as Barry Kelly has pointed out.

    procedure Test;
    type
      TSetValues = (
        TSetValue1   = 0,
        TSetValue2   = 1,
        TSetValue4   = 2,
        TSetValue8   = 3,
        TSetValue16  = 4,
        TSetValue32  = 5,
        TSetValue64  = 6,
        TSetValue128 = 7
      );
    
      TMySet = set of TSetValues;
    var
      myValue: byte;
      mySet: TMySet;
    begin
      mySet := [TSetValue2, TSetValue16, TSetValue128];
      myValue := byte(mySet);
      ShowMessage(IntToStr(myValue)); // <-- shows 146
    end;