我知道如何做到这一点,但又一次忘记了......非常烦人,因为我正在处理一个包含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本身上定义的任何属性。他们不需要比这更多,但我可能稍后再添加一些功能...
为什么使TXFAFileList.TItem'专用,如果您稍后暴露它呢? – 2010-11-04 10:56:36
好问题。:-)基本上,我只是遵循了一种模式,并暴露出课程意味着打破模式。此外,如果我喜欢,我总是可以决定让枚举器返回任何其他类型。例如,只是标题。但是接下来我必须将TXmlFile声明为公开。 – 2010-11-04 11:03:43
Primoz有一系列关于您可能会发现有用的统计员的文章:http://www.thedelphigeek.com/search/label/enumerators – 2010-11-05 01:49:30