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
Benutzerbild von Stevie
Stevie

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

AW: Verständnisfrage zu TValue

  Alt 4. Mär 2020, 10: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
Benutzerbild von TigerLilly
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.251 Beiträge
 
Delphi 12 Athens
 
#2

AW: Verständnisfrage zu TValue

  Alt 4. Mär 2020, 14: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
Benutzerbild von TigerLilly
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.251 Beiträge
 
Delphi 12 Athens
 
#3

AW: Verständnisfrage zu TValue

  Alt 4. Mär 2020, 15: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.513 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Verständnisfrage zu TValue

  Alt 4. Mär 2020, 16: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.079 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Verständnisfrage zu TValue

  Alt 4. Mär 2020, 16: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.052 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: Verständnisfrage zu TValue

  Alt 4. Mär 2020, 17: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
Benutzerbild von TigerLilly
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.251 Beiträge
 
Delphi 12 Athens
 
#7

AW: Verständnisfrage zu TValue

  Alt 4. Mär 2020, 20: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
Benutzerbild von Stevie
Stevie

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

AW: Verständnisfrage zu TValue

  Alt 5. Mär 2020, 09:53
Delphi-Quellcode:
function RestoreProperty(aInstance: TObject; const aPropertyName: string; const aValue: TValue): Boolean;
var
  prop: TRttiProperty;
begin
  prop := TType.GetType(aInstance.ClassType).GetProperty(aPropertyName);
  prop.SetValue(aInstance, aValue.Convert(prop.PropertyType.Handle));
end;
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von TigerLilly
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.251 Beiträge
 
Delphi 12 Athens
 
#9

AW: Verständnisfrage zu TValue

  Alt 4. Mär 2020, 17: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
Antwort Antwort


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 09:05 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