How can I distinguish TDateTime properties from Double properties with RTTI?
Asked Answered
C

2

19

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)

Chloride answered 20/10, 2011 at 13:45 Comment(2)
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 originallyChloride
D
26

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
Debra answered 20/10, 2011 at 13:58 Comment(2)
+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
S
4

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 !
Santa answered 25/3, 2012 at 20:48 Comment(1)
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. +1Gav

© 2022 - 2024 — McMap. All rights reserved.