AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Wie testet man ob Enum in Teilgruppe davon?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie testet man ob Enum in Teilgruppe davon?

Ein Thema von xZise · begonnen am 3. Apr 2010 · letzter Beitrag vom 3. Apr 2010
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#1

Wie testet man ob Enum in Teilgruppe davon?

  Alt 3. Apr 2010, 14:25
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:
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?
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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#2

Re: Wie testet man ob Enum in Teilgruppe davon?

  Alt 3. Apr 2010, 14:28
Delphi-Quellcode:
TEdelGas = set of TElement;

var
 EdelGase : TEdelGas;

initialization

 EdelGase := [Neon...]
Dann könntest du den in operator verwenden
Lars
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

Re: Wie testet man ob Enum in Teilgruppe davon?

  Alt 3. Apr 2010, 14:29
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?

//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. }
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Wie testet man ob Enum in Teilgruppe davon?

  Alt 3. Apr 2010, 16:07
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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#5

Re: Wie testet man ob Enum in Teilgruppe davon?

  Alt 3. Apr 2010, 16:19
Wie darf man das verstehen? Meinst du als Type-Definition? Verstehe nicht, was das mit einem case zu tun hat.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Wie testet man ob Enum in Teilgruppe davon?

  Alt 3. Apr 2010, 16:26
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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#7

Re: Wie testet man ob Enum in Teilgruppe davon?

  Alt 3. Apr 2010, 16:36
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
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#8

Re: Wie testet man ob Enum in Teilgruppe davon?

  Alt 3. Apr 2010, 16:38
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');
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#9

Re: Wie testet man ob Enum in Teilgruppe davon?

  Alt 3. Apr 2010, 17:24
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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#10

Re: Wie testet man ob Enum in Teilgruppe davon?

  Alt 3. Apr 2010, 17:56
Schöner wäre es wahrlich, aber dies bzgl fällt mir echt nichts ein 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;
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:25 Uhr.
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