学习 TList 类的实现[7]
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]的更多相关文章
- 学习 TList 类的实现[4]
现在准备一步步地模拟 TList 类, 建立一个自己的 TMyList. 首先, 这个类中应该包括前面提到的那个 Pointer 数组(TPointerList)的指针(PPointerList): ...
- 学习 TList 类的实现[8]
现在准备建立 Items 数组属性; 在 public 区输入下面代码:property Items[Index: Integer]: Pointer; 执行 Shift+Ctrl+C 后的代码是: ...
- 学习 TList 类的实现[1]
最近整理了一些函数列表, 算是一个宏观的安排; 等以后再碰到一些函数时就可以放置的更有次序一些. 我对函数与类的理解是: 函数是一个功能模块, 类是一个更强大的功能模块; Delphi 已经提供了很多 ...
- 学习 TList 类的实现[2]
我原来以为 TList 可能是一个链表, 其实只是一个数组而已. 你知道它包含着多大一个数组吗? MaxListSize 个!MaxListSize 是 Delphi 在 Classes 单元定义的一 ...
- 学习 TList 类的实现[6]
实现 TMyList.Add 函数. TList 中的 Add 函数用到了一个 Grow 方法, 它的原理是元素越多就为以后准备更多内存, 我们这里省略为预留 4 个元素的内存; TList 中的 A ...
- 学习 TList 类的实现[5]
先来实现 TMyList.SetCapacity. 马上会想到下面代码: procedure TMyList.SetCapacity(const Value: Integer); begin if ...
- 学习 TList 类的实现[3] - 不能回避的话题: 内存分配
在 Delphi 中, 几乎所有的类型都有对应的指针类型, 譬如: Char PChar Word PWORD Double PDouble TPoint PPoint 甚至一种类型对应这着几种指针类 ...
- Java虚拟机JVM学习07 类的卸载机制
Java虚拟机JVM学习07 类的卸载机制 类的生命周期 当Sample类被加载.连接和初始化后,它的生命周期就开始了. 当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就 ...
- Java虚拟机JVM学习04 类的初始化
Java虚拟机JVM学习04 类的初始化 类的初始化 在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值. 在程序中,静态变量的初始化有两种途径: 1.在静态变量的声明处进行初始 ...
随机推荐
- .NET执行SQL插入时间的问题
错误描述: 一个项目,源码是BOSS给的,部署到网上了,运行没有问题,可是在本地运行,就会有问题,问题在于往一些表插入记录的时候,本地不管怎么样都插入不了,而网上就可以插入,都是相同的一份代码 解决: ...
- Wireshark分析网络慢
tcp.analysis.retransmission tcp.flags.reset==1
- Linux下查看Raid磁盘阵列信息的方法
Linux下查看软.硬raid信息的方法. 软件raid:只能通过Linux系统本身来查看 cat /proc/mdstat 可以看到raid级别,状态等信息. 硬件raid: 最佳的办法是通过已安装 ...
- ny225 小明求素数积
小明求素数积时间限制:1000 ms | 内存限制:65535 KB 难度:1描述 小明最近遇到了一个素数题,是给你一个正整数N(2=<N<=1000)让你求出2~N的所有素数乘积的后 ...
- vue2.0 Hash模式下实现微信分享
1,通过后台,获取accessToken 和 签名jsApiTicket,并写入浏览器缓存(可以写在app.vue中) <script type="text/ecmascript-6& ...
- android 使用 sqlite
SQLiteHelper .class (升级的时候,做点小技巧) package com.keyue.qlm.util; import android.content.Context; imp ...
- python 实现ARP攻击
注:使用这个脚本需要安装scapy 包 最好在linux平台下使用,因为scapy包在windows上安装老是会有各种问题 #coding:utf-8 #example :sudo python ar ...
- 一款简洁的纯css3代码实现的动画导航
之前为大家介绍了好多导航菜单,今天给大家分享一款简洁的纯css3代码实现的动画导航.鼠标经过的时候以背景色以菱形渐变为长方形.效果图如下: 在线预览 源码下载 实现的代码. html代码: < ...
- mysql 加入远程用户
USE mysql; GRANT ALL PRIVILEGES ON *.* TO panjing @"%" IDENTIFIED BY "123456"; F ...
- m72 gprs模块的应用编写
#include <fcntl.h>#include <termios.h>#include "AppInit.h"#include "A5_Se ...