在Delphi中的Record类型中,与之C语言对应的即是结构体类型(struct),也可能是为了符合C语言或C++程序员的习惯,对于它在Delphi中的应用存在的一些问题进行初步的说明。在Delphi中的记录体类型有两种方式定义

Type
RecTest = record (packed)
ID :integer;
Name :string;
Descript:string;
end;
之两种类型的主要区别在于在内存中的存放,Packed是紧缩类型的,可以节省内存空间与存放的空间,但是它定义好了对应的长度,所以不太适合存放不定长的数据,如string类型的数据;同时在使用记录体类型时特别要注意的是使用记录体数组的情况,使用不当不仅仅会出现性能方面的问题,同时也会产生意想不到的错误。如 RecList arrary[0..100] of RecTest,如采用这样的定义的方面,会产生的问题有:
1.当用数组下标访问对应的记录体元素时,到后面的数据记录访问时间会越来越长,如RecList[89] ,它需要将RecTest中移动88个记录长度,由于RecTest是不定长的,所以每次移动的长度也可能不相同,所以导致定位数组中记录体时定位时间长
2.当对记录体进行赋值时,如果想默认或遗忘给某个变量赋值,则会产生比较严重的后果,当应用到该变量时,可能会读取到错误的数值
如一定要使用记录体类型的,可以采用一些变通的方法,如采用数组指针,这样可以大幅提升性能,如针对前面的记录体数据情况,可以多定义一个指针变量,如下: PRecList = ^RecTest
RecList arrary[0..100] of PRecList
这样定义相对的好处就是每次移动时,只需要移动记录指针的长度数即可,即在现有的windows系统中,只需要移动4位即可。
所以针对上面的问题,在程序开发中尽量少采用记录体类型,直接定义一个相应的类即可,定义一个相应的类处理的好处时,可以与面对对象的开发的方法相一致,只不过是比记录体多了创建与释放而已,但相应的初始化或方法、属性在类中很容易实现,同时对于程序的扩展类也很容易处理,记录体可能会比较麻烦,如在记录体中增加一个字段,那有可能整个程序都需要变化,但在对象中增加一个属性会显得非常方便,同时也容易对于对象中的属性内容进行初始化处理。
另:在对不定长记录进行再分配空间时,如增加一个长度的空间,在系统中的处理是先开避一块内存地址保存当前内容再在此基础上加一个长度的地址长度,即在相应的内存中需要复制两个长度的地址后才能完成增加长度。

补充1:
1. 首先了解到record是可以限制field的范围的,而且定义枚举类型的。
type TDateRec = record
Year: Integer;
Month: (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
Day: 1..31;
end;
2. 可以在不定义结构体的情况下,直接在变量声明时使用。
var S: record
Name: string;
Age: Integer;
end;
3. 下面是变体部分,这是Delphi中变体在结构中的标准定义
type recordTypeName = record
fieldList1: type1;
...
fieldListn: typen;
case tag: ordinalType of
constantList1: (variant1);
...
constantListn: (variantn);
end;
Ø Tag可以省略
Ø constantList的类型和ordinalType的类型一致
Ø fieldList的类型不能是long strings, dynamic arrays, variants,也不能是包含这些的结 构体,但可以是指向这些类型的指针
Ø Tag和constantLists 在编译器处理这些字段时没有用,只是为程序员理解时提供方便 (原文:The optional tag and the constantLists play no role in the way the compiler manages the fields; they are there only for the convenience of the programmer.)
Ø 使用变体结构体的两个原因:一个是需要不同的数据,但是又不会同时需要所有的字段。
type TEmployee = record
FirstName, LastName: string[40];
BirthDate: TDate;
case Salaried: Boolean of
True: (AnnualSalary: Currency);
False: (HourlyWage: Currency);
end;
Ø 另一个原因是可以把同样的数据就像是不同的类型的数据。比如,你有一个64位的实数做为第一个字段,你就可以把它的高32位作为整数返回。这是Delphi帮助里说的。不太好看出来,而且Real到Interger的转换我也很少用。弄个Word到Byte的结构到时很常用。
Type
RConversion = record
Case Boolean of
True   : (aWord: Word;);
False   : (abyte bbyte : Byte;);
end;
这里附加一句观点,我和周围的同事认为这样的结构体会造成代码的易读性降低,一般在自己的代码中不建议使用,当然为兼容Windows的一些结构除外,他本来就是union当然用这样的直接套用就可以了。
结构体的基本应用就是这样的。还有一些特殊的应用,比如“class-like”的结构体,和file of record。
Class-like的结构体我不知道什么时候使用,既然需要Create,用类不就得了。下面有篇文章对原理有一些阐述http://blog.csdn.net/maozefa/archive/2007/08/27/1760612.aspx。
File of record,个人比较喜欢,特别是在记录某种数据的时候,经常是把一个结构体整个写入到文件里,既实现了一定程度的加密,又简单方便,读出来也可以直接放进结构体里。这里就不详细描述了。
补充2:
delphi语言在传统的Records类型的基础上增加了许多像类一样的高级功能,如:Records可以有属性和方法(包括构造constructors),类属性,类方法,类静态字段和内嵌类型。下面这个示例演示定义一个功能像类一样的Records:
type
TMyRecord = record
    type
      TInnerColorType = Integer;
    var
      Red: Integer;
    class var
      Blue: Integer;
    procedure printRed();
    constructor Create(val: Integer);
    property RedProperty: TInnerColorType read Red write Red;
    class property BlueProp: TInnerColorType read Blue write Blue;
end;
constructor TMyRecord.Create(val: Integer);
begin
Red := val;
end;
procedure TMyRecord.printRed;
begin
writeln('Red: ', Red);
end;
虽然现在records能实现许多类的特性,但它与类之间还是有一些不同:
1 records不支持继承
2 records能含有variant parts(呵呵,不知翻译成什么能说明白,就是case部分),类不可以
3 records是值类型,可以通过赋值拷贝,类是参考类型,因此不能通过赋值来拷贝。
4 records在win32和.net上允许操作符重载,类仅在.net上支持操作符重载
5 records使用一个缺省的没有参数的构造函数(constructor)自动创建,而类必须明确的创建。在record中用户定义的构造函数必须有一个或多个参数。
6 record类型不能有析构函数(destructors)
7 虚方法(那些指定了virtual、dynamic和message关键字的)不能使用在record类型中
8 record类型在win32开台上不能实现接口,在.net平台上能实现接口
record是用来定义记录类型的..
具体就是比如说你做一个录入&查询学生基本情况的程序,你就可以定义
student[50]:record
name:string;
age:integer;
weight:integer;
height:integer;
end;
然后在主程序里你就可以按 student[12].name:='yyydeyangzi'这样来给它赋值了..读取、打印等操作类似..这就算是一定意义上的面向对象程序设计了...也就是说把student[12]看作一个对象,name、age、weight、height之类的就是这个对象的各种属性...
但以上是按照pascal语法来说的,我对Delphi没有什么研究,但大体上应该是一致的...

转载于:https://blog.51cto.com/447118/274399

Delphi中record的使用相关推荐

  1. delphi中Record 和Packed Record的区别

    Record 和Packed Record 第一种不带packed关键字的结构体表明编译器编译时要求进行字对齐,而第二种带packed关键字的结构体表明编译器编译该结构体时不需要进行字对齐,这种方式对 ...

  2. DELPHI 中 Window 消息大全使用详解

    Window 消息大全使用详解 导读: Delphi是Borland公司的一种面向对象的可视化软件开发工具. Delphi集中了Visual C++和Visual Basic两者的优点:容易上手.功能 ...

  3. Delphi中的线程类

    Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchr ...

  4. 奇淫怪巧之在Delphi中调用不申明函数

    前一阵子,研究了一段时间的Win32Asm,研究到后来发现Win32的ASM实际上还是和C版的介绍的一样.甚至还封装了一个简版的类似VCL库结构框架的32ASM结构库,不过搞着搞着就没兴趣了,也没继续 ...

  5. Delphi中的指针类型

    首先讲讲指针类型在delphi中是怎么定义的: 指针类型的定义语法 type <指针类型标识符>=^<基类型>: 指针指向动态变量的类型是由^符后的基类型来标识,^符号也就是指 ...

  6. Delphi中使用ListView和TreeView的Item中的Data可能被忽略的内存泄漏

    Delphi中大家在使用 ListView和TreeView时,一般都会使用到Item的Data属性来保存大家自己的内部数据,这个Data的声明如下: property Data: Pointer; ...

  7. Delphi 中的 Var buffer 开类型参数

    以下是在网上收集的一些对无类型参数的说明.个人理解无类型变量就是一个指针. 象Delphi中function   Read(var   Buffer;   Count:   Longint):   L ...

  8. Delphi中的时间操作技术(1)

    在编写应用程序时,我们需要经常与时间和日期打交道,因此经常需要一些对时间的控制技术,在Delphi中,提供了一整套对日期和时间的操作函数,在此,我将详细介绍一下在Delphi中的时间操作技术,希望能对 ...

  9. delphi 中几种多线程操作方式

    在了解多线程之前我们先了解一下进程和线程的关系 一个程序至少有一个主进程,一个进程至少有一个线程. 主线程又程为UI线程. 进程和线程的主要差别在于它们是不同的操作系统资源管理方式.进程有独立的地址空 ...

最新文章

  1. runtime模型与字典互转
  2. selenium鼠标操作 包含右击和浮层菜单的选择
  3. 转载.Android HAL实现的三种方式(1) - 基于JNI的简单HAL设计
  4. MYSQL BENCHMARK函数的使用
  5. Oracle数据导入要多久,oracle数据库备份导入要注意的几个问题
  6. linuxliveu盘怎么用_施耐德LMC058 plc用U盘怎么传输程序?
  7. 【51NOD】1006 最长公共子序列Lcs(动态规划)
  8. AI2XAML's Bug
  9. 通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[下]:管道是如何构建起来的?...
  10. python运算符_零基础学习 Python 之运算符
  11. The Basic Knowledge of Graph(图的基本知识)
  12. 电磁场与电磁波第四版 课后习题
  13. 使用ArcGIS软件对 .jpg 图片添加经纬网及地理配准失败的原因
  14. windows下远程连接Mysql
  15. MediaPlayer.isPlaying() IllegalStateException的一种情况
  16. 【WPS表格】创建表格,汇总行
  17. 零跑C11斩获大奖,带来了极致的挑战
  18. 数量关系-排列组合和概率
  19. 计算机0基础知识,计算机基础知识0课件.ppt
  20. 多项式除以多项式例题讲解_多项式乘以多项式训练题.doc

热门文章

  1. maya python教程_Chris Zurbrigg的Maya Python教程合集
  2. 隐藏cmd,让电脑读出文字(中文发音),
  3. Github复现之D-LinkNet(补全了验证部分代码,效果还行)
  4. ArcGIS空间分析实验教程-部分实验案例(ArcPy实现)
  5. 【Python】flask框架学习 flask框架的基本使用
  6. html转换成移动端h5,HTML5移动端手机网站基本模板
  7. mac一直ReportCrash
  8. 网络自动化运维(NetDevOps)创作者推荐
  9. 山东初级消防设施操作员考前必背考点,模拟真题及答案
  10. matlab在管理学中的应用简述【一】