Veuillez pardonner la verbosité de l'exemple de code suivant. Utilisation de Delphi 2009, j'ai créé deux classes TOtherClass et TMyClass:Delphi: RTTI pour les propriétés indexées en 2010?
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;
avec spécificateurs d'accès mis en œuvre comme
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;
Il est l'utilisation peut être illustrée comme suit:
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;
Ne vous préoccupez pas défauts évidents de ce "design". J'ai réalisé que j'aimerais pouvoir accéder à la propriété IndxProp via RTTI, et ensuite déplacé l'IndxProp à la section publiée. À ma grande déception, j'ai trouvé que les propriétés indexées ne sont pas permises dans la section publiée. Pour autant que je comprends (voir commentaire de Barry Kellys au How do I access Delphi Array Properties using RTTI), passer à D2010 ne me permettra pas de le faire.
D'autre part, ce qui suit est une citation de Robert Loves blog: « ... propriétés et méthodes sont maintenant disponibles via RTTI dans les deux sections publiques et publiées et les champs sont disponibles dans toutes les sections. » (Mes italiques.)
Ma question est la suivante: s'il est vrai qu'il est possible d'obtenir RTTI pour les champs publics dans D2010, mon exemple original (comme montré ci-dessus) ne devrait-il pas fonctionner dans D2010 (avec RTTI)? Merci d'avance!
Merci, Mason. Je vais installer D2010 tout de suite. :) – conciliator
Content de pouvoir aider. –
Mise à jour: Delphi XE2 a introduit 'TRttiIndexedProperty' qui fournit des fonctionnalités pour obtenir les informations de type à l'exécution des propriétés indexées. – menjaraz