![]() |
Enumerationen zu Symbolen auflösen
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:
Beispiel Abfrage:
myPrinterState = (
prnStateReady, // ready to print prnStateBusy, // just printing prnStateFinished, // printing finished prnStateChanging // changing output direction );
Delphi-Quellcode:
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.
if Printer.currentState = prnStateReady then
Printer.print; 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] |
Re: Enumerationen zu Symbolen auflösen
Bin ich ein Schussel. Hab's schon selber gefunden. :oops:
Delphi-Quellcode:
@Moderatoren: Ab ins Codelibrary :?:
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; [edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit] |
Re: Enumerationen zu Symbolen auflösen
Zwei Dinge, die mir auffallen:
1.) Zitat:
2.)
Code:
Bin mir nicht sicher, aber müsste das nicht erst mal created werden,
begin
with result do bevor Du darauf zugreifst, damit Speicherplatz reserviert wird? Das könnte so(nst) vielleicht eine Exception auslösen! |
Re: Enumerationen zu Symbolen auflösen
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. :) |
Re: Enumerationen zu Symbolen auflösen
Ja, ich wollte das nur mal erwähnen um Dir Denkarbeit abzunehmen. :wink:
|
AW: Enumerationen zu Symbolen auflösen
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:
mit
TWMParameter = (wpPort = -1, wpUser = -2, wpFallID = -3, wpFzFID = -4, wpSitzungsID = -5, wpAnaID = -6,
wpUserRoles = -7, wpHandle = -8)
Delphi-Quellcode:
wollte ich gerne den in intParam steckenden Wert zu Debugzwecken "verklartexten".
Memo1.Lines.Add(GetEnumName(TypeInfo(TWMParameter), intParam));
Das geht aber leider nicht, denn das führt zu: Zitat:
Sherlock |
AW: Enumerationen zu Symbolen auflösen
Du darfst keine Zahlen verwenden. Warum genau das so ist, weiß ich leider nicht.
Also anstatt:
Delphi-Quellcode:
das hier
TWMParameter = (wpPort = -1, wpUser = -2, wpFallID = -3, wpFzFID = -4, wpSitzungsID = -5, wpAnaID = -6,
wpUserRoles = -7, wpHandle = -8)
Delphi-Quellcode:
TWMParameter = (wpPort, wpUser, wpFallID, wpFzFID, wpSitzungsID, wpAnaID,
wpUserRoles, wpHandle) |
AW: Enumerationen zu Symbolen auflösen
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. :angle2: |
AW: Enumerationen zu Symbolen auflösen
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:09 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 by Thomas Breitkreuz