2011-12-02 5 views
1

異なるデータタイプのためのRTTIを含むTTypeDataフィールドは、動的配列のための3つの異なる要素タイプの値を有する:ダイナミック配列のTypeDataのさまざまな要素タイプのエントリは何をしますか?

elType: PPTypeInfo;  // nil if type does not require cleanup 
elType2: PPTypeInfo;  // independent of cleanup 
DynArrElType: PPTypeInfo; // actual element type, even if dynamic array 

elTypeの目的は非常に明確である:それはゼロをRTLにFinalizeArrayによって使用され、残っていますファイナライズするものがなければ。しかし、我々は他の2つの要素、elType2DynArrElTypeを持っています。誰に2つの理由があるのか​​、その2つの違いは何かを知っていますか?

+2

'DynArrElType:PPTypeInfo;'フィールドはDelphi XEとXE2でコメントされ、Delphi 7 - 2007のような古いバージョンでは表示されません。どのデルファイのバージョンを使用していますか? – RRUZ

+1

TypInfo.pasは、レコード定義で静的に宣言できない可変長データを記述するためにコメントを使用します。新しいバージョンではコメントされていて、古いバージョンではコメントされていないという事実は、新しいバージョンでは新しいデータが存在することを意味します。 –

+1

@ RemyLebeau-TeamBはそれを知っているのは良いですが、メイソンの質問では、このフィールドはコメントされていないので、混乱を招く可能性があります。 – RRUZ

答えて

2

elType2について質問に答えることができるのは、私が過去に使用した唯一のフィールドで、そのフィールドは配列の要素タイプを保持するためです。このサンプル

{$APPTYPE CONSOLE} 

uses 
    TypInfo, 
    SysUtils; 

type 
TDateArray = array of TDateTime; 
Var 
    p  : PPTypeInfo; 
begin 
    try 
    p:=TypInfo.GetTypeData(TypeInfo(TDateArray)).elType2; 
    Writeln(TypInfo.GetTypeName(p^)); 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
    Readln; 
end. 

これはTDateArrayタイプの要素の型であるのTDateTimeを、返しますを確認してください。

ところで、DynArrElTypeフィールドは私の知る限り、elType2DynArrElTypeが何のためにRTLで使用されていないDynUnitName: ShortStringBase

+0

コメントに基づいて、私は 'DynArrElType'に' elType2'ではなく要素型情報を含めることを期待していました。また、XE2のTypInfo.pasによれば、 'DynUraitName'が存在しても' DynArraElType'はまだ存在します。 –

+0

ところで、 'DynUnitName'は少なくともD6以降存在していて、' elType2'の後にいつも続いています。 –

+0

はい。彼らは質問には関係していないので、私はそこにいくつかの要素をスキップしました。 –

0

により、デルファイの最後のバージョンに置き換えられました。コンパイラはこれらの値を余分なメタデータとして、おそらくドキュメントジェネレータなどのために放出しているかもしれません。

関連する問題