![]() |
Delphi-Version: 5
Verständnisfrage zu TValue
Ich hänge grad ein bissl mit TValue ab. :-/
Meine Aufgabe: - Properties auslesen und die Werte in einem TValue speichern (mancxhe String, manche Integer, manche Boolean) - Diese Werte in einer Datei speichern (da sind sie jetzt alle Strings) - Die Werte wieder in TValue einlesen (da sind sie jetzt immer noch Strings) - TValue den Properties zuweisen (schlägt bei Int+Bool fehl, weil: Strings) auch TValue.AsInteger schlägt fehl, weil: String Muss ich einen TValue, der '123' enthält, explizit mit StrTotInt umwandeln? Was ist der Unterschied zwischen TValue.AsInteger und TValue.Cast()? Danke für Infos. :thumb: |
AW: Verständnisfrage zu TValue
Zitat:
Zitat:
Der in TValue enthaltene Datentyp muss dem der Property entsprechen. Von daher schreibst du im Idealfall den Wert direkt schon als den Datentyp der die Property erwartet in das TValue. |
AW: Verständnisfrage zu TValue
Spring.pas enthält einen Helper für TValue mit Convert Methoden, die in der Lage sind TValue des Typs A in einen TValue des Typs B umzuwandeln.
Das sollte für die beschriebene Aufgabe helfen. |
AW: Verständnisfrage zu TValue
Zitat:
|
AW: Verständnisfrage zu TValue
Zwei Fragen:
Wenn TValue ein Boolean enthält, ergibt TValue.AsString True/False. Frage ich via RTTI PropertyType.TypeKind den Typ einer Boolean-Property ab, erhalte ich als Typ tkEnumeration. Ich hätte Boolean erwartet. Hmm. Eine Enumeration kann aber alles mögliche sein, wie kann ich den String, den ich aus TValue.AsString habe, wieder in eine Enumeration verwandeln? Ähnliches bei einem Set: TVAlue.AsString liefert zB "[akLeft,akTop,akBottom]". RTTI liefert tkSet. Wie kann ich den String wieder passend in das Set umwandeln? |
AW: Verständnisfrage zu TValue
Zitat:
|
AW: Verständnisfrage zu TValue
Zitat:
![]() ![]() |
AW: Verständnisfrage zu TValue
Delphi-Quellcode:
{$APPTYPE CONSOLE}
uses Rtti, SysUtils, Spring; type TMyObject = class private FCount: Integer; FDateTime: TDateTime; FActive: Boolean; public property Active: Boolean read FActive write FActive; property Count: Integer read FCount write FCount; property DateTime: TDateTime read FDateTime write FDateTime; end; var m: TMyObject; props: TArray<TRttiProperty>; values: TArray<string>; i: Integer; ISO8601FormatSettings: TFormatSettings; begin m := TMyObject.Create; m.Active := True; m.Count := 42; m.DateTime := Now; props := TType.GetType(TMyObject).GetDeclaredProperties; SetLength(values, Length(props)); for i := 0 to High(props) do values[i] := props[i].GetValue(m).ToString; for i := 0 to High(props) do Writeln(props[i].Name, ': ', values[i]); Writeln; values[0] := 'False'; values[1] := '12345'; values[2] := '2020-12-31 12:34:00'; // geht sogar im ISO8601 format ... // ... man muss nur ein entsprechendes formatsettings an Convert übergeben ISO8601FormatSettings := TFormatSettings.Create; ISO8601FormatSettings.DateSeparator := '-'; ISO8601FormatSettings.TimeSeparator := ':'; ISO8601FormatSettings.ShortDateFormat := 'YYYY-MM-DD'; ISO8601FormatSettings.ShortTimeFormat := 'hh:mm:ss'; ISO8601FormatSettings.DecimalSeparator := '.'; ISO8601FormatSettings.TimeAMString := ''; ISO8601FormatSettings.TimePMString := ''; for i := 0 to High(props) do props[i].SetValue(m, TValue.From(values[i]).Convert(props[i].PropertyType.Handle, ISO8601FormatSettings)); Writeln('Active: ', m.Active, sLineBreak, 'Count: ', m.Count, sLineBreak, 'DateTime: ', DateTimeToStr(m.DateTime)); Readln; end. |
AW: Verständnisfrage zu TValue
Jein. :-/
Ich bekomme via RTTI PropertyType.TypeKind bzw RTTIype. Das
Code:
wär was ich wollte, aber ich weiß nicht, wie ich Info:PTYpeInfo via RTTI bekomme.
procedure StringToSet(Info: PTypeInfo; var SetParam; const Value: AnsiString);
@Stevie:
Code:
Das kann auch Enums und Sets?
TValue.From(values[i]).Convert(props[i].PropertyType.Handle
|
AW: Verständnisfrage zu TValue
Zitat:
Ich habe
Code:
Wie müsste das weiter gehen?
function RestoreProperty(aInstance: TObject; aPropertyName: string; Value:TValue): Boolean;
Code:
var
prop: TRttiProperty; begin prop := TType.GetType(?); prop.SetValue(? , TValue.From(value).Convert(prop.PropertyType.Handle)); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz