学习 TList 类的实现[7]

总结目前 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] 数组属性来访问元素, 不然麻烦透了!

你可能感兴趣的:(list)