关于 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,并在一个比较高的层次上了解了语法以及语言程序.现在,我们将要放慢速度来学习下实现更实用任务的一些细节上的技巧,例如建立内部数据结构,提取信息,生成输入对应的翻译内容等 ...
随机推荐
- 网站优化之PHPCMS如何开启伪静态
做为一名网站优化方面的工作,那么选择CMS系统的时候,有良好的网站优化功能就是一个好的CMS的标准之一,而系统是否支持伪静态,则是URL优化的工作之一,而PHPCMS是一款网站优化方面做得比较成功的C ...
- 数据中心第三方服务、金融IT外包服务、社保医疗信息化解决方案,这三类业务是什么关系,区别在哪?
这个话题很大,牵扯很多,试着回答一下,算是胡扯了. 三类业务的关系,都是IT外包,至于外包的内容很杂.DC的外包,多半是基建和建维,一般不牵扯到软件开发,网站建设类的.金融IT外包就复杂多了,信息系统 ...
- win764位下安装mysql-5.6.22-x64启动服务报 系统错误 1067的解决办法
本人电脑win7,64位,需要安装mysql服务器.版本:mysql-5.6.22-x64.安装完成后,在服务里面并没有mysql.于是在百度上搜了下,好多信息,最后把解决方法自己总结下. 在${pr ...
- 【图像处理】【SEED-VPM】7.ubuntu10.04下 TFTP,NFS 安装指南
Linux系统启动流程 程序开发调试的一般方法 1. TFTP下载内核+NFS网络文件系统.即内核和文件系统均不在板卡上.主要用于调试内核功能. 2. FLASH启动内核+NFS网络文件系统,即内核固 ...
- 批量生成clr脚本
use [dbname]go --1.产生crl程序集的sql --定义表变量,临时存储中间结果集declare @tb table(name nvarchar(100),permission_set ...
- WebView 的使用----android 网络连接处理分析
在Android中,可以有多种方式来实现网络编程: 创建URL,并使用URLConnection/HttpURLConnection 使用HttpClient 使用WebView 创建URL,并使用U ...
- Socket编程 -- 全双工通信
//这是客户端package com.test; import java.io.BufferedReader; import java.io.IOException; import java.io.I ...
- (BFS)poj3669-Meteor Shower
题目地址 为判断某时刻能否走到某位置,建立shi数组,记录某位置最早t时刻就不能走.(初始化为-1)之后开始从(0,0)出发bfs,用bu数组记录走到某一位置时花费的步数,并且需要用vi数组记录是否走 ...
- Eclipse - 修改默认user和类的创建日期
1.找到eclipse.ini文件 2.在文件中找到 -vmargs -Duser.name=xxxxxxxx 3.修改xxxxxxxx为你的名字 4.eclipse中:Window -> Pr ...
- Python3学习(一)-基础、数据类型、变量、字符串和编码、list&tuple、if、for、while、dict、set、函数与参数
##廖雪峰py3笔记 ## '//'这是获得相除后的整数部分 ##a = 10//3 ##print (a) ## '/'获得相除后的结果,为浮点数,结果能整除也也是浮点数 ##b = 10/3 ## ...