5

クライアントアプリケーションとサーバーアプリケーション間で受け渡すライトオブジェクトデータパッケージを作成したいと思います。

これは非常に単純なタスクなので、1バイトで制御できるため、1バイトの各ビットの意味は異なります。

ビットのみを使用

0 = False 
1 = True

私が今必要とするItens:

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?

解決

すべての助けの後、私は次のセットを使用します

  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;

そして、ストリーム->永続性の場合、これが使用されるレコードになります。

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

みんな、すべての答えとコメントをありがとう。

4

3 に答える 3

7

私は本当にこれのためにセットを使うでしょう。しかし、私はあなたが本当にバイトを望んでいるのを見ます。どこでもセットを使用し、最後に1バイトに型キャストします。

このソリューションでは、入力がはるかに少なくて済み、標準のdelphi演算子がサポートされており、Barry Kellyが指摘しているように、パフォーマンスが低下することはありません。

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;
于 2009-02-05T17:08:15.540 に答える
6

私はこれにセットを使用します:

type
    TMyDatum = (mdLoaded, mdPersisted, mdChanged, mdMarkedToDelete, ...);
    TMyData = set of TMyDatum;

var
  Foo: TMyData;
begin 
  Foo := [mdLoaded, mdChanged];
  if (mdPersisted in Foo) then ...

これらは整数として実装されるため、簡単に渡すことができます。そして、コードはビット単位の演算子よりもはるかに読みやすいことがわかりました。

于 2009-02-05T16:46:01.670 に答える
1

このページでは、ビット演算子を含む Delphi 演算子について説明します。

and 演算子を使用する必要があるようです。例えば:

const
  LOADED_FROM_DATABASE = 1;
  PERSISTED = 2;
  CHANGED = 4;
  // etc...

//...

if (bitFlags and LOADED_FROM_DATABASE) <> 0 then
begin
  // handle LOADED FROM DATABASE
end;

if (bitFlags and PERSISTED) <> 0 then
begin
  // handle PERSISTED
end;

// etc...

フラグを設定するには、OR を使用できます。

bitFlags := LOADED_FROM_DATABASE or PERSISTED or CHANGED;
于 2009-02-05T16:36:08.927 に答える