2010-03-22 4 views
3

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!

Répondre

2

Oui, si tout le lecteur de propriétés est indexé dans un champ de tableau ou un champ de classe de liste, vous pouvez utiliser RTTI pour indexer directement dans le champ. C'est un peu fragile, car il casse votre encapsulation, vous obligeant à écrire du code à un détail d'implémentation spécifique au lieu d'un principe général, ce qui est principalement bon pour RTTI. Votre code RTTI doit correspondre à la structure exacte de votre classe, et s'il change, vous devez également changer le code. Ce genre de défaites l'objectif d'utiliser RTTI. Mais, s'il n'y a pas d'alternative disponible, puisque les propriétés du tableau n'ont pas de RTTI pour eux, c'est peut-être le seul moyen, pour le moment au moins.

EDIT: Mise à jour de cette réponse. La prise en charge des propriétés indexées a été ajoutée au système RTTI étendu dans XE2. (Toutefois, en raison de problèmes de stabilité sans rapport, vous pouvez attendre XE3 ...)

+0

Merci, Mason. Je vais installer D2010 tout de suite. :) – conciliator

+0

Content de pouvoir aider. –

+0

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

Questions connexes