通过 ISuperObject.GetEnumerator 可获取一个 TSuperEnumerator 对象.

TSuperEnumerator 主要有: MoveNext 方法、Current 属性; 使用举例:


  1. var
  2.   jo: ISuperObject;
  3.   e: TSuperEnumerator;
  4. begin
  5.   jo := SO('{A:1, B:2, C:3, D:[4, 5, {X:6}, {Y:[7,8,{m:9}]}]}');
  6.   e := jo.GetEnumerator;
  7.   while e.MoveNext do
  8.   begin
  9.     ShowMessage(e.Current.AsString);
  10.   end;
  11.   e.Free;
  12. end;
  13.  
  14. //上面程序其实没有实用价值, 因为下面一句话就可以代替上面这些:
  15. var
  16.   jo,i: ISuperObject;
  17. begin
  18.   jo := SO('{A:1, B:2, C:3, D:[4, 5, {X:6}, {Y:[7,8,{m:9}]}]}');
  19.   for i in jo do ShowMessage(i.AsString);
  20. end;

同通过 TSuperEnumerator 枚举出的只有 Name:Value 中的 Value;

通过 TSuperAvlIterator 枚举出的是 TSuperAvlEntry 对象(其包含 Name 和 Value);

获取 TSuperAvlIterator 方法:
TSuperTableString.GetEnumerator 或者 ISuperObject.AsObject.GetEnumerator.


  1. var
  2.   jo: ISuperObject;
  3.   ite: TSuperAvlIterator;
  4. begin
  5.   jo := SO('{A:1, B:2, C:3, D:[4, 5, {X:6}, {Y:7}]}');
  6.  
  7.   ite := jo.AsObject.GetEnumerator;
  8.  
  9.   ite.First;
  10.   ShowMessageFmt('%s : %s', [ite.Current.Name, ite.Current.Value.AsString]);
  11.  
  12.   ite.Next;
  13.   ShowMessageFmt('%s : %s', [ite.Current.Name, ite.Current.Value.AsString]);
  14.  
  15.   ite.Last;
  16.   ShowMessageFmt('%s : %s', [ite.Current.Name, ite.Current.Value.AsString]);
  17.  
  18.   ite.Prior;
  19.   ShowMessageFmt('%s : %s', [ite.Current.Name, ite.Current.Value.AsString]);
  20.  
  21.   ite.Free;
  22. end;

ObjectFindFirst、ObjectFindNext、ObjectFindClose 是 SuperObject 给的另一种枚举元素的方式.

它用到了一个结构:


  1. TSuperObjectIter = record
  2.   key: SOString;
  3.   val: ISuperObject;
  4.   Ite: TSuperAvlIterator;
  5. end;
  6.  
  7. //应用举例:
  8. var
  9.   jo: ISuperObject;
  10.   iter: TSuperObjectIter;
  11. begin
  12.   jo := SO('{A:1, B:2, C:3, D:[4, 5, {X:6}, {Y:7}]}');
  13.  
  14.   if ObjectFindFirst(jo, iter) then
  15.   begin
  16.     repeat
  17.       ShowMessageFmt('%s - %s', [iter.key, iter.val.AsString]);
  18.     until not ObjectFindNext(iter);
  19.   end;
  20.   ObjectFindClose(iter);
  21. end;
  22.  
  23. //或者:
  24. var
  25.   jo: ISuperObject;
  26.   iter: TSuperObjectIter;
  27. begin
  28.   jo := SO('{A:1, B:2, C:3, D:[4, 5, {X:6}, {Y:7}]}');
  29.  
  30.   if ObjectFindFirst(jo, iter) then
  31.   begin
  32.     repeat
  33.       ShowMessageFmt('%s - %s', [iter.Ite.Current.Name, iter.Ite.Current.Value.AsString]);
  34.     until not ObjectFindNext(iter);
  35.   end;
  36.   ObjectFindClose(iter);
  37. end;

TSuperEnumerator、TSuperAvlIterator、ObjectFindFirst的更多相关文章

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

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

  2. vmware里面的名词 vSphere、vCenter Server、ESXI、vSphere Client

    vmware里面的名词 vSphere.vCenter Server.ESXI.vSphere Client vSphere.vCenter Server.ESXI.vSphere Client VS ...

  3. 深入理解DIP、IoC、DI以及IoC容器

    摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...

  4. 从Script到Code Blocks、Code Behind到MVC、MVP、MVVM

    刚过去的周五(3-14)例行地主持了技术会议,主题正好是<UI层的设计模式——从Script.Code Behind到MVC.MVP.MVVM>,是前一天晚上才定的,中午花了半小时准备了下 ...

  5. JavaScript var关键字、变量的状态、异常处理、命名规范等介绍

    本篇主要介绍var关键字.变量的undefined和null状态.异常处理.命名规范. 目录 1. var 关键字:介绍var关键字的使用. 2. 变量的状态:介绍变量的未定义.已定义未赋值.已定义已 ...

  6. HTML 获取屏幕、浏览器、页面的高度宽度

    本篇主要介绍Web环境中屏幕.浏览器及页面的高度.宽度信息. 目录 1. 介绍:介绍页面的容器(屏幕.浏览器及页面).物理尺寸与分辨率.展示等内容. 2. 屏幕信息:介绍屏幕尺寸信息:如:屏幕.软件可 ...

  7. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  8. Android调用微信登陆、分享、支付

    前言:用了微信sdk各种痛苦,感觉比qq sdk调用麻烦多了,回调过于麻烦,还必须要在指定包名下的actvity进行回调,所以我在这里写一篇博客,有这个需求的朋友可以借鉴一下,以后自己别的项目有用到也 ...

  9. angular2系列教程(九)Jsonp、URLSearchParams、中断选择数据流

    大家好,今天我们要讲的是http模块的第二部分,主要学习ng2中Jsonp.URLSearchParams.observable中断选择数据流的用法. 例子

随机推荐

  1. JS動態綁定下拉單內容

    function req00_Line1_onChange(obj) {     //if ($(obj).val() != "" && $(obj).val() ...

  2. information_schema系列十二

    1: INNODB_SYS_VIRTUAL 表存储的是INNODB表的虚拟列的信息,当然这个还是比较简单的,我们直接通过SHOW CREATE TABLE 或者DESC TABLE就能看得到. Col ...

  3. 21.2 Partitioning Types

    分区类型: range:根据列值得一个给定的范围 list:和range相似,除了分区被选择基于的列被匹配在一个被设定为分离的值 hash 基于列组成的表达式返回的非负值 key  相似hash ,除 ...

  4. sqllite

    public static void tt()        {            int ID = 0; while(true)            {                stri ...

  5. 删除ubuntu后无法进入windows

    一天,脑袋一热想装个ubuntu学习学习,结果装的ubuntu版本比较老,没有集成我笔记本的网卡驱动,在ubuntu下上不了网,心想上不了网学习起来不是很不方便,于是就直接在win7下将ubuntu的 ...

  6. libsvm参数学习和核函数使用(转载)

    一.参数说明 English libsvm_options: -s svm_type : set type of SVM (default 0) 0 -- C-SVC        1 -- nu-S ...

  7. curd 里url传输汉字验证错误问题解决方法

    在url汉字转换的部分用base64_encode转化 base64_encode 将字符串以 BASE64 编码. 语法: string base64_encode(string data); 返回 ...

  8. 循序渐进Python3(十)-- 4 -- paramiko

    paramiko模块,基于SSH用于连接远程服务器并执行相关操作. 使用 (1)SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: , ))transport.connect( ...

  9. 浅谈WebSocket

    WebSocket是H5提出的为了解决客户端和服务器双工通信的方法.在我们使用HTTP协议通信时,客户端主动向服务器发送请求,得到服务器端数据.为了与服务器端数据保持一致,之前常用的有轮询和长轮询两种 ...

  10. SwipeRefreshLayout嵌套ScrollView包裹复杂头布局和RecyclerView

    布局如下:上面是一个描述有:头像和部分信息的布局,底部是一个RecyclerView: 想法:想实现RecyclerView向上滚动的时候,隐藏上面的头像布局信息:使用了 CoordinatorLay ...