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

代码很简单:

  1. MyRec = record
  2.  
  3. MyStr: string;
  4.  
  5. constructor Create(AMyStr: string);
  6.  
  7. end;
  8.  
  9. TForm4 = class(TForm)
  10.  
  11. Button1: TButton;
  12.  
  13. procedure Button1Click(Sender: TObject);
  14.  
  15. public
  16.  
  17. MyList: TList<MyRec>;
  18.  
  19. end;
  20.  
  21. constructor MyRec.Create(AMyStr: string);
  22.  
  23. begin
  24.  
  25. MyStr := AMyStr;
  26.  
  27. end;
  28.  
  29. procedure TForm4.Button1Click(Sender: TObject);
  30.  
  31. begin
  32.  
  33. MyList := TList<MyRec>.Create;
  34.  
  35. MyList.Add(MyRec.Create('str'));
  36.  
  37. MyList.Items[].MyStr := 'www'; //[Error] Unit4.pas(): E2064 Left side cannot be assigned to
  38.  
  39. ShowMessage(MyList.Items[].MyStr);
  40.  
  41. end;

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

  1. procedure TForm4.Button1Click(Sender: TObject);
  2.  
  3. var
  4.  
  5. ps: ^string;
  6.  
  7. begin
  8.  
  9. MyList := TList<MyRec>.Create;
  10.  
  11. MyList.Add(MyRec.Create('str'));
  12.  
  13. ps := @MyList.Items[].MyStr; //[DCC Error] Unit4.pas(): E2036 Variable required
  14.  
  15. ps^ := 'www';
  16.  
  17. ShowMessage(MyList.Items[].MyStr);
  18.  
  19. end;

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

  1. Tpye
  2.  
  3. PMyRec = ^MyRec;
  4.  
  5. procedure TForm4.Button1Click(Sender: TObject);
  6.  
  7. begin
  8.  
  9. MyList := TList<PMyRec>.Create;
  10.  
  11. MyList.Add(MyRec.Create('str')); //[DCC Error] Unit4.pas(): E2010 Incompatible types: 'PMyRec' and 'MyRec'
  12.  
  13. MyList.Items[].MyStr := 'www';
  14.  
  15. ShowMessage(MyList.Items[].MyStr);
  16.  
  17. end;

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

  1. procedure TForm4.Button1Click(Sender: TObject);
  2.  
  3. begin
  4.  
  5. MyList := TList<PMyRec>.Create;
  6.  
  7. MyList.Add(@MyRec.Create('str')); //[DCC Error] Unit4.pas(): E2036 Variable required
  8.  
  9. MyList.Items[].MyStr := 'www';
  10.  
  11. ShowMessage(MyList.Items[].MyStr);
  12.  
  13. end;

……。继续改:

  1. procedure TForm4.Button1Click(Sender: TObject);
  2.  
  3. var
  4.  
  5. r: MyRec;
  6.  
  7. begin
  8.  
  9. MyList := TList<PMyRec>.Create;
  10.  
  11. r := MyRec.Create('str');
  12.  
  13. MyList.Add(@r);
  14.  
  15. MyList.Items[].MyStr := 'www';
  16.  
  17. ShowMessage(MyList.Items[].MyStr);
  18.  
  19. end;

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

  1. procedure TForm4.Button2Click(Sender: TObject);
  2.  
  3. begin
  4.  
  5. ShowMessage(MyList.Items[].MyStr); // Access Violation!
  6.  
  7. end;

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

  1. procedure TForm4.Button1Click(Sender: TObject);
  2.  
  3. var
  4.  
  5. p: PMyRec;
  6.  
  7. begin
  8.  
  9. MyList := TList<PMyRec>.Create;
  10.  
  11. New(p);
  12.  
  13. p.Create('str');
  14.  
  15. MyList.Add(p);
  16.  
  17. MyList.Items[].MyStr := 'www';
  18.  
  19. ShowMessage(MyList.Items[].MyStr);
  20.  
  21. 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. scala 的内部类

    class A { class B; def foo(b:A#B){} //def foo(b:B){} 后面的a1.foo(b2) 就不能通过编译 } object Main { def main( ...

  2. CentOS6.4下基于Nginx搭建mp4/flv流媒体服务器

    我的步骤如下:1. 安装依赖包: yum install glibc.i686#yum –y update#yum -y install gcc glibc glibc-devel make nasm ...

  3. Spring事务管理器的应对

    Spring抽象的DAO体系兼容多种数据访问技术,它们各有特色,各有千秋.像Hibernate是非常优秀的ORM实现方案,但对底层SQL的控制不太方便:而iBatis则通过模板化技术让你方便地控制SQ ...

  4. ORCALE复制表结构

    1.oracle 复制表结构 不要内容 create table 表1 as select * from 表2 where 1=2 2.oracle 复制表结构 要内容 create table 表1 ...

  5. CTE递归查询

    WITH ctetest(AgencyID,ParentAgencyID,level)AS ( SELECT AgencyID,ParentAgencyID,0 level FROM dbo.Web_ ...

  6. leetcode6

    好吧,今天晚上赶项目确实是做不了三道题目了,最近项目在网络编程方面有些进步,学到了东西,有时间再积累下来,很深的体会就是,和别人一起写代码,虽然蛋疼但是比自己一个人写要好点,不过发现自己对链表和排序什 ...

  7. 学习笔记 android fragment

    最近研究了一下fragment的使用方法,总结概要如下: 1.fragment实际上就是把activity拆开后的封装块,一个fragment就是一个封装好的一部分.这样以来可以方便复用. 2.fra ...

  8. 【mysql】语句优化

    论坛上看到有个类似的分割查看查询结果的梗 一时手痒就出手 治一治 比如有 A B 表A 表ID,NAME1,A2,B3,C B 表FK_ID,TYPE,VALUE1,socer,1001,socker ...

  9. java day2一个模拟双色球的代码

    package day2; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt ...

  10. IOS调用系统声音(键盘声音)

    #import <AudioToolbox/AudioToolbox.h> AudioServicesPlaySystemSound(1106); 注:括号中为系统声音的id,详见 htt ...