AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Verständnisfrage zu TValue

Ein Thema von TigerLilly · begonnen am 4. Mär 2020 · letzter Beitrag vom 5. Mär 2020
Antwort Antwort
Seite 1 von 2  1 2      
TigerLilly
Online

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.203 Beiträge
 
Delphi 11 Alexandria
 
#1

Verständnisfrage zu TValue

  Alt 4. Mär 2020, 11:29
Delphi-Version: 5
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.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Verständnisfrage zu TValue

  Alt 4. Mär 2020, 11:38
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General ( 4. Mär 2020 um 11:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#3

AW: Verständnisfrage zu TValue

  Alt 4. Mär 2020, 11:42
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
TigerLilly
Online

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.203 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Verständnisfrage zu TValue

  Alt 4. Mär 2020, 15:13
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.
  Mit Zitat antworten Zitat
TigerLilly
Online

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.203 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Verständnisfrage zu TValue

  Alt 4. Mär 2020, 16:06
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?
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.442 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Verständnisfrage zu TValue

  Alt 4. Mär 2020, 17:26
... Typ einer Boolean-Property ab, erhalte ich als Typ tkEnumeration. Ich hätte Boolean erwartet.
type Boolean = (False, True);
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Verständnisfrage zu TValue

  Alt 4. Mär 2020, 17:55
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
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

AW: Verständnisfrage zu TValue

  Alt 4. Mär 2020, 18:21
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
TigerLilly
Online

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.203 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Verständnisfrage zu TValue

  Alt 4. Mär 2020, 18:37
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 InfoTYpeInfo via RTTI bekomme.

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

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.203 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Verständnisfrage zu TValue

  Alt 4. Mär 2020, 21:22
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));
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:41 Uhr.
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