AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Prüfen ob Integer im Enumeration-Type enthalten ist

Prüfen ob Integer im Enumeration-Type enthalten ist

Ein Thema von Keks · begonnen am 25. Jan 2015 · letzter Beitrag vom 27. Jan 2015
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

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

  Alt 25. Jan 2015, 20:29
Zitat:
Delphi-Quellcode:
type
  TMeinBeispiel = ( mbEins, mbZwei, mbDrei );
const
  MeinBeispielValues : array[TMeinBeispiel] of integer = ( 0, 1, 5 );


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

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.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (25. Jan 2015 um 20:36 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#2

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

  Alt 26. Jan 2015, 07:28
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.
  Mit Zitat antworten Zitat
Keks

Registriert seit: 25. Mai 2005
122 Beiträge
 
#3

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

  Alt 27. Jan 2015, 11:15
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!!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 27. Jan 2015, 13:26
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('');

if s - cMyEnumRange <> [] then
  raise Exception.Create('');
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#5

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

  Alt 27. Jan 2015, 13:42
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.
  Mit Zitat antworten Zitat
Benutzerbild von NicoDE
NicoDE

Registriert seit: 16. Jul 2012
Ort: Darmstadt
26 Beiträge
 
Delphi 10.3 Rio
 
#6

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

  Alt 27. Jan 2015, 13:55
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
Nico Bendlin
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 27. Jan 2015, 14:31
Das SET nutzt Befehle der CPU und dort gibt es nur ein Byte als Index ... darum auch nur 0 bis 255.
Darum funktioniert das SET für WideChar nicht mehr.

Der ENUM kann mindestens einen Integer als Speicher nutzen (also bis 32 Bit ... ob 64 Bit auch geht, weiß ich grade nicht auswendig)


SET: 0 <= x < 2^8 (maximal 32 Byte adressierbar)
ENUM: 0 <= x < 2^32 (vielleicht auch 64, aber ich glaub eher nicht)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (27. Jan 2015 um 14:33 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 01:29 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