Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: Prüfen ob ein Integerwert in einem ENUM existiert

  Alt 18. Feb 2021, 10:10
Jupp, IN bringt bei einem ENUM nichts, da diese Variable wie ein Integer (alle ordinalen Typen) eh nur einen Wert haben kann. (dafür ist das = da)

Bei einem SET (je Wert ein Bit im Typen) oder Listen, da kann man schön auch mit IN arbeiten. (mit = dort ALLE Bits gleichzeitig vergleichen)



In deinem Fall brauchst eher eine Konstante, wo du mit IN nachsehn kannst.
Sobald auch nur ein Wert im SET mit einem Wert vordefiniert ist (=), werden die enthaltenen ENUMS nicht mehr in der RTTI gespeichert.
Und man kann nicht nachsehen, ob es einen Wert darin gibt. (nur das High kann man noch benutzten)

z.B.
Delphi-Quellcode:
type
  //TMyField = (of0, of1, of2, of3, ofBelegnummer, of5, ofBelegdatum, ofKonto, ofKontoName, ofBank, ofZahldatum); // hier könnte man auch via RTTI/TypInfo im Typ nachsehn, anstatt in einer Konstante/Variable
  TMyField = (ofBelegnummer=4, ofBelegdatum=6, ofKonto, ofKontoName, ofBank, ofZahldatum);
  TMyFields = set of TMyField;
const
  MyOrderFields: TMyFields = [ofBelegnummer, ofBelegdatum, ofKonto, ofKontoName, ofBank, ofZahldatum];

if TOrderField(ACol) in MyOrderFields then
oder
Delphi-Quellcode:
const
  ofBelegnummer = 4;
  ofBelegdatum = 6;
  ofKonto = 7;
  ofKontoName = 8;
  ofBank = 9;
  ofZahldatum = 10;

type
  TMyFields = set of Byte; // oder auch nur = set of 0..10;
const
  MyOrderFields: TMyFields = [ofBelegnummer, ofBelegdatum, ofKonto, ofKontoName, ofBank, ofZahldatum];

if ACol in MyOrderFields then
oder
...



Man kann sich auch einen Helper schreiben, welcher ... naja.
Ich hatte mir mal vor Jahren das Delphi-Referenz durchsuchenTObject.IsClass etwas erweitert.
Delphi-Quellcode:
type
  TObjectHelper = class helper for TObject
  public
    function ClassIs(const ClassName: string): Boolean; overload; // entspricht dem IS ... prüft, ob die Klasse von der "namentlich" angegebenen Klasse abgeleitet wurde (TObject.IsClassName prüft nur, ob es genau die Klasse ist und beachtet auch kein NIL)
    function ClassIs(const ClassNames: array of string): Boolean; overload;
    function ClassIs(const ClassType: TClass): Boolean; overload;
    function ClassIs(const ClassTypes: array of TClass): Boolean; overload;

    function NameIs(const Objects: array of TObject): Boolean; overload; // Self in Objects
    function NameIs(const Names: array of string): Boolean; overload; // TComponent(Self).Name in Names

    // und noch bissl mehr Nützliches
  end;

// ObjektZeiger vergleichen
if Column.NameIs(ColBelegnummer, ColBelegdatum, ColKonto, ColKontoName, ColBank, ColZahldatum) then

// Column.Name prüfen (case-insentitive)
if Column.NameIs('ColBelegnummer', 'ColBelegdatum', 'ColKonto', 'ColKontoName', 'ColBank', 'ColZahldatum') then


Aber denkbar wäre es inzwischen auch gut als Class Operator für IN
if Column in [ColBelegnummer, ColBelegdatum, ColKonto, ColKontoName, ColBank, ColZahldatum] then
$2B or not $2B

Geändert von himitsu (18. Feb 2021 um 10:31 Uhr)
  Mit Zitat antworten Zitat