TValue.AsType <T>с типами перечислений в Delphi - PullRequest
0 голосов
/ 28 декабря 2018

Запись этого в Delphi

uses System.Classes;
...
var
  A: TAlignment;
  Value: TValue;
begin
  Value := 0;
  A := Value.AsType<TAlignment>();
end;

вызывает EInvalidCast в AsType.

Есть ли способ привести к любому типу перечисления из целочисленного значения с TValue?

Это, конечно, очевидный ответ:

A := TAlignment(Value);

но я бы хотелпредоставляет универсальную функцию, которая работает и с другими типами.

1 Ответ

0 голосов
/ 28 декабря 2018

Это, кажется, делает это:

  if (PTypeInfo(TypeInfo(TAlignment))^.Kind = tkEnumeration) and (Value.TypeInfo.Kind = tkInteger ) then
    case System.TypInfo.GetTypeData(TypeInfo(TAlignment))^.OrdType of
      otUByte, otSByte: PByte(@A)^ := Value.AsInteger;
      otUWord, otSWord: PWord(@A)^ := Value.AsInteger;
      otULong, otSLong: PInteger(@A)^ := Value.AsInteger;
    end
  else
    A := Value.AsType<TAlignment>();

, где TAlignment также может быть T в универсальной функции.

(Скопировал идею из TRttiEnumerationType.GetValue)

...