关于 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,并在一个比较高的层次上了解了语法以及语言程序.现在,我们将要放慢速度来学习下实现更实用任务的一些细节上的技巧,例如建立内部数据结构,提取信息,生成输入对应的翻译内容等 ...
随机推荐
- PE注入
// PE注入.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <windows.h> #include &l ...
- STEP模块——电子钟
原理 显示时分秒(日期也可以加上),两个按键调节时间 原理图 代码 /*---------------------------------------------------------------- ...
- HDU 1712 分组背包
ACboy needs your help Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- 不经过 App store 的安装方式(转)
所有安装到真机(非越狱)的应用(可以是 .app ,也可以是 .ipa ,只要编译时选的是编译成 Arm 的就好..app 转 .ipa 只需要一条命令) 都必须经过证书签名.证书主要有三大种: 企业 ...
- Android中的Context
Context用来访问全局信息的接口,比如影城程序的资源.一些常用的组件都是继承自Context,目的就是方便的访问资源,比如Activity, Service.... 从Context访问本组件的资 ...
- ajax里面success函数return上层接收不到
开发一个小功能,在success fail里直接return,没有收到返回值.排查,查了下往上的博客,参考了以下三个: http://blog.csdn.net/fairyhawk/article/d ...
- USB协议规范学习(一)
什么是USB OHCI规范? OHCI(Open HCI)是目前使用比较广泛的三种USB主机控制器规范之一.USB体系结构是由四个主要部分组成:客户软件/USB驱动,主机控制器驱动(HCD),主机控制 ...
- hudson slave搭建
Hudson Slave搭建 使用Hudson搭建分布式的构建环境非常方便,客户端也不需要太多的操作,只要能执行java命令就行. hudson默认采用master方式进行安装,master作为 ...
- Sqlite日期类型问题:该字符串未被识别为有效的 DateTime(String not recognized as a valid datetime)
使用SQLite抛出异常: 该字符串未被识别为有效的 DateTime 错误(String not recognized as a valid datetime) 解决方法: 也可以在连接字符串 修改 ...
- 开源一个网络图片浏览器HooPhotoBrowser
在公司开发项目中需要弹出展示从网络上下载的图片,并提供滑动展示功能.目前采用同事开发的图片浏览器,后期有时间想优化一下.所以重温了下以前开发的类似微博的项目中的图片浏览器代码,并抽取出来封装成了现在这 ...