次のコード例の冗長性はご容赦ください。Delphi 2009を使用して、TOtherClassとTMyClassの2つのクラスを作成しました。
TOtherClass = class(TObject)
public
FData: string;
end;
TMyClass = class(TObject)
private
FIndxPropList: Array of TOtherClass;
function GetIndxProp(Index: Integer): TOtherClass;
procedure SetIndxProp(Index: Integer; Value: TOtherClass);
public
property IndxProp[Index: Integer]: TOtherClass read GetIndxProp write SetIndxProp;
end;
アクセス指定子は次のように実装されます
function TMyClass.GetIndxProp(Index: Integer): TOtherClass;
begin
Result := self.FIndxPropList[Index];
end;
procedure TMyClass.SetIndxProp(Index: Integer; Value: TOtherClass);
begin
SetLength(self.FIndxPropList, Length(self.FIndxPropList) + 1);
self.FIndxPropList[Length(self.FIndxPropList) - 1] := Value;
end;
その使用法は次のように説明できます。
procedure Test();
var
MyClass: TMyClass;
begin
MyClass := TMyClass.Create;
MyClass.IndxProp[0] := TOtherClass.Create;
MyClass.IndxProp[0].FData := 'First instance.';
MyClass.IndxProp[1] := TOtherClass.Create;
MyClass.IndxProp[1].FData := 'Second instance.';
MessageDlg(MyClass.IndxProp[0].FData, mtInformation, [mbOk], 0);
MessageDlg(MyClass.IndxProp[1].FData, mtInformation, [mbOk], 0);
MyClass.IndxProp[0].Free;
MyClass.IndxProp[1].Free;
MyClass.Free;
end;
この「設計」の明らかな欠陥を気にしないでください。RTTIを介してプロパティIndxPropにアクセスできるようにしたいと思い、その後IndxPropを公開されたセクションに移動しました。残念なことに、公開されたセクションではインデックス付きのプロパティが許可されていないことがわかりました。私が理解している限り(RTTIを使用してDelphi配列プロパティにアクセスする方法に関するBarry Kellysのコメントを参照)、D2010に移行してもこれを行うことはできません。
一方、Robert Lovesブログからの引用は次のとおりです。「...プロパティとメソッドは、公開セクションと公開セクションの両方でRTTIを介して利用できるようになり、フィールドはすべてのセクションで利用できるようになりました。」(私のイタリック体。)
私の質問はこれです:D2010でパブリックフィールドのRTTIを取得することが可能である場合、私の元の例(上記のように)はD2010(RTTIを使用)で機能するべきではありませんか?前もって感謝します!