Enum in String und zurück umwandeln

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
TBug
Beiträge: 177
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Enum in String und zurück umwandeln

Beitrag von TBug »

Da ich nun keine Idee mehr habe, was ich noch ausprobieren kann frage ich einmal in die Runde.

1. Wie kann ich aus einen TComponentStyle die Anzahl der möglichen Enum-Werte erhalten?

2. Wie kann ich die Enum-Werte eines TComponentStyle in einen String umwandeln, oder aus dem String 'csInheritable' den entsprechenden Enum-Wert erhalten?


.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Enum in String und zurück umwandeln

Beitrag von Michl »

2. http://www.freepascal.org/docs-html/rtl/typinfo/getenumname.html

z.B.:

Code: Alles auswählen

  Caption := GetEnumName(TypeInfo(WindowState), Ord(WindowState)); 


[Edit]
Geht bei TComponentStyle nicht, da das ein Set of ... ist - Sorry!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

TBug
Beiträge: 177
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: Enum in String und zurück umwandeln

Beitrag von TBug »

Leider hast Du übersehen, dass es sich um TComponentStyle handelt und somit nicht zum Erfolg führt.

Dass das mit einem TWindowState funktioniert ist klar, denn das ist als "echter Enum" deklariert:

Code: Alles auswählen

TWindowState = (wsNormal, wsMinimized, wsMaximized, wsFullScreen);


TComponentStyle hingegen ist ein "Set-Of-Enums"

Code: Alles auswählen

TComponentStyle = set of (csInheritable, csCheckPropAvail, csSubComponent, csTransient); 




[EDIT]
Habe gerade gesehen, dass Dir das schon aufgefallen ist.


.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Enum in String und zurück umwandeln

Beitrag von Michl »

Da das Set direkt zugewiesen wurde, kann man mMn nicht auf die Enums zugreifen. Ein Workaround könnte sein, dass man das originale Set nochmals mit den Enums nachbaut (die Frage ist, ob sich das lohnt):

Code: Alles auswählen

procedure TFormMain.Button1Click(Sender: TObject);   
type
  TComponentStyles = (csInheritable, csCheckPropAvail, csSubComponent, csTransient);
  THackComponentStyle = set of TComponentStyles;
var
  ComponentStyles: TComponentStyles;
  HackComponentStyle: THackComponentStyle;
begin
  HackComponentStyle := THackComponentStyle(Button1.ComponentStyle);
  for ComponentStyles in HackComponentStyle do
    Memo1.Lines.Add(GetEnumName(TypeInfo(TComponentStyles), Ord(ComponentStyles)));
end

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Antworten