7

System.TypInfo.TPropInfo には 2 つの関数メンバーがあります (少なくとも D-XE3 では)。

function NameFld: TTypeInfoFieldAccessor; inline;
function Tail: PPropInfo; inline;

それらのドキュメントや使用例は見つかりません。それらは何のためにあり、どのように使用できますか? (それが 1 つの質問として認められることを願っています。)

4

1 に答える 1

3

NameFld 関数は、プロパティの名前を として返しますTTypeInfoFieldAccessor

これにより、次のことが可能になります。

MyPropertyName:= MyPropInfo.NameFld.ToString;
if (PropInfoA.NameFld = PropInfoB.NameFld) then begin 
  writeln('property names are the same');
end;

TTypeInfoFieldAccessorは、プロパティの名前を短い文字列に内部的に保存します。
NextGen コンパイラは短い文字列をサポートしていないため、PByte型が使用されます。
(作者は、ソースに ifdef を散らかしたり、PShortstring 参照を削除したりしたくなかったと思います)

の入力はTail、内部ショートストリングの長さフィールドを指す PByte です。

tail のソースコードは次のとおりです。

function TTypeInfoFieldAccessor.Tail: PByte;
begin
  Result:= 
    FData    //Start of the shortstring 
    + FData^ + //Length of the stringData
    + 1; //Add one for the length byte itself
end;

短い文字列は null で終了しないため、単純な「null 文字が見つかるまでループする」ようなループは実行できません。
したがって、最初から最後までのループを使用して、短い文字列を通常の文字列に変換できます。
奇妙なことに、実際の RTL ソースコードでは、tail関数の代わりに長さバイトがどこでも使用されています。なので、残り物に見えます。関数
を含めて.sizetail

于 2014-07-26T15:39:27.013 に答える