Using the RTTI system in Delphi 2010, is there any way to find out if a property is a TDateTime? It's currently treating it as a double whenever I call back asVariant and also if I check the property type. Is this due to the fact it can only see the base type? (TDateTime = double)
How can I distinguish TDateTime properties from Double properties with RTTI?
Well, a date/time is always a double in which the integer part represent days, while fractional part represents minutes and seconds (as part of a day) –
Reseda
I understand it is a double technically but is there any way I can use RTTI to check if its defined as a TDateTime originally –
Chloride
Try checking the Name
property of the TRttiProperty.PropertyType
I don't have Delphi 2010, but this works in XE.
{$APPTYPE CONSOLE}
uses
SysUtils,
Classes,
Rtti;
type
TMyClass =class
private
FDate: TDateTime;
FProp: Integer;
FDate2: TDateTime;
FDate1: TDateTime;
public
property Date1 : TDateTime read FDate1 Write FDate1;
property Prop : Integer read FProp Write FProp;
property Date2 : TDateTime read FDate2 Write FDate2;
end;
var
ctx : TRttiContext;
t : TRttiType;
p : TRttiProperty;
begin
ctx := TRttiContext.Create;
try
t := ctx.GetType(TMyClass.ClassInfo);
for p in t.GetProperties do
if CompareText('TDateTime',p.PropertyType.Name)=0 then
Writeln(Format('the property %s is %s',[p.Name,p.PropertyType.Name]));
finally
ctx.Free;
end;
Readln;
end.
this code returns
the property Date1 is TDateTime
the property Date2 is TDateTime
+1 thank you so much, saved me re-writing a shedload of code :) –
Chloride
This also works since at least Delphi 5 with the older TypInfo methods. –
Bernetta
Key point here while defining type is the type directive. These two definitions are different:
Type
TDateTime = Double; // here p.PropertyType.Name returns Double
but
Type
TDateTime = type Double; // here p.PropertyType.Name returns TDateTime
or
Type
u8 = type Byte; // here p.PropertyType.Name returns u8
but
Type
u8 = Byte; // here p.PropertyType.Name returns Byte !
Obviously OP didn't declare the types in question, so technically this is not an answer, but you're quite right and this extra explanation is good information though. +1 –
Gav
© 2022 - 2024 — McMap. All rights reserved.