Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: Set of Enumeration Type in Datenbank-Parameter zuweisen

  Alt 13. Jun 2014, 00:24
Nja, es geht auch andersrum.


Byte(SomeTasteBud) := TasteBuds.ToEnum(tbSour);

oder
Delphi-Quellcode:
var
  SomeTasteBudByte: Byte absolute SomeTasteBud;

SomeTasteBud := TasteBuds.ToEnum(tbSour);

Oder du definierst das TEnumHelper.ToEnum als Prozedur und gibst das Result ebenfalls als typlosen VAR/OUT-Parameter raus, genauso wie beim CONST.



Wenn du dir in den letzten paar 5 Jahren mal ein neueres Delph zugelegt hättest, dann ginge auch sowas.

Delphi-Quellcode:
RTTIServices = class
  class function SetToStr<TSet>(const Value: TSet; Brackets: Boolean=True): string; static;
  class function StrToSet<TSet>(const Value: string): TSet; static;

  class function EnumToStr<TEnum>(const Value: TEnum): string; static;
  class function StrToEnum<TEnum>(const Value: string): TEnum; static;
end;



var
  S: string;
  E: TTasteBuds;

S := RTTIServices.EnumToStr<TTasteBuds>(tbSour);
E := RTTIServices.StrToEnum<TTasteBuds>('tbSour');
Das entspricht in etwa deinem Code, wenn man den Typ direkt mit übergibt
Delphi-Quellcode:
ShowMessage(TasteBuds.ToString(TypeInfo(TTasteBuds), Ord(tbSour))); // 'tbSour'

SomeTasteBud := TTasteBuds(TasteBuds.ToEnum(TypeInfo(TTasteBuds), 'tbSour')); // tbSour


Es liese sich im Aufruf nochmal etwas kürzen, wenn man den generischen Typ nicht an die Methoden, sondern an die Klasse bindet.
Delphi-Quellcode:
type
  EnumService<TEnum> = class
    class function EnumToStr(const Value: TEnum): string; static;
    class function StrToEnum(const Value: string): TEnum; static;
  end;

type
  X = EnumService<TTasteBuds>;

var
  S: string;
  E: TTasteBuds;

S := EnumService<TTasteBuds>.EnumToStr(tbSour);
E := EnumService<TTasteBuds>.StrToEnum('tbSour');

S := X.EnumToStr(tbSour);
E := X.StrToEnum('tbSour');



Und nein, TOrdType ist nicht immer richtig.
Eigentlich msstest du aus dem TypeInfo die Enum-Größe auslesen und dann entweder nach Byte, Word oder Integer casten,
denn wenn dein ENUM mehr als 256 Werte enthält, dann hast du ein Problem.
$2B or not $2B

Geändert von Daniel (20. Nov 2014 um 08:06 Uhr)
  Mit Zitat antworten Zitat