2011-10-20 18 views
17

Delphi 2010でRTTIシステムを使用すると、プロパティがTDateTimeであるかどうかを調べる方法はありますか?現在、私はasVariantをコールバックするたびに、またプロパティの型をチェックすると、doubleとして扱います。これはベースタイプしか見ることができないためですか? (されたTDateTime =ダブル)RTateを使用してTDateTimeプロパティとDoubleプロパティを区別するにはどうすればよいですか?

+0

まあ、日付/時刻が常に二重のある小数部分が – Marco

+0

(当日の一部として)分と秒を表している整数部は、日を表して、私はそれがあることを理解します技術的には二倍ですが、RTTIを使用してTDateTimeとして定義されているかどうかを確認する方法はありますか? – Barry

答えて

22

は、私は、Delphi 2010はありませんが、これはXEで動作TRttiProperty.PropertyType

Nameプロパティをチェックしてみます。タイプを定義しながら、

{$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. 

このコードはここに

the property Date1 is TDateTime 
the property Date2 is TDateTime 
+1

+1、私はそれが可能だと信じていない – TLama

+0

+1コードの大倉庫を書き直してくれてありがとう: – Barry

+0

あなたを助けてうれしいよ:) – RRUZ

3

キーポイントを返すことはタイプディレクティブです。これら二つの定義が異なっている:

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 ! 
+0

明らかに、OPは問題のタイプを宣言していないので、技術的にはこれは答えではありませんが、あなたは正しいと思います。 +1 – NGLN

関連する問題