AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Anzahl der Elemente eines Aufzählungstyps ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

Anzahl der Elemente eines Aufzählungstyps ermitteln

Ein Thema von Ares · begonnen am 9. Dez 2007 · letzter Beitrag vom 9. Dez 2007
Antwort Antwort
Seite 2 von 2     12   
Ares

Registriert seit: 5. Dez 2002
269 Beiträge
 
#11

Re: Anzahl der Elemente eines Aufzählungstyps ermitteln

  Alt 9. Dez 2007, 14:59
Das Ganze müsste irgendwie so aussehen:

Delphi-Quellcode:
function EnumLength(Enum: Ordinaltyp): Integer;
var i: Ordinaltyp;
begin
  result := 0;
  try
    for i:=Low(Enum) to High(Enum) do
      inc(result);
  except

  end;
end;


ODER

function EnumLength(Enum: Ordinaltyp): Integer;
begin
  result:= High(Enum) + 1;
end;
In beiden Fällen muss ich wissen, was ich an Stelle von Ordinaltyp angeben muss.
  Mit Zitat antworten Zitat
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#12

Re: Anzahl der Elemente eines Aufzählungstyps ermitteln

  Alt 9. Dez 2007, 15:00
Wie bereits geschrieben, integer oder besser TMyEnum
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#13

Re: Anzahl der Elemente eines Aufzählungstyps ermitteln

  Alt 9. Dez 2007, 15:03
Könnte man u.U. über die Unit TypeInfo und der RTTI etwas herausfinden?
Die Funktion GetEnumName hört sich doch gut an oder man geht über TypeInfo: PTypeInfo und dort über @T^.NameList. Aber aufgrund der fehlenden Doku in diesem Bereich (auch bei D6) ist es nicht so einfach zu verstehen was man dort alles machen könnte.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Anzahl der Elemente eines Aufzählungstyps ermitteln

  Alt 9. Dez 2007, 15:10
@Ares wie kommst du jetzt auf eine Klasse (TClass)?

i muß den selben Typ wie der Enumerator haben, also TMyEnum (oder wie er bei dir heißt.)

Try-Except ist hierbei unnötig, wo sollte auch eine Exception auftreten?

und jetzt rate mal wie oft die For-Schleife durchlaufen wird ... genau "High-Low+1"-mal ... und da nur ein Inc drinsteht, wleches die Durchläufe zählt, kann man sich die Durchläufe doch auch gleich ausrechen



Delphi-Quellcode:
type
  TMyEnum = (meEins, meZwei, meDrei);
  TMyEnumEx = (mxEins=1, mxZwei=2, mxSechs=6);

const
  MyEnumEx: Set of TMyEnumEx = [mxEins, mxZwei, mxSechs];

procedure TForm1.Button1Click(Sender: TObject);
var
  i: TMyEnum;
  i2: TMyEnumEx;
  Zaehler1, Zaehler2, Zaehler3, Zaehler4, Zaehler5: Integer;
  S: String;
begin
  Zaehler1 := 0;
  for i := Low(TMyEnum) to High(TMyEnum) do
    Inc(Zaehler1);

  Zaehler2 := Ord(High(TMyEnum)) - Ord(Low(TMyEnum)) + 1;

  Zaehler3 := 0;
  for i2 := Low(TMyEnumEx) to High(TMyEnumEx) do
    Inc(Zaehler3);

  Zaehler4 := Ord(High(TMyEnumEx)) - Ord(Low(TMyEnumEx)) + 1;

  Zaehler5 := 0;
  for i2 := Low(TMyEnumEx) to High(TMyEnumEx) do
    if i2 in MyEnumEx then
      Inc(Zaehler5);

  S := Format('TMyEnum - For: %d'#13#10
    + 'TMyEnum - Math: %d'#13#10
    + 'TMyEnumEx - For: %d'#13#10
    + 'TMyEnumEx - Math: %d'#13#10
    + 'TMyEnumEx - Const: %d',
    [Zaehler1, Zaehler2, Zaehler3, Zaehler4, Zaehler5]);
  Application.MessageBox(PChar(S), '');
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Ares

Registriert seit: 5. Dez 2002
269 Beiträge
 
#15

Re: Anzahl der Elemente eines Aufzählungstyps ermitteln

  Alt 9. Dez 2007, 15:13
Zitat von MrKnogge:
Wie bereits geschrieben, integer.
Sorry, aber das verstehe ich nicht. Oder vielleicht reden wir an einander vorbei?

Folgendes würde ich gerne realisieren:

Delphi-Quellcode:
type
  TMyEnum = (meEins, meZwei, meDrei);
  ...
 
  int := EnumLength(TMyEnum);
  // --> EnumLength liefert 3 zurück
Hierfür muss ich der Funktion EnumLength jeden beliebigen Aufzählungstyp übergeben können. Wenn ich die Funktion mit i: integer Verwende erhalte ich die Meldung "Inkompatible Typen", weil i vom Typ Integer und Enum vom Typ TClass ist. Hierbei ist noch zu beachten, dass TClass natürlich auch falsch ist. Enum müsste vom Typ TAufzählungstyp sein. Nur weiß ich eben nicht wie ich dies angeben kann.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Anzahl der Elemente eines Aufzählungstyps ermitteln

  Alt 9. Dez 2007, 15:37
eine allgemeine Funktion ist nicht mögilich, denn:

- Enumeratoren verfügen über keine Typeninformationen
- High/Low wird vom Compiler durch Konstanten erstetzt ... dieses sind keine Funktionen

also selbst wenn es möglich wäre alle Enum-Typen an eine Funktion zu übergeben, dann wären innerhalb der Funktion keine Informationen für High/Low verfügbar.
Heißt EnumLength kann immer nur für einen Typ erstellt werden!

allerdings liefert hier EnumLength die Werte für den Typ Integer und nicht für TMyEnum
Also: dieses funktioniert nicht.
Delphi-Quellcode:
function EnumLength(Enum: Integer): Integer;
var i: Integer;
begin
  result := 0;
  for i := Low(Integer) to High(Integer) do
    inc(result);
end;


Var X: TMyEnum;
  Y: TMyEnum2;
EnumLength(Integer(X));
EnumLength(Integer(Y));

Zusammengefasst:
direkte Lösungen wurden alle schon aufgezählt (Zusammenfassung siehe Beitrag #14)

allgemeine Funktionen sind nicht möglich.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#17

Re: Anzahl der Elemente eines Aufzählungstyps ermitteln

  Alt 9. Dez 2007, 15:41
Zitat:
Enumeratoren verfügen über keine Typeninformationen
Lass dich bloß nicht bei solchen Aussagen erwischen. GetEnumName und GetEnumValue aus der Unit TypInfo nehmen Parameter vom Typ PTypeInfo entgegen, die genau diese Typeninformationen des Aufzählungstypen sind.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Anzahl der Elemente eines Aufzählungstyps ermitteln

  Alt 9. Dez 2007, 15:51
TypeInfo(TMyEnumEx)
Zitat von DelphiCompiler:
Typ 'TMyEnumEx' besitzt keine Typinformationen
ergo:
Delphi-Quellcode:
Var P: PTypeInfo;

P := TypeInfo(TMyEnumEx); // geht nicht !!!

Name := GetEnumName(P);
Value := GetEnumValue(P);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#19

Re: Anzahl der Elemente eines Aufzählungstyps ermitteln

  Alt 9. Dez 2007, 15:58
Ich glaube, einen direkten Typ für sowas gibts gar nicht, aber
Delphi-Quellcode:
var int: Integer;
  ...
int := High(DeinEnumTyp) + 1;
erfüllt doch den gleichen Zweck.
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 16:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz