Min i Max Typu wyliczeniowego

Min i Max Typu wyliczeniowego
Johny_Morfina
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 448
0

Cześć,
zrobiłem sobie typ wyliczeniowy:

Kopiuj
TTypAkcji =   (taNadano, taOtrzymano, taUruchomiono, taAnulowano, taZakonczono);

Teraz chciałbym zrobić pętlę przechodzącą przez wszystkie elementy więc piszę tak:

Kopiuj
for typ := taNadano to taZakonczono do
  (...)

ale co jeśli kiedyś dodam nowe wartości?
czy jest możliwość jakiegoś iterowania po wszystkich wartościach typu wyliczeniowego?
np:

Kopiuj
for typ := minValue(TTypAkcji) to maxValue(TTypAkcji) do
  (...)

Korzystam z Delphi7 ale jeśli da się takie coś zrobić w Delphi EX2 to tez chętnie się dowiem.

pozdrawiam

NE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 29
0

Dopisuj przed taZakonczono.

adf88
  • Rejestracja: dni
  • Ostatnio: dni
0

Nie wiem czy w Delphi jest jakieś wsparcie do tego co chcesz osiągnąć. Ale istnieje generalnie pewna technika pozwalająca obejść ten problem. Do każdego enuma po którym będziesz iterować dodać znaczniki początku i końca np:

Kopiuj
TKolor = (
  kPierwszy,

  kNiebieski = kPierwszy,
  kZielony,
  kZolty,
  kCzerwony,

  kOstatni = kCzerwony
);

Wtedy iterujesz tak:

Kopiuj
for kolor := kPierwszy to kOstatni do

Modyfikując enum'a dbasz cały czas o to, aby kPierwszy i kOstatni wskazywały odpowiednie wartości.

KA
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Gorlice
1
Kopiuj
for i:= Integer(Low(TTypAkcji)) to Integer(High(TTypAkcji)) do
//...

EDIT//
i jeszcze może czasami może Ci się przydać Ord np.:

Kopiuj
for i:= Ord(taNadano) to Ord(taZakonczono) do
//...

No i oczywiscie można bez rzutowania na integer czyli:

Kopiuj
for typ:= Low(TTypAkcji) to High(TTypAkcji) do
//...
flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
0

Sprawdziłem sposób @kAzek i działa bez problemu, kod (w Lazarus'ie):

Kopiuj
program Project1;

{$mode objfpc}{$H+}

type
  TAppState = (asStarting, asRunning, asTerminating);
var
  I: TAppState;
begin
  for I := Low(TAppState) to High(TAppState) do
    Write(I, ' ');

  ReadLn;
end.

na wyjściu dostaję:

asStarting asRunning asTerminating
Po dodaniu nowej pozycji też działa:

Kopiuj
type
  TAppState = (asStarting, asRunning, asTerminating, asClosed);

i na wyjściu otrzymujemy:

asStarting asRunning asTerminating asClosed
Żeby otrzymać cyferki zamiast identyfikatorów trzeba rzutować, np. na Byte - Write(Byte(I), ' ');;

Aldonix
  • Rejestracja: dni
  • Ostatnio: dni
0

O stałych wyliczeniowych w Delphi możesz przeczytać tu: http://www.delphi.opiumsoft.pl/stale-wyliczeniowe-w-delphi

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.