Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie testet man ob Enum in Teilgruppe davon? (https://www.delphipraxis.net/149955-wie-testet-man-ob-enum-teilgruppe-davon.html)

xZise 3. Apr 2010 14:25


Wie testet man ob Enum in Teilgruppe davon?
 
Moin,
wenn ich ein Enum habe. Zum Beispiel:
Delphi-Quellcode:
type
  TElement = (Wasserstoff, Helium, Sauerstoff, Neon, Kohlenstoff);
Jetzt möchte ich gucken, ob ein Element ein Edelgas ist (#1 und #3). Normalerweise würde ich das so schreiben:
Delphi-Quellcode:
if (Element = Helium) or (Element = Neon) then
Aber kann man vielleicht eine Untergruppe erstellen?
Delphi-Quellcode:
type
  TEdelgas = (Helium, Neon)
Und dann einfach gucken, ob das Element in den Edelgasen ist?
Delphi-Quellcode:
if (Element in TEdelgas) then
Ich weiß aktuell geht das nicht, weil TEdelgas.Neon nicht das gleiche wie TElement.Neon ist. Außerdem glaube ich funktioniert so der in-Operator nicht. Aber ich hoffe ihr versteht was ich meine.

MfG
Fabian

daywalker9 3. Apr 2010 14:28

Re: Wie testet man ob Enum in Teilgruppe davon?
 
Delphi-Quellcode:
TEdelGas = set of TElement;

var
 EdelGase : TEdelGas;

initialization

 EdelGase := [Neon...]
Dann könntest du den in operator verwenden

s.h.a.r.k 3. Apr 2010 14:29

Re: Wie testet man ob Enum in Teilgruppe davon?
 
So könnte man es machen:

Delphi-Quellcode:
type
  TElement = (Wasserstoff, Helium, Sauerstoff, Neon, Kohlenstoff);
  TEdelgas = Set of TElement;

var
  Edelgas : TEdelgas;
  element : TElement;
begin
  Edelgas = [Wasserstofft, Helium, Neon];
  element := Neon;

  if (element in Edelgas) then
    ShowMessage('Juhu.');
end;
//edit
Wo war die rote Box? :gruebel:

//edit(2)
Das hier ist vielleicht interessanter für dich:

Delphi-Quellcode:
type
  TElement = (Wasserstoff = 10, Neon = 15, Sauerstoff = 17);

const
  Blub = [TElement.Wasserstoff, TElement.Neon];
  { bzw. }
  Blub = [Wasserstoff, Neon];

  { Der Rest wie gehabt. }

xZise 3. Apr 2010 16:07

Re: Wie testet man ob Enum in Teilgruppe davon?
 
Moin,
danke Shark das zweite Edit war genau das was ich gesucht habe. Leider kann man das allerdings dann nicht in einem case verwenden :(

MfG
Fabian

s.h.a.r.k 3. Apr 2010 16:19

Re: Wie testet man ob Enum in Teilgruppe davon?
 
Wie darf man das verstehen? Meinst du als Type-Definition? Verstehe nicht, was das mit einem case zu tun hat.

xZise 3. Apr 2010 16:26

Re: Wie testet man ob Enum in Teilgruppe davon?
 
Moin,

ich meine, dass ich mit einem case testen möchte ob ein Element ein Edelgas ist:
Delphi-Quellcode:
case Element of
  EDELGASE : Showmessage('Es ist ein Edelgas');
  else Showmessage('Es ist kein Edelgas');
end;
MfG
Fabian

jfheins 3. Apr 2010 16:36

Re: Wie testet man ob Enum in Teilgruppe davon?
 
Mach doch eine Kleine Funktion:
Delphi-Quellcode:
function ElementType(elem: TElem): TElemType
begin
Result := TElemType((getordnungszahl(elem)+6) mod 8);
end;
So oder so ähnlich :stupid:

s.h.a.r.k 3. Apr 2010 16:38

Re: Wie testet man ob Enum in Teilgruppe davon?
 
Das geht ja auch nicht :) Neon z.B. ist ja ein Element aus Edelgas -> in

Delphi-Quellcode:
if (Element in EDELGAS) then
  Showmessage('Es ist ein Edelgas');
else
  Showmessage('Es ist kein Edelgas');

xZise 3. Apr 2010 17:24

Re: Wie testet man ob Enum in Teilgruppe davon?
 
Moin,
und wenn es nicht nur um Elemente geht:
Delphi-Quellcode:
type
  TFixelType = (ftWall, ftBall, ftFinish,
                ftRedBrush, ftGreenBrush, ftYellowBrush, ftBlueBrush,
                ftAcid,
                ftRedSwitch, ftGreenSwitch, ftYellowSwitch, ftBlueSwitch,
                ftRedDoor, ftGreenDoor, ftYellowDoor, ftBlueDoor,
                ftBumper, ftPad,
                ftRedAccelerator, ftGreenAccelerator, ftYellowAccelerator, ftBlueAccelerator,
                ftRedBeamstart, ftGreenBeamstart, ftYellowBeamstart, ftBlueBeamstart,
                ftRedBeamtarget, ftGreenBeamtarget, ftYellowBeamtarget, ftBlueBeamtarget,
                ftBlocker,
                ftText);

const
  DOOR_TYPES = [ftRedDoor, ftGreenDoor, ftYellowDoor, ftBlueDoor];
  BRUSHES_TYPES = [ftRedBrush, ftGreenBrush, ftYellowBrush, ftBlueBrush];
Klar, dort könnte ich auch eine verschachtelte if-Abfrage machen, aber case ist da meiner Meinung nach schöner:
Delphi-Quellcode:
case TFixelType(AMainRec.Bytes[2] - 1) of
  ftWall : ASprteBuf := TVirtualWall.Create;
  ftRedBrush, ftGreenBrush, ftYellowBrush, ftBlueBrush : ASprteBuf := TVirtualBrush.Create;
//  DOOR_TYPES : ASprteBuf := TVirtualDoor.Create;
  ftRedDoor, ftGreenDoor, ftYellowDoor, ftBlueDoor : ASprteBuf := TVirtualDoor.Create;
  else ASprteBuf := TVirtualFixel.Create;
end;
MfG
Fabian

s.h.a.r.k 3. Apr 2010 17:56

Re: Wie testet man ob Enum in Teilgruppe davon?
 
Schöner wäre es wahrlich, aber dies bzgl fällt mir echt nichts ein :gruebel: Ich würde aber auf eine Hilfsmethode/-typ umsteigen und das wie folgt lösen:

Delphi-Quellcode:
type
  TFixelType = (ftWall, ftBall, ftFinish,
                ftRedBrush, ftGreenBrush, ftYellowBrush, ftBlueBrush,
                ftAcid,
                ftRedSwitch, ftGreenSwitch, ftYellowSwitch, ftBlueSwitch,
                ftRedDoor, ftGreenDoor, ftYellowDoor, ftBlueDoor,
                ftBumper, ftPad,
                ftRedAccelerator, ftGreenAccelerator, ftYellowAccelerator, ftBlueAccelerator,
                ftRedBeamstart, ftGreenBeamstart, ftYellowBeamstart, ftBlueBeamstart,
                ftRedBeamtarget, ftGreenBeamtarget, ftYellowBeamtarget, ftBlueBeamtarget,
                ftBlocker,
                ftText);

const
  DOOR_TYPES = [ftRedDoor, ftGreenDoor, ftYellowDoor, ftBlueDoor];
  BRUSHES_TYPES = [ftRedBrush, ftGreenBrush, ftYellowBrush, ftBlueBrush];

type
  TMyEnumType = (etNone, etDoorTypes, etBrushesTypes);



function MyEnumTypeOfFixelElement(const AFixelType: TFixelType): TMyEnumType;
begin
  if (AFixelType in TYPES) then
    Result := etDoorTypes
  else if (AFixelType in BRUSHES_TYPES) then
    Result := etBrushesTypes
  else
    Result := etNone;
end;


AElement := { was auch immer };
case MyEnumTypeOfFixelElement(AElement) of
  etDoorTypes : ;
  etBrushesTypes : ;
  else begin
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:26 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz