Как установить значение типа enum?


У меня есть следующее:

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

В отдельном классе он объявлен как свойство:

property Directions: TDirections read FDirections write FDirections;

Я хочу иметь возможность рассматривать их как булевы, так что, например, если dirNorth было бы истинно, то это было бы 1, Если ложно, то это было бы 0.

Я пытаюсь представить это как (1,0,0,0)

Я думаю, чтобы проверить, верно ли направление, я мог бы использовать:

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

Не уверен, правильно ли это или нет, но тогда моя другая проблема заключается в том, как изменить одно из направлений на True или False?

Теперь я достиг одного из своих состояний замешательства : (

Это последнее, что я пытался установить значение, но я получаю незаконное выражение (в Lazarus).

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

3 ответа:

Directions является множеством элементов типа TDirection.

Чтобы посмотреть, содержит ли он dirNorth, сделай dirNorth in Directions. Результат использования оператора in является булевым; dirNorth in Directions истинен, если множество Directions содержит элемент dirNorth.

Чтобы убедиться, что dirNorth включен в Directions, Сделайте Directions := Directions + [dirNorth].

Чтобы убедиться, что dirNorth не входит вDirections, сделайте Directions := Directions - [dirNorth].

Чтобы задать Directions определенное значение, просто назначьте: Directions := [dirNorth, dirSouth].

Формально, + вычисляет тот самый Союз двух множеств; - вычисляет установить разницу из двух наборов. * вычисляет пересечение из двух операндов.

У вас также есть хорошие функции Include и Exclude: 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, пожалуйста, обратитесь к официальной документации.

Вы можете добавить элемент в набор следующим образом:

Include(Directions, dirNorth);

Чтобы удалить его из набора:

Exclude(Diretions, dirNorth);

В справке говорится, что результат такой же, как при использовании оператора plus, но код более эффективен.

На основе этого помощника , который не работает для свойств, я создал этот (требуется 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;