W pytaniu here wyświetlana jest metoda tworzenia kompatybilnej TValue do użycia z SetValue. Próbuję zrobić ogólną wersję tego, aby użyć RTTI do przechowywania klasy w pliku INI. To jest mój wyciąć kod:Jak utworzyć ogólny telewizor dla wyliczonego pola RTTI?
procedure TMyClass.LoadRTTI(xObject: TObject);
var
LContext: TRttiContext;
LClass: TRttiInstanceType;
xField : TRttiField;
szNewValue : String;
xValue : TValue;
begin
LContext := TRttiContext.Create;
LClass := LContext.GetType(xObject.ClassType) as TRttiInstanceType;
for xField in LClass.GetDeclaredFields do
begin
szNewValue := IniFile.ReadString(szSection, xField.Name, '');
if szNewValue <> '' then // emumerated will be '0' (zero) as that is what GetValue.AsString returns
begin
case xField.FieldType.TypeKind of
tkEnumeration: xValue := StrToIntDef(szNewValue, xField.GetValue(xObject).AsOrdinal);
end;
xField.SetValue(xObject, xValue); // FAILS HERE with 'Invalid calss typecast
end;
end;
end;
odpowiedź odwołanie, rozwiązanie było uzyskać wartość przy użyciu metody TValue.From(), ale wydaje się, że wymagają zmienną odpowiedniego typu. Nie mam takiego typu, ponieważ mój kod nie wie, co to jest.
Poszukuję przykładu ogólnego sposobu uzyskania wartości w ciągu znaków z RTTI, a następnie ponownie go wstawię. Nie znalazłem jeszcze dobrego samouczka, który by to opisał.
OK, zadziałało dobrze, gdy przestałem być sprytny w moim zbawczym kodzie. Aby uzyskać wartość do zapisania w INI, wystarczy użyć xField.GetValue (xObject) .ToString; – mj2008