AGB  ·  Datenschutz  ·  Impressum  







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

RTTI: GetPropValue(TTimeSpan)

Ein Thema von hzzm · begonnen am 27. Jun 2019 · letzter Beitrag vom 27. Jun 2019
Antwort Antwort
hzzm

Registriert seit: 8. Apr 2016
103 Beiträge
 
Delphi 10 Seattle Professional
 
#1

RTTI: GetPropValue(TTimeSpan)

  Alt 27. Jun 2019, 11:58
Delphi-Version: 10 Seattle
Guten Tag,

ich habe gerade das Problem, dass ich in TypInfo/RTTI den Wert von einer TTimeSpan so holen muesste
Delphi-Quellcode:
function RetrieveValue(AConcreteItem: TPersistent; APropIndex: Integer): Variant;
var
  LPropCount: Integer;
  LPropList: PPropList;
  LType: TClass;
begin
  LType := AConcreteItem.ClassType;
  LPropCount := GetTypeData(LType.ClassInfo)^.PropCount;
  GetMem(LPropList, LPropCount * SizeOf(Pointer));
  GetPropInfos(LType.ClassInfo, LPropList);
  if LPropList[APropIndex].PropType^.Name = 'TTimeSpanthen
    Result := GetStrProp(AConcreteItem, LPropList[APropIndex]) // <<-- Result = ''
  else
    Result := GetPropValue(AConcreteItem, LPropList[APropIndex], False);
end;
So geht das natuerlich nicht. TTimeSpan ist ein Record, darauf ist GetPropValue nicht vorbereitet.
Ich muesste eigentlich eine Ebene tiefer in GetPropValue einen cast String(TTimeSpan) durchfuehren, dann waere alles OK.

Wie kann ich das elegant beheben?
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
701 Beiträge
 
Delphi 12 Athens
 
#2

AW: RTTI: GetPropValue(TTimeSpan)

  Alt 27. Jun 2019, 12:40
Guten Tag,

ich habe gerade das Problem, dass ich in TypInfo/RTTI den Wert von einer TTimeSpan so holen muesste
Delphi-Quellcode:
function RetrieveValue(AConcreteItem: TPersistent; APropIndex: Integer): Variant;
var
  LPropCount: Integer;
  LPropList: PPropList;
  LType: TClass;
begin
  LType := AConcreteItem.ClassType;
  LPropCount := GetTypeData(LType.ClassInfo)^.PropCount;
  GetMem(LPropList, LPropCount * SizeOf(Pointer));
  GetPropInfos(LType.ClassInfo, LPropList);
  if LPropList[APropIndex].PropType^.Name = 'TTimeSpanthen
    Result := GetStrProp(AConcreteItem, LPropList[APropIndex]) // <<-- Result = ''
  else
    Result := GetPropValue(AConcreteItem, LPropList[APropIndex], False);
end;
So geht das natuerlich nicht. TTimeSpan ist ein Record, darauf ist GetPropValue nicht vorbereitet.
Ich muesste eigentlich eine Ebene tiefer in GetPropValue einen cast String(TTimeSpan) durchfuehren, dann waere alles OK.

Wie kann ich das elegant beheben?
Sie Dir mal in System.Typinfo.pas den Typ TPropSet<T> an (ich hoffe Seattle hatte den schon). Leider ist er nur innerhalb der Implementierung der Unit sichtbar, aber wie er GetProc implementiert sollte Dir ein paar Hinweise auf eine mögliche Lösung für dein Problem geben.
Peter Below
  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: RTTI: GetPropValue(TTimeSpan)

  Alt 27. Jun 2019, 13:00
TTimeSpan hat ja nur ein Feld des Typs Int64, also sollte technisch möglich sein, hier GetInt64Prop aufzurufen, aber das geht dann nur deshalb, weil TTimeSpan dasselbe Layout wie ein Int64 hat, für keine anderen Records (*). Dann hast du aber den Wert aus dem FTicks Feld in deinem Variant.

Übrigens, bitte keine Typüberprüfung per Namen - besser ist es so:

if LPropList[APropIndex].PropType^ = TypeInfo(TTimeSpan) then

(*) Nachtrag: Ich würde sicherheitshalber noch ein Assert(SizeOf(TTimeSpan) = SizeOf(Int64)) reinschreiben, dass es nicht irgendwann bei einer Änderung ein böses Erwachen gibt (das wird sogar zur Compilezeit ausgewertet, so dass das Assert gar nicht in der Binary landet, wenn die Bedingung wahr ist)

Es ist sogar möglich, den Fehler zur Compilezeit zu bekommen, seh ich gerade:
{$IF SizeOf(TTimeSpan) <> SizeOf(Int64)}{$MESSAGE ERROR 'TTimeSpan does not have the same size as Int64'}{$IFEND}
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (27. Jun 2019 um 13:09 Uhr)
  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 06:28 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