![]() |
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) |
AW: Wie läßt sich die Anzahl der Elemente eines AufzählungsTyps bestimmen?
Danke, Himitsu! :thumb::angel:
[Edit]
Delphi-Quellcode:
liefert die Meldung:
Anzahl := Ord(Succ(High(MyType)));
[dcc32 Fehler]E1012 Konstantenausdruck verletzt untere Grenzen |
AW: Wie läßt sich die Anzahl der Elemente eines AufzählungsTyps bestimmen?
Zitat:
|
AW: Wie läßt sich die Anzahl der Elemente eines AufzählungsTyps bestimmen?
Zitat:
Delphi-Quellcode:
Succ(High(MyType)) wird von Compiler als vom Typ MyType interpretiert und das gibt natürlich einen Overflow oder Range Check Fehler.
Anzahl := Succ(Ord(High(MyType)));
|
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 20:07 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