Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Wie läßt sich die Anzahl der Elemente eines AufzählungsTyps bestimmen? (https://www.delphipraxis.net/212901-wie-laesst-sich-die-anzahl-der-elemente-eines-aufzaehlungstyps-bestimmen.html)

Andreas13 21. Apr 2023 12:10

Delphi-Version: XE5

Wie läßt sich die Anzahl der Elemente eines AufzählungsTyps bestimmen?
 
Hallo Community,
ich möchte gerne die die Anzahl der Elemente eines AufzählungsTyps ermitteln.
Beispiel:
Delphi-Quellcode:
Type
  MyType = (aa, bb, cc, dd, ee); // --> 5 sollte bestimmt werden
Gibt es dazu eine Delphi-Funktion?

Danke für jede Idee + Anregung im Voraus!

Viele Grüße
Andreas

Delphi.Narium 21. Apr 2023 12:50

AW: Wie läßt sich die Anzahl der Elemente eines AufzählungsTyps bestimmen?
 
Delphi-Quellcode:
Anzahl := High(MyType) + 1;
https://www.delphipraxis.net/104698-...ermitteln.html

Uwe Raabe 21. Apr 2023 12:58

AW: Wie läßt sich die Anzahl der Elemente eines AufzählungsTyps bestimmen?
 
Funktioniert aber nicht bei solchen Deklarationen (aus dem Delphi DokWiki):
Delphi-Quellcode:
type
  Size = (Small = 5, Medium = 10, Large = Small + Medium);

Delphi.Narium 21. Apr 2023 12:59

AW: Wie läßt sich die Anzahl der Elemente eines AufzählungsTyps bestimmen?
 
Steht alles ausführlich im verlinkten Post aus der DelphiPraxis ;-)

Andreas13 21. Apr 2023 13:11

AW: Wie läßt sich die Anzahl der Elemente eines AufzählungsTyps bestimmen?
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1521344)
Delphi-Quellcode:
Anzahl := High(MyType) + 1;
https://www.delphipraxis.net/104698-...ermitteln.html

Sorry Delphi.Narium,
has hatte ich bereits probiert: XE5 meldet:
[dcc32 Fehler] Anzahl_Elemente_AufzaehlungsTyps_1.dpr(52): E2010 Inkompatible Typen: 'Integer' und 'MyType'
Grüße
Andreas

Andreas13 21. Apr 2023 13:13

AW: Wie läßt sich die Anzahl der Elemente eines AufzählungsTyps bestimmen?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1521345)
Funktioniert aber nicht bei solchen Deklarationen (aus dem Delphi DokWiki):
Delphi-Quellcode:
type
  Size = (Small = 5, Medium = 10, Large = Small + Medium);

Danke Uwe,
aber obige Type-Deklaration paßt leider nicht zu meinem Anwendungsfall :(
Grüße, Andreas

Delphi.Narium 21. Apr 2023 13:18

AW: Wie läßt sich die Anzahl der Elemente eines AufzählungsTyps bestimmen?
 
Zitat:

Zitat von Andreas13 (Beitrag 1521347)
Zitat:

Zitat von Delphi.Narium (Beitrag 1521344)
Delphi-Quellcode:
Anzahl := High(MyType) + 1;
https://www.delphipraxis.net/104698-...ermitteln.html

Sorry Delphi.Narium,
has hatte ich bereits probiert: XE5 meldet:
[dcc32 Fehler] Anzahl_Elemente_AufzaehlungsTyps_1.dpr(52): E2010 Inkompatible Typen: 'Integer' und 'MyType'
Grüße
Andreas

Dann die Variante mit der For-Schleife aus verlinktem Post probieren.
Delphi-Quellcode:
var
  i: TMyEnum;
  Zahler: Integer;
begin
  Zahler := 0;
  for i := Low(TMyEnum) to High(TMyEnum) do
    Inc(Zaehler);
end;

Andreas13 21. Apr 2023 13:18

AW: Wie läßt sich die Anzahl der Elemente eines AufzählungsTyps bestimmen?
 
So funktioniert es:
Delphi-Quellcode:
Anzahl := Ord(High(MyType)) + 1;
Danke Euch für die Hilfe!

Grüße, Andreas

dummzeuch 21. Apr 2023 13:24

AW: Wie läßt sich die Anzahl der Elemente eines AufzählungsTyps bestimmen?
 
Zitat:

Zitat von Andreas13 (Beitrag 1521347)
Zitat:

Zitat von Delphi.Narium (Beitrag 1521344)
Delphi-Quellcode:
Anzahl := High(MyType) + 1;
https://www.delphipraxis.net/104698-...ermitteln.html

Sorry Delphi.Narium,
has hatte ich bereits probiert: XE5 meldet:
[dcc32 Fehler] Anzahl_Elemente_AufzaehlungsTyps_1.dpr(52): E2010 Inkompatible Typen: 'Integer' und 'MyType'
Grüße
Andreas

Delphi-Quellcode:
Anzahl := Ord(High(MyType))+1;

Andreas13 21. Apr 2023 13:26

AW: Wie läßt sich die Anzahl der Elemente eines AufzählungsTyps bestimmen?
 
Danke, Thomas! :-D
bin inzwischen auch drauf gekommen...:oops:
Grüße, Andreas

himitsu 21. Apr 2023 13:27

AW: Wie läßt sich die Anzahl der Elemente eines AufzählungsTyps bestimmen?
 
Jupp, High liefert nicht die Anzahl den Index, sondern das Element, also ee.

Mit Ord lässt sich der Index in einen anderen ordinalen Typen (Integer) konvertieren.

Delphi-Quellcode:
Anzahl := Ord(High(MyType)) + 1;
Anzahl := Succ(Ord(High(MyType)));
//Anzahl := Ord(Succ(High(MyType)));

Ja, wenn man die Indize im Typen manipuliert/vorgibt, und dabei Lücken entstehen, dann fehlt in der Typeinfo die Liste der Elementnamen (auch wenn es dafür einen einfachen Bugfix gäbe, aber Emba wollte nicht)
und somit fehlt auch die Möglichkeit den Teilbereich zu bestimmen. (dann geht es nur noch über die Speichergröße des ganzen Enum und die ist nunmal 1, 2, 4 oder 8 Bytes, bzw. beim Set bis 32 Byte, also 0..255)

Andreas13 21. Apr 2023 13:29

AW: Wie läßt sich die Anzahl der Elemente eines AufzählungsTyps bestimmen?
 
Danke, Himitsu! :thumb::angel:

[Edit]
Delphi-Quellcode:
Anzahl := Ord(Succ(High(MyType)));
liefert die Meldung:
[dcc32 Fehler]E1012 Konstantenausdruck verletzt untere Grenzen

freimatz 21. Apr 2023 15:15

AW: Wie läßt sich die Anzahl der Elemente eines AufzählungsTyps bestimmen?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1521345)
Funktioniert aber nicht bei solchen Deklarationen (aus dem Delphi DokWiki):
Delphi-Quellcode:
type
  Size = (Small = 5, Medium = 10, Large = Small + Medium);

Das ist auch kein (echter) AufzählungsTyp, sondern so ein Spezialgewürge :duck:

peterbelow 21. Apr 2023 16:20

AW: Wie läßt sich die Anzahl der Elemente eines AufzählungsTyps bestimmen?
 
Zitat:

Zitat von Andreas13 (Beitrag 1521354)
Danke, Himitsu! :thumb::angel:

[Edit]
Delphi-Quellcode:
Anzahl := Ord(Succ(High(MyType)));
liefert die Meldung:
[dcc32 Fehler]E1012 Konstantenausdruck verletzt untere Grenzen

Delphi-Quellcode:
Anzahl := Succ(Ord(High(MyType)));
Succ(High(MyType)) wird von Compiler als vom Typ MyType interpretiert und das gibt natürlich einen Overflow oder Range Check Fehler.

himitsu 21. Apr 2023 17:23

AW: Wie läßt sich die Anzahl der Elemente eines AufzählungsTyps bestimmen?
 
Ohhh, Na gut, inzwischen ist die blöde Bereichsprüfung nun standardmäßig aktiv,
aber hätte gedacht, die schlägt hier nur auf die "reale" Speichergröße (ein Byte = 256) an. :oops:

Mal ausprobieren, ob die auch meckert, wenn man was Größeres zuweisen will.
Delphi-Quellcode:
Test := MyType(123);


[add]
Jo, Zuweisen und Vergleichen geht immernoch,
aber beim Rechnen knallt es wirklich überall.
Delphi-Quellcode:
type
  MyType = (aa, bb, cc, dd, ee);

procedure TForm2.FormCreate(Sender: TObject);
begin
  var Test := MyType(5);
  Test := Pred(Test); // aka Dec(Test);
  if Test = High(MyType) then
    Beep;

  Test := MyType(6);
  Dec(Test);
  if Test = Low(MyType) then ;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 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