Zbiór typu wyliczeniowego

0

Może banalne pytanie, ale nie mogę sobie z tym dać rady...

type
  TTurn = (none, left, right);
  TLaneTurn = set of TTurn; 
var
  Turnx: TLaneTurn;
begin
  turnx:=[left] + [right];

unit1.pas(62,19) Error: Incompatible types: got "Set Of TTurn" expected "Set Of Byte"

Jak mam przypisać nowy element do zbioru?

0

turnx:=[left,right];
lub:
turnx:=[left];
turnx:=turnx+[right];
lub funkcje:
include()
exclude()

0

@Machina - zamiast pytać to trzeba było najpierw przeczytać artykuł na temat zbiorów i typów wyliczeniowych z jakiegokolwiek kursu kodzenia w Delphi - np. Kompendium - Język Object Pascal - Zbiory; Na przyszłość pamiętaj, żeby najpierw przyswoić teorię, a potem jeśli coś nie wychodzi to pytać na forum;

Jeśli chodzi o wspomniane przez kolegów wyżej prefiksy - warto je stosować, bo dzięki temu łatwiej można się zorientować w kodzie; Osobiście takie typy zadeklarowałbym w poniższy sposób:

type
  TTurnEnum = (teNone, teLeft, teRight);
type
  TLaneTurnSet = set of TTurnEnum;

dlatego, żeby wiedzieć po samym identyfikatorze jakiego typu będzie dana zmienna, oraz jakie wartości są dostępne dla tego typu; Stąd identyfikatory wyliczeń zakończyłem słówkiem Enum, a zbiory Set (podobnie jak np. macierze zakańczam słówkiem Arr); Prefiks wartości wyliczeń ustalam od nazwy typu TurnE*num* - czyli teNone, teLeft i teRight, dzięki czemu chcąc dodać do zmiennej ziorowej jakąś wartość od razu wiem które są dostępne, a jeśli nie pamiętam wszystich (bo może być ich 255) to wystarczy podać prefiks i skorzystać z Code Completion; Możesz także stosować się do notacji węgierskiej - uważam, że takie zabiegi zwiększają czytelność kodu i pomagają go szybciej zrozumieć;

Do dodawania/usuwania wartości do/ze zbioru możesz wykorzystać procedury odpowiednio Include oraz Exclude jednak trzeba zauważyć, że nie możesz ich wykorzystać do modyfikowania właściwości (formularzy/kontrolek); Próba kompilacji programu z takim wykorzystaniem procedury:

Include(Button1.Anchors, akTop);
{ lub }
Include(Form1.Font.Style, fsBold);

zakończy się błędem [Error] Unit1.pas(XX): Left side cannot be assigned to.

1 użytkowników online, w tym zalogowanych: 0, gości: 1