需求是把record 保存在TList中,并可以随时改变TList中Items的各项值。

代码很简单:

   MyRec = record

        MyStr: string;

        constructor Create(AMyStr: string);

end;

TForm4 = class(TForm)

  Button1: TButton;

  procedure Button1Click(Sender: TObject);

        public

  MyList: TList<MyRec>;

end;

constructor MyRec.Create(AMyStr: string);

begin

    MyStr := AMyStr;

end;

procedure TForm4.Button1Click(Sender: TObject);

begin

    MyList := TList<MyRec>.Create;

    MyList.Add(MyRec.Create('str'));

    MyList.Items[].MyStr := 'www'; //[Error] Unit4.pas(): E2064 Left side cannot be assigned to

    ShowMessage(MyList.Items[].MyStr);

end;

无法赋值?想了一下,大概是因为左侧取出的是变量值本身,而不是变量,所以无法赋值。那么我取值地址再赋值总可以吧?于是改动如下:

procedure TForm4.Button1Click(Sender: TObject);

var

    ps: ^string;

begin

    MyList := TList<MyRec>.Create;

    MyList.Add(MyRec.Create('str'));

    ps := @MyList.Items[].MyStr; //[DCC Error] Unit4.pas(): E2036 Variable required

    ps^ := 'www';

    ShowMessage(MyList.Items[].MyStr);

end;

必须为变量?又想了一下,大概是因为左侧取出的是变量值本身,而不是变量,所以无法取地址。那没办法,只能改一下TList,了,于是改动如下

Tpye

PMyRec = ^MyRec;

procedure TForm4.Button1Click(Sender: TObject);

begin

    MyList := TList<PMyRec>.Create;

    MyList.Add(MyRec.Create('str')); //[DCC Error] Unit4.pas(): E2010 Incompatible types: 'PMyRec' and 'MyRec'

    MyList.Items[].MyStr := 'www';

    ShowMessage(MyList.Items[].MyStr);

end;

要是Create能返回指针就好了。不多说,继续改:

procedure TForm4.Button1Click(Sender: TObject);

begin

    MyList := TList<PMyRec>.Create;

    MyList.Add(@MyRec.Create('str')); //[DCC Error] Unit4.pas(): E2036 Variable required

    MyList.Items[].MyStr := 'www';

    ShowMessage(MyList.Items[].MyStr);

end;

……。继续改:

procedure TForm4.Button1Click(Sender: TObject);

var

    r: MyRec;

begin

    MyList := TList<PMyRec>.Create;

    r := MyRec.Create('str');

    MyList.Add(@r);

    MyList.Items[].MyStr := 'www';

    ShowMessage(MyList.Items[].MyStr);

end;

看起来似乎是可以了,但是:

procedure TForm4.Button2Click(Sender: TObject);

begin

    ShowMessage(MyList.Items[].MyStr); // Access Violation!

end;

想了一下,大概是r的内存被释放了。于是改动如下:

procedure TForm4.Button1Click(Sender: TObject);

var

    p: PMyRec;

begin

    MyList := TList<PMyRec>.Create;

    New(p);

    p.Create('str');

    MyList.Add(p);

    MyList.Items[].MyStr := 'www';

    ShowMessage(MyList.Items[].MyStr);

end;

OK了,不过真是麻烦,不用的时候还要dispose。感觉没有C++灵活。

关于 Record & TList 的一点吐槽的更多相关文章

  1. chromiun 学习《一》

    众所周知,Chrome是建立在开源的Chromium项目上的. 而且不得不说,学习并分析开源项目的代码对一个程序员的提高确实蛮大的.这篇博文我会记录一下学习过程中我遇到的一些问题,并分享学习中我所参考 ...

  2. HDU 4609 3-idiots FFT+容斥

    一点吐槽:我看网上很多分析,都是在分析这个题的时候,讲了半天的FFT,其实我感觉更多的把FFT当工具用就好了 分析:这个题如果数据小,统计两个相加为 x 的个数这一步骤(这个步骤其实就是求卷积啊),完 ...

  3. Visual Studio 20周年,我和VS不得不说的故事(内含福利)

    Visual Studio 2017正式版已如期发布(点击这里查看发布全记录)!自去年 11 月正式宣布 Visual Studio 项目之后,微软终于正式推出了“宇宙最强集成开发环境(IDE)”的最 ...

  4. 【★】EIGRP终极解析!

    EIGRP的思维导图 如图,我想采用一种全新的"框架式"教学法,或者叫"盖楼",旨在利用抽象的外部接口,分类分层地介绍各个机制之间的关系.其实任何学习到最后都 ...

  5. 产品炼成记·hostingranking.cn·基于ghost的轻量技术架构整理

    本篇纯粹只讲hostingranking.cn网站的技术架构,也就是怎么做到的,达到什么效果.至于它是什么,为什么要做暂且不说,另篇会分享. 技术组成 首先hostingranking.cn是基于gh ...

  6. Shadow Properties之美(二)【Microsoft Entity Framework Core随笔】

    接着上一篇Shadow Properties之美(一),我们来继续举一个有点啰嗦的栗子. 先看简单需求:某HR系统,需要记录员工资料.需要记录的资料有: 员工号(规则:分公司所在城市拼音首字母,加上三 ...

  7. Visual Studio 20周年,我和VS不得不说的故事

    Visual Studio 2017正式版已如期发布(点击这里查看发布全记录)!自去年 11 月正式宣布 Visual Studio 项目之后,微软终于正式推出了“宇宙最强集成开发环境(IDE)”的最 ...

  8. OO最后一次作业

    终于开始最后一次作业了,是时候为这学期oo画一个圆满的局句号了. 回首这学期的OO经历,一路走来,经过了开始对面向对象的初步接触,然后就是充满痛苦回忆的多线程,接下来到了令人焦头烂额的规格设计,最后是 ...

  9. ANTLR4权威指南 - 第5章 设计语法

    在第I部分,我们熟悉了ANTLR,并在一个比较高的层次上了解了语法以及语言程序.现在,我们将要放慢速度来学习下实现更实用任务的一些细节上的技巧,例如建立内部数据结构,提取信息,生成输入对应的翻译内容等 ...

随机推荐

  1. [并查集] POJ 2236 Wireless Network

    Wireless Network Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 25022   Accepted: 103 ...

  2. 【图像处理】【SEED-VPM】5.uImage的烧写 & NFS烧写文件系统

    基于 TFTP 烧写 uImage 当用户对 SEED-VPM6467 下的内核驱动源码进行调整或者添加新的设备驱动后,需要对内核进行重新编译配置,编译生成内核镜像后,可以通过 tftp 下载到 SE ...

  3. php foreach 语法的遍历来源数组如果不是一个有效数组php会出现错误警告 Invalid argument supplied for foreach()

    在php中,foreach语法的遍历来源数组如果不是一个有效数组,php会出现错误警告 Invalid argument supplied for foreach() ,但是很多时候这个数组是取自某些 ...

  4. HDU 5010 Get the Nut(2014 ACM/ICPC Asia Regional Xi'an Online)

    思路:广搜, 因为空格加上动物最多只有32个那么对这32个进行编号,就能可以用一个数字来表示状态了,因为只有 ‘P’   'S' 'M' '.' 那么就可以用4进制刚好可以用64位表示. 接下去每次就 ...

  5. [转载]Three Trending Computer Vision Research Areas, 从CVPR看接下来几年的CV的发展趋势

    As I walked through the large poster-filled hall at CVPR 2013, I asked myself, “Quo vadis Computer V ...

  6. vs调试时启动多个Development Server

    环境:一个解决方案下面有多个项目,当调试其中一个项目时,其他项目也会开启服务,在右下角显示多个图标. 解决方法:选中不想启动的项目,按F4,然后把“总是在调试时启动”设置为Fasle.这样就搞定了.

  7. 带转义符的json解释

    1.json数组:jsonData.取json数组中message的appid的值.例子: var jsonData = { "code":"200", &qu ...

  8. Bootstrap <基础十八>面包屑导航(Breadcrumbs)

    面包屑导航(Breadcrumbs)是一种基于网站层次信息的显示方式.以博客为例,面包屑导航可以显示发布日期.类别或标签.它们表示当前页面在导航层次结构内的位置. Bootstrap 中的面包屑导航( ...

  9. 使用Python scipy linprog 线性规划求最大值或最小值(使用Python学习数学建模笔记)

    函数格式 scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method='simp ...

  10. AmazeUI定制

    定制流程 下载 Amaze UI 源码:从 GitHub 选择版本,点击 Source code (zip) 下载并解压(定制只适用于 Amaze UI 2.x): 下载安装 Node.js: 全局安 ...