Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Prüfen ob Integer im Enumeration-Type enthalten ist (https://www.delphipraxis.net/183642-pruefen-ob-integer-im-enumeration-type-enthalten-ist.html)

Sir Rufo 25. Jan 2015 18:06

AW: Prüfen ob Integer im Enumeration-Type enthalten ist
 
Die einfachste Art ist doch hier
Delphi-Quellcode:
type
  TMeinBeispiel = ( mbEins, mbZwei, mbDrei );
const
  MeinBeispielValues : array[TMeinBeispiel] of integer = ( 0, 1, 5 );
Wenn man das jetzt noch in einen Record packt, der die Umwandlung vornimmt, dann hat man doch alles zusammen und kann nach Belieben hin- und her konvertieren und das auch noch voll automatisch.

Keks 25. Jan 2015 20:04

AW: Prüfen ob Integer im Enumeration-Type enthalten ist
 
Sorry, aber irgendwie verstehe ich Dein Beispiel nicht ... oder ich stehe auf dem Schlauch.
Delphi-Quellcode:
MeinBeispielValues[mbDrei] = 5
aber was mache ich damit? Die Zuordnung
Delphi-Quellcode:
Ord(mbDrei) = 5
hatte ich doch vorher schon?

himitsu 25. Jan 2015 20:10

AW: Prüfen ob Integer im Enumeration-Type enthalten ist
 
Nein.

Delphi-Quellcode:
Ord(mbDrei) = 2
:zwinker:

Der Enum ist "einfach", besitzt eine vollständige RTTI, aber diehn nur der als Namensliste.
Die eigentlichen Werte sind aber extern abgelegt und werden nur für's Casten benutzt.

Keks 25. Jan 2015 20:12

AW: Prüfen ob Integer im Enumeration-Type enthalten ist
 
Ähm ...
Delphi-Quellcode:
type TMeinBeispiel = (mbEins=0, mbZwei=1, mbDrei=5);
begin
  ShowMessage(IntToStr(Ord(mbDrei))); // -> "5"

himitsu 25. Jan 2015 20:29

AW: Prüfen ob Integer im Enumeration-Type enthalten ist
 
Zitat:

Delphi-Quellcode:
type
  TMeinBeispiel = ( mbEins, mbZwei, mbDrei );
const
  MeinBeispielValues : array[TMeinBeispiel] of integer = ( 0, 1, 5 );

:roll:

[edit]
"hatte" ... hatte "hab" gelesen. :oops:

Aber zusätzlich hast du so eben einen Code, wo man alle gültigen "Namen" auslesen kann und auch eine Liste (Array) mit allen gültigen Werten hat.

Dejan Vu 26. Jan 2015 07:28

AW: Prüfen ob Integer im Enumeration-Type enthalten ist
 
Da sieht man mal wieder, weshalb Enums 'böse' sind.

Ich würde eine Funktion schreiben, die über ein 'CASE' die Validität des Integers prüft und mich dann um die wichtigen Dinge kümmern.
Delphi-Quellcode:
Function IsValidEnum (aValue : Integer) : Boolean;
Begin
  case TMyEnum(aValue) Of
     myFirstEnum,
     mySecondEnum,
     ...
     myLastEnum : result := True;
     else result := False;
  end
end;
Das ist häßlich, aber leicht verständlich, und schnell umgesetzt. Klar, kommt ein Enum dazu, muss ich das die case-label anpassen erweitern.

Vereinfachen (z.B. über RTTI) würde ich das nie, denn das verleitet dann zum Verwenden von Enums auch bei neuen Projekten.

Keks 27. Jan 2015 11:15

AW: Prüfen ob Integer im Enumeration-Type enthalten ist
 
Die Lösung von Dejan Vu ist für meinen Spezialfall vermutlich die passendste. Hatte da seltsamerweise nicht selbst dran gedacht, aber ich hatte ja ohnehin wohl fälschlicherweise angenommen, dass Delphi da eine eigene Abfragemöglichkeit mitbringt.
Die Möglichkeit per Array-Konstante von Sir Rufo würde natürlich auch gehen (mit dem Vorteil die Werte iterieren zu können), aber letzlich müssen die Werte dann getrennt vom Enum gepflegt werden (bei längeren Aufzählungen blos nicht die Werte vertauschen ;)) und zum Gültigkeits-Abfrage brauche ich ja doch wieder eine zusätzliche Funktion.

Aber ich habe wieder was gelernt und habe eine Lösung. Vielen Dank Euch Dreien!!

himitsu 27. Jan 2015 13:26

AW: Prüfen ob Integer im Enumeration-Type enthalten ist
 
Statt der Funktion hatte ich mir, die ein/zwei Mal, wo ich sowas brauchte, eine Konstante direkt bei dem Typen deklariert.
Ist bei Änderungen auffälliger, als die Funktion außerhalb des Blickfeldes.

Delphi-Quellcode:
type
  TMyEnum = (a, b, c, z=25);

const
  cMyEnumRange = [a, b, c, z]; //cMyEnumRange: set of TMyEnum = [a, b, c, z];



var
  e: TMyEnum;
  s: set of TMyEnum;

if not (e in cMyEnumRange) then
  raise Exception.Create('nö');

if s - cMyEnumRange <> [] then
  raise Exception.Create('nö');

Dejan Vu 27. Jan 2015 13:42

AW: Prüfen ob Integer im Enumeration-Type enthalten ist
 
Können Enums nur Werte <=255 annehmen? Ansonsten eine sehr schöne Idee, zumal die Konstante direkt beim Enum deklariert werden kann: Wenn schon Schrott, dann wenigstens an einer Stelle. :thumb:

NicoDE 27. Jan 2015 13:55

AW: Prüfen ob Integer im Enumeration-Type enthalten ist
 
Zitat:

Zitat von Dejan Vu (Beitrag 1287951)
Können Enums nur Werte <=255 annehmen?

Ein Delphi-Set is intern ein Bitfeld (wobei die Werte den Index angeben), welches auf 256 Bits limitiert ist (wahrscheinlich um "set of AnsiChar" zu unterstützen).
http://docwiki.embarcadero.com/RADSt...s_%28Delphi%29


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:36 Uhr.
Seite 2 von 3     12 3      

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