Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Ist string eine Enumeration? (https://www.delphipraxis.net/201432-ist-string-eine-enumeration.html)

DCoderHH 22. Jul 2019 11:09

Ist string eine Enumeration?
 
Hallo,

ich habe zur Laufzeit einen String wie z.B. 'TFontStyle' oder 'TObject'. Ich benötige nun eine Funktion, die mir zurückgibt ob der String eine Enumeration ist oder nicht. Wie kann ich das prüfen? In einem Beispiel soll bei 'TFontStyle' true und 'TObject' false zurückgegeben werden. Danke!

Der schöne Günther 22. Jul 2019 11:30

AW: Ist string eine Enumeration?
 
// Edit:

Kommando zurück, für dein Beispiel mit TFontStyle scheint es nicht zu funktionieren da keine ausreichenden RTTI-Informationen vorhanden sind. Schade.

Delphi-Quellcode:
// JCL_DEBUG_EXPERT_GENERATEJDBG OFF
// JCL_DEBUG_EXPERT_INSERTJDBG OFF
program Project7;

{$APPTYPE CONSOLE}
{$R *.res}

uses
   System.SysUtils,
   System.Rtti,
   System.StrUtils;

type
   TEnumerations = TArray<TRttiEnumerationType>;

function getAllEnumerations(): TEnumerations;
var
   context: TRttiContext;
   rttiType: TRttiType;
begin
   Result := [];
   context := TRttiContext.Create();
   for rttiType in context.GetTypes() do
      if (rttiType is TRttiEnumerationType) then
         Result := Result + [rttiType as TRttiEnumerationType];
end;

procedure printEnumerations(const enumerations: TEnumerations); inline;
var
   enumeration: TRttiEnumerationType;
begin
   for enumeration in enumerations do
      WriteLn(enumeration.ToString());
end;

procedure checkForEnumString(
   const enumeration: TRttiEnumerationType;
   const stringValue: String
);
begin
   if System.StrUtils.MatchStr(stringValue, enumeration.GetNames()) then
      WriteLn(stringValue, ' is a value of ', enumeration.ToString());
end;

procedure p();
const
   someEnumString = 'dkStatic';
var
   enumeration: TRttiEnumerationType;
begin
   for enumeration in getAllEnumerations() do
      checkForEnumString(enumeration, someEnumString);
end;

begin
   try
      p();
   except
      on E: Exception do
         Writeln(E.ClassName, ': ', E.Message);
   end;
   readln;
end.
ergibt

Code:
dkStatis is a value of TDispatchKind

peterbelow 22. Jul 2019 12:21

AW: Ist string eine Enumeration?
 
Zitat:

Zitat von DCoderHH (Beitrag 1437252)
Hallo,

ich habe zur Laufzeit einen String wie z.B. 'TFontStyle' oder 'TObject'. Ich benötige nun eine Funktion, die mir zurückgibt ob der String eine Enumeration ist oder nicht. Wie kann ich das prüfen? In einem Beispiel soll bei 'TFontStyle' true und 'TObject' false zurückgegeben werden. Danke!

RTTI ist die einzige Möglichkeit um aus einem Typnamen in einem String den zugehörigen Typ zu identifizieren. Falls Du allerdings nur für einen begrenzten Satz von Typen sowas brauchst und dieser zur compiler time bekannt ist kannst Du dir einfach dein eigenes TDictionary<string, pTypeinfo> bauen, unter Verwendung der guten alten TypeInfo-Funktion.


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