Я знал, как это сделать, но забыл снова ... Довольно раздражает, потому что я работаю над классом, который содержит список файлов XML, и теперь я просто хочу использовать цикл for-in для просмотра всех файлов в этом списке. Это класс, я прямо сейчас:
Перечисление пользовательского массива, чтобы я мог использовать for-in
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;
Выглядит смешно? :-) Я знаю, но я хочу скрыть определение класса TXmlFile для внешнего мира. В принципе, класс TXmlFileList позволяет мне просто ссылаться на XmlFileList [I], чтобы получить файл в позиции I. Хорошо работает.
Но теперь я хочу прокрутить элементы TXmlFileList.TItem, поэтому мне нужно показать класс TXmlFileList.TItem. Однако этого недостаточно. Ему тоже нужен перечислитель в классе TXmlFileList!
Как создать этот счетчик?
Возможно, вам интересно, почему я использую эту сложную конструкцию. Ну, это может быть сложно, но он будет использоваться некоторыми другими разработчиками, и я не хочу предлагать больше методов, чем нужно. Таким образом, я даю им методы «Добавить», «Очистить» и «Подсчитать», чтобы прокрутить список, и любое свойство, определенное в самом TItem. Им не нужно больше этого, хотя я мог бы добавить еще несколько функций позже ...
Зачем делать 'TXmlFileList.TItem' частным, если позже вы все равно его выставите? –
Хороший вопрос.:-) В принципе, я просто следовал за шаблоном, и выставляя класс, это означало разрыв шаблона. Кроме того, я всегда могу решить, чтобы перечислитель возвращал только любой другой тип, если мне нравится. Например, только подписи. Но тогда я должен был бы объявить TXmlFile немного выше, чем публичный. –
В Примозе есть серия статей по счетчикам, которые могут оказаться полезными: http://www.thedelphigeek.com/search/label/enumerators – 2010-11-05 01:49:30