AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Enumerationen zu Symbolen auflösen

Ein Thema von Phoenix · begonnen am 4. Sep 2003 · letzter Beitrag vom 7. Apr 2011
Antwort Antwort
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#1

Enumerationen zu Symbolen auflösen

  Alt 4. Sep 2003, 15:02
Hi Leute!

Folgendes Problem:
Es gibt eine Enumeration (irgendwas zwischn 180 und 220 Werten).
Werte aus der Enumeration werden innerhalb des Delphi-Quelltextes ja anhand des Namen identifiziert.

Beispiel Definition:
Delphi-Quellcode:
myPrinterState = (
   prnStateReady,         // ready to print
   prnStateBusy,         // just printing
   prnStateFinished,      // printing finished
   prnStateChanging      // changing output direction
);
Beispiel Abfrage:
Delphi-Quellcode:
if Printer.currentState = prnStateReady then
   Printer.print;
Das ist ja beim Coden schön und gut, jedoch gibt es die States zur Laufzeit nur noch als Byte-Werte: die Namen gehen beim Compilieren irgendwo flöten.

Soweit ich weiss gibt es aber eine Möglichkeit irgendwie über die RTTI (Run Time Type Information) an die Namen zu kommen - auch zur Laufzeit.

Ziel ist es, die Namen einer Enumeration zur Laufzeit zu erhalten und z.B. in eine Listbox zu stecken, damit ich dem Benutzer nicht den Index der Enumeration anbieten muss.

In Hinblick auf die Wiederverwendbarkeit möchte ich aber auch nicht hergehen und ein array of string mit über 200 Werten hardcoden, die die gleichen Indices hat. Das finde ich extrem unsauber gelöst.

Habt Ihr eine Idee, wie ich an diese Informationen komme? Unter anderem auch, wie ich zur Laufzeit an die Anzahl der Werte in der Enumeration komme?

[edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit]
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#2

Re: Enumerationen zu Symbolen auflösen

  Alt 4. Sep 2003, 15:17
Bin ich ein Schussel. Hab's schon selber gefunden.

Delphi-Quellcode:
uses Typinfo;

procedure TFrmTestMain.GetEnumNames: TStringList;
var
   si : SmallInt;
   str : String;
begin
   with result do
   begin
      Clear;

      for si := ord( low( CPrinterPaperSize ) ) to
                ord( high( CPrinterPaperSize ) ) do
      begin
         str := getEnumName( typeInfo( CPrinterPaperSize ), si );
         add(str);
      end;
   end;
end;
@Moderatoren: Ab ins Codelibrary

[edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit]
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Dannyboy

Registriert seit: 4. Aug 2003
Ort: Delphi-Heaven
418 Beiträge
 
Delphi 7 Personal
 
#3

Re: Enumerationen zu Symbolen auflösen

  Alt 4. Sep 2003, 15:30
Zwei Dinge, die mir auffallen:

1.)
Zitat:
procedure TFrmTestMain.GetEnumNames: TStringList;
Da mach' mal besser eine Funktion daraus, wegen dem Ergebnistyp (result).

2.)
Code:
begin
   with result do
Bin mir nicht sicher, aber müsste das nicht erst mal created werden,
bevor Du darauf zugreifst, damit Speicherplatz reserviert wird? Das
könnte so(nst) vielleicht eine Exception auslösen!
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#4

Re: Enumerationen zu Symbolen auflösen

  Alt 4. Sep 2003, 15:32
Hey. hab ich gesagt das mein Code läuft?

Ich hab nur den Rumpf genommen, bei mir füllt das ja auch ne Combobox.

Aber Prinzipiell hast Du freilich recht.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Dannyboy

Registriert seit: 4. Aug 2003
Ort: Delphi-Heaven
418 Beiträge
 
Delphi 7 Personal
 
#5

Re: Enumerationen zu Symbolen auflösen

  Alt 4. Sep 2003, 15:33
Ja, ich wollte das nur mal erwähnen um Dir Denkarbeit abzunehmen.
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#6

AW: Enumerationen zu Symbolen auflösen

  Alt 6. Apr 2011, 16:19
Zunächst: Sorry fürs ausgraben.

Ich würde das geschilderte Verfahren gerne nutzen, aber es klappt für eine bestimmte Enumeration nicht. Deklariert ist sie wie folgt (leicht verkürzt);
Delphi-Quellcode:
  TWMParameter = (wpPort = -1, wpUser = -2, wpFallID = -3, wpFzFID = -4, wpSitzungsID = -5, wpAnaID = -6,
    wpUserRoles = -7, wpHandle = -8)
mit
Memo1.Lines.Add(GetEnumName(TypeInfo(TWMParameter), intParam)); wollte ich gerne den in intParam steckenden Wert zu Debugzwecken "verklartexten".
Das geht aber leider nicht, denn das führt zu:

Zitat:
[DCC Fehler] E2134 Typ 'TWMParameter' besitzt keine Typinformation
Weiss da jemand was zu ist?

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#7

AW: Enumerationen zu Symbolen auflösen

  Alt 6. Apr 2011, 17:33
Du darfst keine Zahlen verwenden. Warum genau das so ist, weiß ich leider nicht.

Also anstatt:
Delphi-Quellcode:
TWMParameter = (wpPort = -1, wpUser = -2, wpFallID = -3, wpFzFID = -4, wpSitzungsID = -5, wpAnaID = -6,
    wpUserRoles = -7, wpHandle = -8)
das hier
Delphi-Quellcode:
TWMParameter = (wpPort, wpUser, wpFallID, wpFzFID, wpSitzungsID, wpAnaID,
    wpUserRoles, wpHandle)
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Enumerationen zu Symbolen auflösen

  Alt 6. Apr 2011, 17:44
Sobald auch nur ein Wert vordefiniert ist, erstellt Delphi einfach keine RTTI-Infos für diese Namen (die Liste ist leer)
und wirft dann beim Versuch diese Auszulesen eine Exception, da die Delphi-Entwickler im Gegenzug vergessen haben zu prüfen, ob überhaupt was in der Liste drin ist.

PS: Von mir gibt es genau dazu irgendwo schon einen Thread.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#9

AW: Enumerationen zu Symbolen auflösen

  Alt 7. Apr 2011, 07:50
Hatte mir schon gedacht, daß es an den Zahlen liegt...sehr Schade. Danke für die Infos.

Ich geh jetzt ein bisschen weinen und dann alles von Hand tippen

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Antwort Antwort


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 09:06 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