delphi中的record使用

上传人:平*** 文档编号:13300529 上传时间:2017-10-23 格式:DOC 页数:9 大小:52.27KB
返回 下载 相关 举报
delphi中的record使用_第1页
第1页 / 共9页
delphi中的record使用_第2页
第2页 / 共9页
delphi中的record使用_第3页
第3页 / 共9页
delphi中的record使用_第4页
第4页 / 共9页
delphi中的record使用_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《delphi中的record使用》由会员分享,可在线阅读,更多相关《delphi中的record使用(9页珍藏版)》请在金锄头文库上搜索。

1、在 Delphi 中的 Record 类型中,与之 C 语言对应的即是结构体类型(struct),也可能是为了符合 C 语言或 C+程序 员的习惯,对于它在Delphi 中的 应用存在的一些问题进行初步的说明。在 Delphi 中的记录体类型有两种方式定义 TypeRecTest = record (packed)ID :integer;Name :string;Descript:string;end;之两种类型的主要区别在于在内存中的存放,Packed 是紧缩类型的,可以节省内存空间与存放的空间,但是它定义好了对应的长度,所以不太适合存放不定长的数据,如 string 类型的数据;同时在使用

2、记录体类型时特别要注意的是使用记录体数组的情况,使用不当不仅仅会出现性能方面的问题,同时也会产生意想不到的错误。如 RecList arrary0.100 of RecTest,如采用这样的定义 的方面,会产生的问题有:1.当用数组下标访问对应的记录体元素时,到后面的数据记录访问时间会越来越长,如 RecList89 ,它需要将 RecTest 中移动 88 个记录长度,由于 RecTest 是不定长的,所以每次移动的长度也可能不相同,所以导致定位数组中记录体时定位时间长2.当对记录体进行赋值时,如果想默认或遗忘给某个变量赋值,则会产生比较严重的后果,当应用到该变量时,可能会读取到错误的数值如

3、一定要使用记录体类型的,可以采用一些变通的方法,如采用数组指针,这样可以大幅提升性能,如针对前面的记录体数据情况,可以多定义一个指针变量,如下: PRecList = RecTestRecList arrary0.100 of PRecList这样定义相对的好处就是每次移动时,只需要移动记录指针的长度数即可,即在现有的 windows 系统中,只需要移动 4 位即可。所以针对上面的问题,在程序开发中尽量少采用记录体类型,直接定义一个相应的类即可,定义一个相应的类处理的好处时,可以与面对对象的开发的方法相一致,只不过是比记录体多了创建与释放而已,但相应的初始化或方法、属性在类中很容易实现,同时对

4、于程序的扩展类也很容易处理,记录体可能会比较麻烦,如在记录体中增加一个字段,那有可能整个程序都需要变化,但在对象中增加一个属性会显得非常方便,同时也容易对于对象中的属性内容进行初始化处理。另:在对不定长记录进行再分配空间时,如增加一个长度的空间,在系统中的处理是先开避一块内存地址保存当前内容再在此基础上加一个长度的地址长度,即在相应的内存中需要复制两个长度的地址后才能完成增加长度。补充 1:1. 首先了解到 record 是可以限制 field 的范围的,而且定义枚举类型的。type TDateRec = record Year: Integer; Month: (Jan, Feb, Mar,

5、 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); . constant

6、Listn: (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

7、; they are there only for the convenience of the programmer.) 使用变体结构体的两个原因:一个是需要不同的数据,但是又不会同时需要所有的字段。type TEmployee = record FirstName, LastName: string40; BirthDate: TDate; case Salaried: Boolean of True: (AnnualSalary: Currency); False: (HourlyWage: Currency); end; 另一个原因是可以把同样的数据就像是不同的类型的数据。比如,你有一

8、个 64 位的实数做为第一个字段,你就可以把它的高 32 位作为整数返回。这是 Delphi 帮助里说的。不太好看出来,而且 Real到 Interger 的转换我也很少用。弄个 Word 到 Byte 的结构到时很常用。Type RConversion = recordCase Boolean ofTrue : (aWord: Word;);False : (abyte bbyte : Byte;);end;这里附加一句观点,我和周围的同事认为这样的结构体会造成代码的易读性降低,一般在自己的代码中不建议使用,当然为兼容Windows 的一些结构除外,他本来就是 union 当然用这样的直接套

9、用就可以了。结构体的基本应用就是这样的。还有一些特殊的应用,比如“class-like”的结构体,和 file of record。Class-like 的结构体我不知道什么时候使用,既然需要 Create,用类不就得了。下面有篇文章对原理有一些阐述http:/ of record,个人比较喜欢,特 别是在记录某种数据的时候,经常是把一个结构体整个写入到文件里,既实现了一定程度的加密,又简单方便, 读出来也可以直接放进结构体里。这里就不详细描述了。补充 2:delphi 语言在传统的 Records 类型的基础上增加了 许多像类一样的高级功能,如:Records 可以有属性和方法(包括构造 c

10、onstructors),类属性,类方法,类静态字段和内嵌类型。下面 这个示例演示定义一个功能像类一样的 Records: typeTMyRecord = recordtypeTInnerColorType = Integer;varRed: Integer;class var Blue: Integer;procedure printRed();constructor Create(val: Integer);property RedProperty: TInnerColorType read Red write Red;class property BlueProp: TInnerColo

11、rType read Blue write Blue;end;constructor TMyRecord.Create(val: Integer);beginRed := val;end;procedure TMyRecord.printRed;beginwriteln(Red: , Red);end;虽然现在 records 能实现许多类的特性,但它与类之间还是有一些不同:1 records 不支持继承2 records 能含有 variant parts(呵呵,不知翻 译成什么能说明白,就是case 部分),类不可以3 records 是值类型,可以通过赋值拷贝, 类是参考类型,因此不能通

12、过赋值来拷贝。4 records 在 win32 和.net 上允许操作符重载 ,类仅在.net 上支持操作符重载5 records 使用一个缺省的没有参数的构造函数(constructor )自动创建,而类必须明确的创建。在 record 中用户定义的构造函数必须有一个或多个参数。6 record 类型不能有析构函数(destructors)7 虚方法(那些指定了 virtual、dynamic 和 message 关键字的)不能使用在 record 类型中8 record 类型在 win32 开台上不能实现接口,在.net 平台上能实现接口record 是用来定义记录类型的.具体就是比如说

13、你做一个录入&查询学生基本情况的程序,你就可以定义student50:recordname:string;age:integer;weight:integer;height:integer;end;然后在主程序里你就可以按 student12.name:=yyydeyangzi这样来给它赋值了.读取、打印等操作类似.这就算是一定意义上的面向对象程序设计了.也就是说把 student12看作一个对象,name、age、weight、height 之类的就是这个对象的各种属性.但以上是按照 pascal 语法来说的,我对 Delphi 没有什么研究,但大体上应该是一致的.Delphi 中 reco

14、rd 的使用补充2009-06-02 21:041. 首先了解到 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

15、 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

16、在编译器处理这些字段时没有用,只是为程序员理解时提供方便 (原文: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: string40; BirthDate: TDate; case Salaried: Boolean of True: (AnnualS

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号