Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Verständnisfrage zu TValue (https://www.delphipraxis.net/203604-verstaendnisfrage-zu-tvalue.html)

TigerLilly 4. Mär 2020 10:29

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:

Neutral General 4. Mär 2020 10:38

AW: Verständnisfrage zu TValue
 
Zitat:

Muss ich einen TValue, der '123' enthält, explizit mit StrTotInt umwandeln?
Ja.
Zitat:

Was ist der Unterschied zwischen TValue.AsInteger und TValue.Cast()?
Quasi keiner.

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.

Stevie 4. Mär 2020 10:42

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.

TigerLilly 4. Mär 2020 14:13

AW: Verständnisfrage zu TValue
 
Zitat:

Zitat von Stevie (Beitrag 1458884)
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.

:- ) Ja, danke - ich lerne Spring4D immer mehr schätzen. :thumb:

TigerLilly 4. Mär 2020 15:06

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?

freimatz 4. Mär 2020 16:26

AW: Verständnisfrage zu TValue
 
Zitat:

Zitat von TigerLilly (Beitrag 1458918)
... Typ einer Boolean-Property ab, erhalte ich als Typ tkEnumeration. Ich hätte Boolean erwartet.

type Boolean = (False, True);

TiGü 4. Mär 2020 16:55

AW: Verständnisfrage zu TValue
 
Zitat:

Zitat von TigerLilly (Beitrag 1458918)
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?

Hilft dir das weiter?

https://stackoverflow.com/a/6355216

https://stackoverflow.com/a/31603084

Stevie 4. Mär 2020 17:21

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.

TigerLilly 4. Mär 2020 17:37

AW: Verständnisfrage zu TValue
 
Jein. :-/

Ich bekomme via RTTI PropertyType.TypeKind bzw RTTIype.

Das
Code:
procedure StringToSet(Info: PTypeInfo; var SetParam; const Value: AnsiString);
wär was ich wollte, aber ich weiß nicht, wie ich Info:PTYpeInfo via RTTI bekomme.

@Stevie:
Code:
TValue.From(values[i]).Convert(props[i].PropertyType.Handle
Das kann auch Enums und Sets?

TigerLilly 4. Mär 2020 20:22

AW: Verständnisfrage zu TValue
 
Zitat:

Zitat von Stevie (Beitrag 1458929)
Delphi-Quellcode:
  props := TType.GetType(TMyObject).GetDeclaredProperties;
...
  for i := 0 to High(props) do
    props[i].SetValue(m, TValue.From(values[i]).Convert(props[i].PropertyType.Handle, ISO8601FormatSettings));

end.

Ich kanns nicht umsetzen:
Ich habe
Code:
function RestoreProperty(aInstance: TObject; aPropertyName: string; Value:TValue): Boolean;
Wie müsste das weiter gehen?
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 04:55 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz