总结目前 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[8];
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 := 11;
ListA.Add(@r1);
{现在 Count 应该是 1, Capacity 应该是 4; 测试:}
ShowMessageFmt('%d,%d',[ListA.Count,ListA.Capacity]); {1,4}
{继续添加}
r2.name := '李四';
r2.age := 22;
ListA.Add(@r2);
r3.name := '王五';
r3.age := 33;
ListA.Add(@r3);
r4.name := '孙六';
r4.age := 44;
ListA.Add(@r4);
r5.name := '候七';
r5.age := 55;
ListA.Add(@r5);
{现在 Count 应该是 5, Capacity 应该是 8; 测试:}
ShowMessageFmt('%d,%d',[ListA.Count,ListA.Capacity]); {5,8}
{用 TMyList 的 List 属性获取第三个元素}
r := TMyRec(ListA.List^[2]^);
ShowMessageFmt('%s:%d',[r.name, r.age]); {王五:33}
{删除第三个元素后再访问第三个元素}
ListA.Delete(2);
r := TMyRec(ListA.List^[2]^);
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] 数组属性来访问元素, 不然麻烦透了!