关于 Record & TList 的一点吐槽
需求是把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 的一点吐槽的更多相关文章
- chromiun 学习《一》
众所周知,Chrome是建立在开源的Chromium项目上的. 而且不得不说,学习并分析开源项目的代码对一个程序员的提高确实蛮大的.这篇博文我会记录一下学习过程中我遇到的一些问题,并分享学习中我所参考 ...
- HDU 4609 3-idiots FFT+容斥
一点吐槽:我看网上很多分析,都是在分析这个题的时候,讲了半天的FFT,其实我感觉更多的把FFT当工具用就好了 分析:这个题如果数据小,统计两个相加为 x 的个数这一步骤(这个步骤其实就是求卷积啊),完 ...
- Visual Studio 20周年,我和VS不得不说的故事(内含福利)
Visual Studio 2017正式版已如期发布(点击这里查看发布全记录)!自去年 11 月正式宣布 Visual Studio 项目之后,微软终于正式推出了“宇宙最强集成开发环境(IDE)”的最 ...
- 【★】EIGRP终极解析!
EIGRP的思维导图 如图,我想采用一种全新的"框架式"教学法,或者叫"盖楼",旨在利用抽象的外部接口,分类分层地介绍各个机制之间的关系.其实任何学习到最后都 ...
- 产品炼成记·hostingranking.cn·基于ghost的轻量技术架构整理
本篇纯粹只讲hostingranking.cn网站的技术架构,也就是怎么做到的,达到什么效果.至于它是什么,为什么要做暂且不说,另篇会分享. 技术组成 首先hostingranking.cn是基于gh ...
- Shadow Properties之美(二)【Microsoft Entity Framework Core随笔】
接着上一篇Shadow Properties之美(一),我们来继续举一个有点啰嗦的栗子. 先看简单需求:某HR系统,需要记录员工资料.需要记录的资料有: 员工号(规则:分公司所在城市拼音首字母,加上三 ...
- Visual Studio 20周年,我和VS不得不说的故事
Visual Studio 2017正式版已如期发布(点击这里查看发布全记录)!自去年 11 月正式宣布 Visual Studio 项目之后,微软终于正式推出了“宇宙最强集成开发环境(IDE)”的最 ...
- OO最后一次作业
终于开始最后一次作业了,是时候为这学期oo画一个圆满的局句号了. 回首这学期的OO经历,一路走来,经过了开始对面向对象的初步接触,然后就是充满痛苦回忆的多线程,接下来到了令人焦头烂额的规格设计,最后是 ...
- ANTLR4权威指南 - 第5章 设计语法
在第I部分,我们熟悉了ANTLR,并在一个比较高的层次上了解了语法以及语言程序.现在,我们将要放慢速度来学习下实现更实用任务的一些细节上的技巧,例如建立内部数据结构,提取信息,生成输入对应的翻译内容等 ...
随机推荐
- Web前端开发规范手册
一.规范目的 1.1 概述 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进行前台页面开发. ...
- javasript_数据结构和算法_栈
//-----------------------------------存储结构为数组-------------------------------------------- function St ...
- javascript 中的借鸡生蛋
如题所说,其实指的是 js 中的内置函数和 apply 的结合使用.这种用法很讨巧,读过 jQuery 源码的小伙伴都知道,它在里面被应用的非常广泛和精妙! 梨子:找出一个数组中的最大值和最小值 普遍 ...
- android两种基本联网方式与一种第三方开源项目的使用
安卓请求网络的三种方式 在请求网络的时候一般常用的提交方式是post或者get请求,post请求安全,传输大小无限制,但是代码量多些,get请求是浏览器有大小限制,用户提交的信息在浏览器的地址栏显示出 ...
- Flapper Bird的学习笔记(一)
因为我有一个超屌的梦想,所以就绝不做孬种的追梦人! 本文主要目的是为了实现Flapper Bird的功能. 另外一个目的是为了加强对Unity引擎的理解和掌握. 新人一枚,如若看到是我幸运.若是发现错 ...
- LeetCode 7 Reverse Integer int:2147483647-2147483648 难度:2
https://leetcode.com/problems/reverse-integer/ class Solution { public: int inf = ~0u >> 1; in ...
- POJ 2229 Sumsets
Sumsets Time Limit: 2000MS Memory Limit: 200000K Total Submissions: 11892 Accepted: 4782 Descrip ...
- tips of my ubuntu 16.04 LTS
update_0 : sudo .../idea.sh 才会把idea安装上,不加sudo也会启动,但是不会在开始菜单中找到程序. ---------------------------------- ...
- img图片下面出现莫名的下边距解决办法
图片底部的空隙实际上涉及行内元素的布局模型,图片默认的垂直对齐方式是基线,而基线的位置是与字体相关的.所以在某些时候,图片底部的空隙可能是 2px,而有时可能是 4px 或更多.不同的 font-si ...
- C# 进程和线程
一.进程和线程 进程是对一段静态指令序列的动态执行过程,是系统进行资源分配和调度的基本单位.与进程相关的信息包括进程的用户标志.正在执行的已经编译好的程序.程序和数据在存储器中的位置等.同一个进程有可 ...