迭代(Iiterator)的作用:遍历一个集合(Collections)的每一个元素(item)。

delphi 2005之后新加入一种 for .. in .. 遍历语句,支持String,Set,array,record,Interface,class。能够时代码的for循环更加简洁。

以前的结构
var
S: string;
i: integer;
begin
for i := to MyStrings.Count- do
begin
S := MyStrings[i];
writeln(S);
end;
end;
 
现在的结构
var
S: string;
begin
for S in MyStrings do
writeln(S);
end;
为了自定义这种结构,我们的代码需要满足如下规则:
1.你必须有一个 class , interface 或者 record 的自定义类型
2.你的 class ,interface 或者record类型必须暴露一个GetEnumerator方法,该方法返回一个你的迭代器
3.你的迭代器可以是class , interface 或者 record中的一种类型。
4.你的迭代器需要暴露MoveNext(): boolean; Current:你的元素类型。
5.MoveNext方法在当前选中的元素是最后一个之后返回False,否则返回True
6.你的迭代器创建之时当前元素应该为-1,在调用moveNext之后才能指向第一个元素。
 
如下例:
 
type
{ 迭代器 }
TRecordEnumerator = record
private
FArray: TBytes;
FIndex: Integer; function GetCurrent: Byte;
public
function MoveNext(): Boolean;
property Current: Byte read GetCurrent;
end; { 需要被迭代的集合}
TRecordCollection = record
private
FArray: TBytes;
public
function GetEnumerator(): TRecordEnumerator;
end; { TRecordCollection } function TRecordCollection.GetEnumerator: TRecordEnumerator;
begin
Result.FArray := FArray;
Result.FIndex := -;
end; { TRecordEnumerator } function TRecordEnumerator.GetCurrent: Byte;
begin
Result := FArray[FIndex];
end; function TRecordEnumerator.MoveNext: Boolean;
begin
Inc(FIndex); if FIndex >= Length(FArray) then
Exit(false); Exit(true);
end; var
LColl: TRecordCollection;
B: Byte; begin
LColl.FArray := TBytes.Create(, , , , , ); for B in LColl do
WriteLn(B); ReadLn;
end.
 

DELPHI 里面的迭代的更多相关文章

  1. 浅析Delphi Container库(有开源的DCLX)

    与Java和C++相比,Delphi对容器的支持实在少得可怜.Java有强大的集合框架,C++更有STL,Delphi有什么呢,不就是TList几个小巧的列表类,而TCollection系列的类更多只 ...

  2. delphi中WMI的使用(网卡是否接入)

    WMI(Windows Management Instrumentation,Windows 管理规范)是一项核心的 Windows 管理技术:用户可以使用 WMI 管理本地和远程计算机. 通过使用W ...

  3. delphi 各版本的特性

    delphi 各新版本特性收集 Delphi XE6新增了一些特性并增强了原有的功能,主要有以下几个方面:   IDE(整合开发环境)   Internet XML(扩展标记语言) Compiler( ...

  4. 转:Delphi中使用比较少的一些语法

    http://www.cnblogs.com/Murphieston/p/5577836.html 本文是为了加强记忆而写,这里写的大多数内容都是在编程的日常工作中使用频率不高的东西,但是又十分重要. ...

  5. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  6. IteratorPattern(迭代子模式)

    /** * 迭代子模式 * @author TMAC-J * 聚合:某一类对象的集合 * 迭代:行为方式,用来处理聚合 * 是一种行为模式,用于将聚合本身和操作聚合的行为分离 * Java中的COLL ...

  7. 学习笔记:7z在delphi的应用

    最近做个发邮件的功能,需要将日志文件通过邮件发送回来用于分析,但是日志文件可能会超级大,测算下来一天可能会有800M的大小.所以压缩是不可避免了,delphi中的默认压缩算法整了半天不太好使,就看了看 ...

  8. JavaScript高级程序设计--对象,数组(栈方法,队列方法,重排序方法,迭代方法)

    1.使用对象字面量定义对象 var person={}; 使用这种方式创建对象时,实际上不会调用Object构造函数. 开发人员更喜欢对象字面量的语法.   2.有时候需要传递大量可选参数的情形时,一 ...

  9. python征程3.1(列表,迭代,函数,dic,set,的简单应用)

    1.列表的切片. 1.对list进行切片.'''name=["wangshuai","wangchuan","wangjingliang", ...

随机推荐

  1. HTML5中表单验证的8种方法(转)

    在深人探讨表单验证之前,让我们先思考一下表单验证的真实含义.就其核心而言,表单验证是一套系统,它为终端用户检测无效的控件数据并标记这些错误.换言之,表单验证就是在表单提交服务器前对其进行一系列的检查并 ...

  2. mongodb 主从服务器

    @set mongod=..\bin\mongod.exe set keyFile=key.key if not exist %keyFile% ( echo 123456>%keyFile% ...

  3. mydate97时间控件最大值最小值限制及Javascript日期判断大小

    <script language="javascript" type="text/javascript" src="<%=basePath ...

  4. ASP.NET MVC的处理管线

    原文:http://www.cnblogs.com/fzrain/p/3651693.html 下面开始解释各个部分: 路由模块 1.在ASP.NET MVC处理管线中的第一站就是路由模块.当请求到达 ...

  5. 【五】PHP数组操作函数

    1.输出数组的结构:bool print_r(数组); $arr=array('jack','mike','tom'); print_r($arr);//Array ( [0] => jack ...

  6. 几种CPU架构

    原文链接:http://blog.csdn.net/wyzxg/article/details/5027738 这几天在下载RPM包的时候,总会看见x86,x86-64,IA64,i386,i586等 ...

  7. POJ 3678

    Katu Puzzle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7391   Accepted: 2717 Descr ...

  8. group_concat

    分割字符串 group_concat(a.EvidencesID separator ',') as EvidencesID #在MySQL配置文件(my.ini)中默认无该配置项,使用默认值时,值为 ...

  9. http://www.cnblogs.com/TankXiao/p/4018219.html

    http://www.cnblogs.com/TankXiao/p/4018219.html

  10. React-组件嵌套-子组件通过委托向父组件传值

    一.简述 父组件嵌套子组件,父组件的处理函数通过属性的方式赋值组子组件( <GenderSelect handleSelect={this.handleSelect}></Gende ...