AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Array [Auszählungstyp] of irgendwas?

Ein Thema von Mikkey · begonnen am 17. Dez 2013 · letzter Beitrag vom 18. Dez 2013
Antwort Antwort
Furtbichler
(Gast)

n/a Beiträge
 
#1

AW: Array [Auszählungstyp] of irgendwas?

  Alt 17. Dez 2013, 09:50
Die einzige Möglichkeit, die mir einfällt, wäre:
Delphi-Quellcode:
Type
  TEnum = (Anfang = 1, Mitte = 3, Ende = 5);

Function NextEnum (e: TEnum) : TEnum;
Begin
  case e of
    Anfang : Return Mitte;
    Mitte : Return Ende;
    else Raise EInvalidArgument.Create; // K.A. wie das in Delphi heißt.
  End
End;
...

e := Anfang;
While e <> Ende Do begin
  e :=NextEnum(e);
end;
Anders würde der Compiler eine Sukkzessor-Funktion auf TEnum auch nicht umsetzen.

Wieso willst Du den Enum-Elementen eigentlich nicht fortlaufende Werte geben? Wenn Du gleichzeitig iterieren musst, könntest Du doch eine Abbildungsfunktion schreiben, also z.B. so:
Delphi-Quellcode:
Type
  TEnum := (Anfang, Mitte, Ende);

Const
  EnumWerte : Array [TEnum] Of Integer = (1,3,5);
  EnumNamen : Array [TEnum] Of String = ('Anfang','Mitte','Ende');

Geändert von Furtbichler (17. Dez 2013 um 09:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.342 Beiträge
 
Delphi 12 Athens
 
#2

AW: Array [Auszählungstyp] of irgendwas?

  Alt 17. Dez 2013, 09:56
Type TEnum = (Anfang, Mitte, Ende); läßt sich via Delphi-Referenz durchsuchenGetEnumName (Hier im Forum suchenGetEnumName) in einen String übersetzen, welcher zufälig genau deinem Array entspricht.

Also zusammen mit Const EnumWerte : Array [TEnum] Of Integer = (1,3,5); .



Bei neueren Delphis könnte man die Werte auch via Attribut an die Typ-Definition hängen
und man könnte da auch andere/alternative "Namen" via Attribut angeben. (wenn man nicht GetEnumName nimmt, sondern es dort selber aussliest)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (17. Dez 2013 um 10:05 Uhr)
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#3

AW: Array [Auszählungstyp] of irgendwas?

  Alt 17. Dez 2013, 10:16
Vielen Dank erstmal für die Anregungen. Ich werde mal versuchen, ob ich mit "GetEnumName" weiterkomme (Namen wären mir auch lieber als die Nummern).

Ansonsten finde ich Furtbichlers zweiten Vorschlag praktikabel, das wird "Plan B"
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.342 Beiträge
 
Delphi 12 Athens
 
#4

AW: Array [Auszählungstyp] of irgendwas?

  Alt 17. Dez 2013, 10:16
Und nochmal ein kleines Beispiel, zu dem "warum" es nicht geht.
Das ist wie beim Boolean, welcher auch nicht "nur" zwei Zustände kennt -> http://www.delphipraxis.net/178082-v...lean-zahl.html

Delphi-Quellcode:
type
  TMyEnum = (Anfang = 1, Mitte = 3, Ende = 5);
  
var
  MyEnum: TMyEnum;
   
MyEnum := TMyEnum(2); // hier ginge auch 0 bis 255 (oder größer, jenachdem wie $MINENUMSIZE definiert und wie groß der größte Wert in der Debinition ist)
 
Case MyEnum of
  Anfang: ShowMessage('Anfang ' + IntToStr(Ord(MyEnum)));
  Mitte: ShowMessage('Mitte ' + IntToStr(Ord(MyEnum)));
  Ende: ShowMessage('Ende ' + IntToStr(Ord(MyEnum)));
  Else ShowMessage('blubb ' + IntToStr(Ord(MyEnum)));
End;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#5

AW: Array [Auszählungstyp] of irgendwas?

  Alt 17. Dez 2013, 10:59
@Himitsu:

Das ist der Grund weshalb bei der Geschichte das Zweifeln anfängt.

Da ist eine Variable vom Typ T. Bisher bin ich (in Analogie zu C#) davon ausgegangen, dass die Variable wirklich vom Typ T ist - Der "else" (bzw. "default:") würde von einem Quellcodeanalyzer bemängelt werden, weil er nie ausgeführt werden könnte.

Bedeutet das nun, dass eine Methode, der ein T-Parameter übergeben wird, nun überprüfen muss, ob der Parameter wirklich ein T ist?

Der GetEnumName funktioniert leider in meinem Delphi nicht, (eben weil keine RTTI für den Enum-Typ vorhanden ist).

@ Namenloser: Roter Kasten?

@Furtbichler:
Plan B funktioniert (logisch).

Der Grund für die Numerierung ist der, dass die Klassen, in denen der Typ enthalten ist in eine Datenbank persistiert werden und es denkbar ist, dass es eine Erweiterung gibt. Andererseits möchte ich eine Kontrolle über die Reihenfolge der Werte behalten.

Aussehen tut es jetzt so:

Delphi-Quellcode:
g_EreignisTypNummer: Array[TEreignisTyp] of Integer = (1,2,3,4,10,11,12,13,14);
g_EreignisTypName: Array[TEreignisTyp] of String = (...);
...
  for ereignis := Low(TEreignisTyp) to High(TEreignisTyp) do begin
    ereignisNr := g_EreignisTypNummer[ereignis];
    TuIrgendwasMit(ereignis, ereignisNr, EreignisTypName[ereignis]);
  end;
...
  query.Parameters.ParamValues['EreignisTyp']:= g_EreignisTypNummer[m_EreignisTyp];
Nochmals vielen Dank
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Array [Auszählungstyp] of irgendwas?

  Alt 17. Dez 2013, 11:06
@ Namenloser: Roter Kasten?
Wenn man in der DP einen Beitrag abschickt und währenddessen bereits ein neuer Beitrag gepostet wurde, bekommt man einen roten Kasten als Warnmeldung.
  Mit Zitat antworten Zitat
Antwort Antwort

 

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:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz