总结目前 TMyList 已具备的功能(3 个方法、3 个属性):

Add: 添加;
Delete: 删除;
Clear: 清空;
Count: 元素总数;
Capacity: 已存在的所有元素位置数;
List: 指向核心数组的指针(只读).

举例测试如下:


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls; type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  end; var
  Form1: TForm1;
implementation {$R *.dfm} uses MyList;        {uses TMyList 所在单元} type
  TMyRec = record    {定义结构; 用于填充测试}
    name: string[];
    age : Word;
  end; procedure TForm1.FormCreate(Sender: TObject);
var
  ListA: TMyList;
  r,r1,r2,r3,r4,r5: TMyRec;
begin
  ListA := TMyList.Create;   {建立之初, Count 与 Capacity 两个属性都应该是 0; 测试:}
  ShowMessageFmt('%d,%d',[ListA.Count,ListA.Capacity]); {0,0}   {添加一个元素(指针)}
  r1.name := '张三';
  r1.age  := ;
  ListA.Add(@r1);   {现在 Count 应该是 1, Capacity 应该是 4; 测试:}
  ShowMessageFmt('%d,%d',[ListA.Count,ListA.Capacity]); {1,4}   {继续添加}
  r2.name := '李四';
  r2.age  := ;
  ListA.Add(@r2);   r3.name := '王五';
  r3.age  := ;
  ListA.Add(@r3);   r4.name := '孙六';
  r4.age  := ;
  ListA.Add(@r4);   r5.name := '候七';
  r5.age  := ;
  ListA.Add(@r5);   {现在 Count 应该是 5, Capacity 应该是 8; 测试:}
  ShowMessageFmt('%d,%d',[ListA.Count,ListA.Capacity]); {5,8}   {用 TMyList 的 List 属性获取第三个元素}
  r := TMyRec(ListA.List^[]^);
  ShowMessageFmt('%s:%d',[r.name, r.age]); {王五:33}   {删除第三个元素后再访问第三个元素}
  ListA.Delete();
  r := TMyRec(ListA.List^[]^);
  ShowMessageFmt('%s:%d',[r.name, r.age]); {孙六:44}   {执行 Clear 方法后, Count 和 Capacity 应该清 0}
  ListA.Clear;
  ShowMessageFmt('%d,%d',[ListA.Count,ListA.Capacity]); {0,0}   ListA.Free;
end; end.

从上面的例子可以看出, 现在要访问一个元素真不容易: r := TMyRec(ListA.List^[2]^);

理解一下:

ListA.List 是那个核心数组的指针, 要表示那个数组应该用: ListA.List^

数组的第二个元素 ListA.List^[2], 又是指向元素的指针, 获取元素应该用: ListA.List^[2]^

还有转换成可以识别的对象: TMyRec(ListA.List^[2]^);



应尽早添加 TMyRec.Items[i] 数组属性来访问元素, 不然麻烦透了!

学习 TList 类的实现[7]的更多相关文章

  1. 学习 TList 类的实现[4]

    现在准备一步步地模拟 TList 类, 建立一个自己的 TMyList. 首先, 这个类中应该包括前面提到的那个 Pointer 数组(TPointerList)的指针(PPointerList): ...

  2. 学习 TList 类的实现[8]

    现在准备建立 Items 数组属性; 在 public 区输入下面代码:property Items[Index: Integer]: Pointer; 执行 Shift+Ctrl+C 后的代码是: ...

  3. 学习 TList 类的实现[1]

    最近整理了一些函数列表, 算是一个宏观的安排; 等以后再碰到一些函数时就可以放置的更有次序一些. 我对函数与类的理解是: 函数是一个功能模块, 类是一个更强大的功能模块; Delphi 已经提供了很多 ...

  4. 学习 TList 类的实现[2]

    我原来以为 TList 可能是一个链表, 其实只是一个数组而已. 你知道它包含着多大一个数组吗? MaxListSize 个!MaxListSize 是 Delphi 在 Classes 单元定义的一 ...

  5. 学习 TList 类的实现[6]

    实现 TMyList.Add 函数. TList 中的 Add 函数用到了一个 Grow 方法, 它的原理是元素越多就为以后准备更多内存, 我们这里省略为预留 4 个元素的内存; TList 中的 A ...

  6. 学习 TList 类的实现[5]

    先来实现 TMyList.SetCapacity. 马上会想到下面代码: procedure TMyList.SetCapacity(const Value: Integer); begin   if ...

  7. 学习 TList 类的实现[3] - 不能回避的话题: 内存分配

    在 Delphi 中, 几乎所有的类型都有对应的指针类型, 譬如: Char PChar Word PWORD Double PDouble TPoint PPoint 甚至一种类型对应这着几种指针类 ...

  8. Java虚拟机JVM学习07 类的卸载机制

    Java虚拟机JVM学习07 类的卸载机制 类的生命周期 当Sample类被加载.连接和初始化后,它的生命周期就开始了. 当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就 ...

  9. Java虚拟机JVM学习04 类的初始化

    Java虚拟机JVM学习04 类的初始化 类的初始化 在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值. 在程序中,静态变量的初始化有两种途径: 1.在静态变量的声明处进行初始 ...

随机推荐

  1. codeBlocks编译undefined reference to错误

    是没有把c文件编译进去的原因. 右键项目,选择属性,弹出窗体 然后选择build targets 在最下面有个build target files:中把c文件勾选.点击ok重新编译即可. Code:: ...

  2. 多重连接的数据库管理工具:Navicat Premium

    多重连接的数据库管理工具:Navicat Premium 2016-09-26 Navicat Premium(非免费软件)是一个可多重连接的数据库管理工具,它可让你以单一程序同时连接到MySQL.O ...

  3. 【转】雅典娜与宙斯的对话.(kerberos原理)

    1 八月 2010 22:07:51关于Kerberos的对话(MIT)雅典娜与宙斯 雅典娜与宙斯关于地狱之门守护者的对话 Kerberos: Network Authentication Proto ...

  4. java 多线程4: java线程的优先级

    Java线程的优先级取值范围是1 (Thread.MIN_PRIORITY ) 到 10 (Thread.MAX_PRIORITY ).如果没有设置, 线程默认的优先级是NORM_PRIORITY.这 ...

  5. Permission denied (publickey). fatal: The remote end hung up unexpectedly 解决办法

    这两天学习git的时候,在本地创建了一个库,同时自己在GitHub上面也创建了一个库,照着廖老师的教程一步一步走到了push的环节突然出现了这样的错误: [zhangxiyu@localhost le ...

  6. c++全局函数 && 成员函数

    #include<iostream> using namespace std; class Test { public: Test(, ) { this->a = a; this-& ...

  7. iOS文件和目录操作,iOS文件操作,NSFileManager使用文件操作:

    NSFileManager常用的文件方法: -(NSData*)contentsAtPath:path 从一个文件中读取数据 -(BOLL)createFileAtPath:path contents ...

  8. C语言 · 字符串输入输出函数

    算法提高 3-2字符串输入输出函数   时间限制:1.0s   内存限制:512.0MB      描述 编写函数GetReal和GetString,在main函数中分别调用这两个函数.在读入一个实数 ...

  9. C语言 · 五次方数

    算法提高 五次方数   时间限制:1.0s   内存限制:256.0MB      问题描述 对一个数十进制表示时的每一位数字乘五次方再求和,会得到一个数的五次方数 例如:1024的五次方数为1+0+ ...

  10. C语言 · 字符串逆序

    算法训练 字符串逆序   时间限制:1.0s   内存限制:512.0MB      输入一个字符串,长度在100以内,按相反次序输出其中的所有字符. 样例输入 tsinghua 样例输出 auhgn ...