Je savais comment faire cela, mais j'ai encore oublié ... Assez irritant, parce que je travaille sur une classe qui contient une liste de fichiers XML, et maintenant je veux juste utiliser une boucle for-in pour parcourir tous les fichiers de cette liste. Ceci est la classe que j'ai en ce moment:
Énumération d'un tableau personnalisé afin que je puisse utiliser
type
TXmlFileList = class(TInterfacedObject)
private
type
TItem = class(TInterfacedObject)
strict private
FCaption: string;
protected
constructor Create(const ACaption: string; const AXML: WideString);
public
destructor Destroy; override;
property Caption: string read FCaption;
end;
strict private
FXmlFiles: array of TXmlFileList.TItem;
strict protected
function GetXmlFile(index: Integer): TXmlFileList.TItem;
public
constructor Create();
destructor Destroy; override;
function Add(const ACaption: string; const AXML: WideString): Integer; overload;
function Add(const AFilename: string): Integer; overload;
function Count: Integer;
procedure Clear;
property XmlFile[ index: Integer ]: TXmlFileList.TItem read GetXmlFile; default;
end;
un drôle d'air? :-) Je sais, mais je veux cacher la définition de la classe TXmlFile au monde extérieur. Fondamentalement, la classe TXmlFileList me permet de simplement faire référence à XmlFileList [I] pour obtenir le fichier en position I. Fonctionne bien. Mais maintenant je veux parcourir les éléments TXmlFileList.TItem, donc je dois exposer la classe TXmlFileList.TItem. Ce n'est pas assez, cependant. Il a aussi besoin d'un énumérateur dans la classe TXmlFileList!
Comment créer cet énumérateur?
Vous vous demandez probablement pourquoi j'utilise cette construction complexe. Eh bien, cela peut être complexe mais il sera utilisé par d'autres développeurs et je ne veux pas fournir plus de méthodes que nécessaire. De cette façon, je leur donne seulement les méthodes "Add", "Clear" et "Count" pour faire une boucle dans la liste, et toute propriété définie sur le TItem lui-même. Ils n'ont pas besoin de plus que cela, bien que je pourrais ajouter quelques fonctionnalités plus tard ...
Pourquoi rendre 'TXmlFileList.TItem' privé si plus tard vous l'exposez quand même? –
Bonne question.:-) Fondamentalement, je viens de suivre un modèle et exposer la classe signifiait briser le modèle. D'ailleurs, je peux toujours décider d'avoir l'énumérateur pour renvoyer n'importe quel autre type, si je veux. Par exemple, juste les légendes. Mais alors je devrais déclarer TXmlFile un peu plus haut comme public. –
Primoz a une série d'articles sur les enquêteurs que vous pourriez trouver utile: http://www.thedelphigeek.com/search/label/enumerators –