Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Enums vereinen (https://www.delphipraxis.net/149655-enums-vereinen.html)

Highttower 26. Mär 2010 10:58


Enums vereinen
 
Hallo zusammen,

ich suche eine Möglichkeit ein Enum, um Datentypen zu erweitern. Also quasi davon abzuleiten und dann etwas hinzu fügen.

Um das Ganze zu verdeutlichen hier ein kleines Beispiel dazu:

Delphi-Quellcode:
    TObst = (Apfel, Birne, Pflaume);

    TGemuese = (Moehre, Lauch, Gurke);

    TGesundeSachen = set of TObst AND TGemuese;

implementation

procedure TForm6.FormCreate(Sender: TObject);
var aSchale : TGesundeSachen;
    tmp : String;
begin
    aSchale := [Moehre, Apfel];
    tmp := '';
    case aSchale of
        Apfel:
            tmp := tmp + 'Apfel, ';
        Birne:
            tmp := tmp + 'Birne, ';
        Pflaume :
            tmp := tmp + 'Pflaume, ';
        Moehre:
            tmp := tmp + 'Moehre, ';
        Lauch:
            tmp := tmp + 'Lauch, ';
        Gurke:
            tmp := tmp + 'Gurke, ';
    end;
    ShowMessage('Der Obstsalat enthält ' + tmp);
end;
Wie ihr seht versuche ich Obst und Gemüse auf diese Art zusammen bekommen? Das funktioniert aber nicht werder mit OR, noch mit AND, noch mit einem Komma. :( Geht sowas in Delphi(2007) überhaupt?

Vielen Dank,

Tobi

Deep-Sea 26. Mär 2010 11:08

Re: Enums vereinen
 
Nein so etwas geht nicht. Aber du kannst es umgekehrt machen:
Delphi-Quellcode:
TGesundeSachen = (Apfel, Birne, Pflaume, Moehre, Lauch, Gurke);

TObst = Apfel..Pflaume;
TGemuese = Moehre..Gurke;
:wink:

vsilverlord 26. Mär 2010 13:16

Re: Enums vereinen
 
in c++ geht das mit dem
Delphi-Quellcode:
and
oder?

guinnes 26. Mär 2010 13:49

Re: Enums vereinen
 
Wäre aber sehr merkwürdig. Da Apfel und Möhre die selben Ordinalwerte haben kann das eigentlich nicht gehen

Uwe Raabe 26. Mär 2010 13:58

Re: Enums vereinen
 
Zitat:

Zitat von vsilverlord
in c++ geht das mit dem
Delphi-Quellcode:
and
oder?

"Geht" im Sinne von "compiliert" wohl, kommt aber das Falsche raus!

Bernhard Geyer 26. Mär 2010 13:58

Re: Enums vereinen
 
Zitat:

Zitat von guinnes
Wäre aber sehr merkwürdig. Da Apfel und Möhre die selben Ordinalwerte haben kann das eigentlich nicht gehen

Gehen schon (in C++), aber nicht gut geben.
C++ hat halt keine vernünftige Implementierung eines Enum-Typs.

himitsu 26. Mär 2010 14:20

Re: Enums vereinen
 
Zitat:

Zitat von guinnes
Wäre aber sehr merkwürdig. Da Apfel und Möhre die selben Ordinalwerte haben kann das eigentlich nicht gehen

Dank der Class-Operatoren und Funktionen in Records könnte man in neueren Delphis zwar einen Mischtyp erstellen, welcher dennoch keine Überschneidung enthält und zu Teilen mit den Enums kompatibel wäre.

Immerhin könnte man dort intern die Wertebereiche entsprechend verschieben und alles in einem Enum/Integer verwalten.

Aber ganz ehrlich, ich sehe keinen Grund für diesen Aufwand.

Die korrekte Lösung wurde ja schon genannt - siehe #2

PS: ende letzes Jahr gab es doch schonmal genau diese Frage (ich finde nur gerade den Thread nicht) und ich glaub da ging es auch um Obst und Gemüse.

Highttower 31. Mär 2010 07:22

Re: Enums vereinen
 
Hallo zusammen,

vielen Dank für die Antworten, ich habe eine Funktion die eine Vergleichsmenge heraus gibt, diese steht mit samt enum in einem für mich unzugänglichen Unit(ich darf nur lesen). Ich habe die Klasse abgeleitet und wollte jetzt, die Methdoik um weiter Vergleichstypen erweitern. Da ich aber auf die Vergleichsmenge keinen Zugriff habe, und selbst wenn ich wollte das designtechnisch Blödsinn wäre, wollte ich diese Menge erweitern. Es geht mir nicht um Obst oder Gemüse von mir aus können das auch verschiedene Waschmittel sein, ich habe nur ein Trivalbeispiel gesucht was nicht so komplex ist.

MrSpock 31. Mär 2010 07:34

Re: Enums vereinen
 
Hallo HighTower,

du könntest vielleicht die beiden Methoden isGemüse und isObst in der Klasse implementieren, die auf die enums zugreift. Und isGesund wäre dann isGemüse oder isObst. Du kannst dir auch eine Implementierung auf Basis von Mengen (Sets) überlegen.

guidok 31. Mär 2010 08:55

Re: Enums vereinen
 
Ich würde mal grundsätzlich darüber nachdenken die gesunden Sachen in Klassen zu verpacken. Ziel muss es sein, dein Angebot an gesunden Sachen erweitern zu können OHNE den Quellcode anfassen zu müssen. Also eine "gesunde" Klasse erstellen und die Instanzen davon (Gurke, Apfel, usw.) z.B. in einer Collection verwalten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:20 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