• 学习 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] 数组属性来访问元素, 不然麻烦透了!
  • 相关阅读:
    Linux系统报错Fork Failed: cannot allocate memory
    RPA系统常见使用操作
    解决:安装composer时The openssl extension is missing, which means that secure HTTPS transfers are impossib
    centos7设置、查看、删除环境变量的方法
    asp.net core 用NPOI放word中写入数据 江南
    C# Decimal 去除小数点后无效的0 江南
    C# 日期格式化以及日期常用方法 江南
    容器技术基础
    github项目初始化
    uni微信小程序优化,删除打包后的import vue路径
  • 原文地址:https://www.cnblogs.com/shijiaoyun/p/3844511.html
Copyright © 2020-2023  润新知