Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#4

AW: TOLEEnum Umwandlung aus String

  Alt 5. Nov 2024, 11:57
Eine syntaktisch funktionierende Lösung wäre eine Deklaration in etwa so:
Delphi-Quellcode:
type
{$SCOPEDENUMS ON}
  TCountryCode = (unk, AL, AD, AT, BA, BG, ...);
Damit würde TRttiEnumerationType.GetValue<TCountryCode>(AStrin g) einen AString wie z.B. "AL" oder "BG" in den entsprechenden TCountryCode umwandeln, also TCountryCode.AL bzw. TCountryCode.BG (Das "CountryCode2_" Prefix kann man sich dann sparen).

Allerdings muss man dann noch die Umsetzung in die entsprechenden TOleEnum-Werte realisieren. Dazu bietet sich eine record helper an, in dem man auch gleich die String-Umwandlung unterbringen kann:
Delphi-Quellcode:
type
  TCountryCodeHelper = record helper for TCountryCode
  private const
    cOleEnums: array[TCountryCode] of Cardinal = (
      CountryCode2_unk,
      CountryCode2_AL,
      CountryCode2_AD,
      ...
      );
    function GetAsOleEnum: Cardinal;
    function GetAsString: string;
    procedure SetAsOleEnum(const Value: Cardinal);
    procedure SetAsString(const Value: string);
  public
    property AsOleEnum: Cardinal read GetAsOleEnum write SetAsOleEnum;
    property AsString: string read GetAsString write SetAsString;
  end;

function TCountryCodeHelper.GetAsOleEnum: Cardinal;
begin
  Result := cOleEnums[Self];
end;

function TCountryCodeHelper.GetAsString: string;
begin
  Result := TRttiEnumerationType.GetName<TCountryCode>(Self);
end;

procedure TCountryCodeHelper.SetAsOleEnum(const Value: Cardinal);
begin
  for var idx := Low(cOleEnums) to High(cOleEnums) do begin
    if cOleEnums[idx] = Value then begin
      Self := idx;
      Exit;
    end;
  end;
  Self := TCountryCode.unk;
end;

procedure TCountryCodeHelper.SetAsString(const Value: string);
begin
  try
    Self := TRttiEnumerationType.GetValue<TCountryCode>(Value);
    if Ord(Self) < Ord(Low(TCountryCode)) then
      raise EInvalidCast.CreateRes(@SInvalidCast);
  except
    on EInvalidCast do
      Self := TCountryCode.unk;
  end;
end;
Die Verwendung ist dann schon deutlich aufgeräumter, aber dafür muss man schon einen gewissen Aufwand treiben.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat