4

私は次のものを持っています:

TDirection = (dirNorth, dirEast, dirSouth, dirWest);
TDirections = set of TDirection;

別のクラスでは、プロパティとして宣言しています。

property Directions: TDirections read FDirections write FDirections;

私が望むのは、それらをブール値であるかのように扱うことができるようにすることです。たとえば、dirNorthTrue の場合は1、False の場合は になります0

私はそれを想像しようとしています(1,0,0,0)

方向がTrueかどうかを確認するには、次を使用できると思います:

var
  IsTrue: Boolean;
begin
  IsTrue := (DirNorth in Directions);

上記が正しいかどうかはわかりませんが、私の他の問題は、方向の1つをTrueまたはに変更する方法Falseです?

私は今、私の混乱状態の1つに達しました:(

これは私が値を設定しようとした最後のことですが、(Lazarus で) Illegal Expression を取得しています。

Directions(TDirection(DirNorth)) := True;
4

3 に答える 3

13

Directionsタイプ の要素のセットですTDirection

が含まれ ているかどうかを確認するにはdirNorth、 を実行しますdirNorth in Directionsin演算子を使用した結果はブール値です。セットに要素が含まれているdirNorth in Directions場合は true です。DirectionsdirNorth

dirNorthが に含まれていることを確認するにはDirections、 を実行しますDirections := Directions + [dirNorth]

がに含まれてdirNorthないことを確認するにはDirections、 を実行しますDirections := Directions - [dirNorth]

特定の値に設定Directionsするには、次を割り当てるだけですDirections := [dirNorth, dirSouth]

正式には、2 つのセットの結合+を計算します。2 つの集合の集合差を計算します。2 つのオペランドの交点を計算します。-*

niceIncludeExcludefunctions:もあり、 ;Include(Directions, dirNorth)と同じことを行います。と同じことをします。Directions := Directions + [dirNorth]Exclude(Directions, dirNorth)Directions := Directions - [dirNorth]

たとえば、

type
  TAnimal = (aDog, aCat, aRat, aRabbit);
  TAnimalSet = set of TAnimal;
const
  MyAnimals = [aDog, aRat, aRabbit];
  YourAnimals = [aDog, aCat];

それから

aDog in MyAnimals = true;
aCat in MyAnimals = false;
aRat in YourAnimals = false;
aCat in YourAnimals = true;

MyAnimals + YourAnimals = [aDog, aRat, aRabbit, aCat];
MyAnimals - YourAnimals = [aRat, aRabbit];
MyAnimals * YourAnimals = [aDog];

私の答えに暗示されているのは、Delphi の型が数学的集合setに基づいてモデル化されているという事実です。Delphi型の詳細については、公式ドキュメントを参照してください。set

于 2013-09-12T19:54:33.760 に答える
0

プロパティでは機能しないこのヘルパーに基づいて、これを作成しました(XE6が必要です)-変数プロパティに使用できます:

TGridOptionsHelper = record helper for TGridOptions
public
  ///  <summary>Sets a set element based on a Boolean value</summary>
  ///  <example>
  ///    with MyGrid do Options:= Options.SetOption(goEditing, False);
  ///    MyVariable.SetOption(goEditing, True);
  ///  </example>
  function SetOption(GridOption: TGridOption; const Value: Boolean): TGridOptions;
end;

function TGridOptionsHelper.SetOption(
  GridOption: TGridOption; const Value: Boolean): TGridOptions;
begin
  if Value then Include(Self, GridOption) else Exclude(Self, GridOption);
  Result:= Self;
end;
于 2018-05-09T12:17:39.640 に答える