![]() |
AW: Prüfen ob Integer im Enumeration-Type enthalten ist
Die einfachste Art ist doch hier
Delphi-Quellcode:
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.
type
TMeinBeispiel = ( mbEins, mbZwei, mbDrei ); const MeinBeispielValues : array[TMeinBeispiel] of integer = ( 0, 1, 5 ); |
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:
aber was mache ich damit? Die Zuordnung
MeinBeispielValues[mbDrei] = 5
Delphi-Quellcode:
hatte ich doch vorher schon?
Ord(mbDrei) = 5
|
AW: Prüfen ob Integer im Enumeration-Type enthalten ist
Nein.
Delphi-Quellcode:
:zwinker:
Ord(mbDrei) = 2
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. |
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" |
AW: Prüfen ob Integer im Enumeration-Type enthalten ist
Zitat:
[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. |
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:
Das ist häßlich, aber leicht verständlich, und schnell umgesetzt. Klar, kommt ein Enum dazu, muss ich das die case-label anpassen erweitern.
Function IsValidEnum (aValue : Integer) : Boolean;
Begin case TMyEnum(aValue) Of myFirstEnum, mySecondEnum, ... myLastEnum : result := True; else result := False; end end; Vereinfachen (z.B. über RTTI) würde ich das nie, denn das verleitet dann zum Verwenden von Enums auch bei neuen Projekten. |
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!! |
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ö'); |
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:
|
AW: Prüfen ob Integer im Enumeration-Type enthalten ist
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:36 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