Как установить значение типа 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 ответа:
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
моделируется после математическоемножество . Для получения дополнительной информации о типе Delphiset
, пожалуйста, обратитесь к официальной документации.
Вы можете добавить элемент в набор следующим образом:
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;