已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在Delphi中的Record类型中,与之C语言对应的即是结构体类型(struct),也可能是为了符合C语言或C+程序员的习惯,对于它在Delphi中的应用存在的一些问题进行初步的说明。在Delphi中的记录体类型有两种方式定义 Type RecTest = record (packed) ID :integer; Name :string; Descript:string; end;之两种类型的主要区别在于在内存中的存放,Packed是紧缩类型的,可以节省内存空间与存放的空间,但是它定义好了对应的长度,所以不太适合存放不定长的数据,如string类型的数据;同时在使用记录体类型时特别要注意的是使用记录体数组的情况,使用不当不仅仅会出现性能方面的问题,同时也会产生意想不到的错误。如 RecList arrary0.100 of RecTest,如采用这样的定义的方面,会产生的问题有:1.当用数组下标访问对应的记录体元素时,到后面的数据记录访问时间会越来越长,如RecList89 ,它需要将RecTest中移动88个记录长度,由于RecTest是不定长的,所以每次移动的长度也可能不相同,所以导致定位数组中记录体时定位时间长2.当对记录体进行赋值时,如果想默认或遗忘给某个变量赋值,则会产生比较严重的后果,当应用到该变量时,可能会读取到错误的数值如一定要使用记录体类型的,可以采用一些变通的方法,如采用数组指针,这样可以大幅提升性能,如针对前面的记录体数据情况,可以多定义一个指针变量,如下: PRecList = RecTest RecList arrary0.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: string40; BirthDate: TDate; case Salaried: Boolean of True: (AnnualSalary: Currency); False: (HourlyWage: Currency); end; 另一个原因是可以把同样的数据就像是不同的类型的数据。比如,你有一个64位的实数做为第一个字段,你就可以把它的高32位作为整数返回。这是Delphi帮助里说的。不太好看出来,而且Real到Interger的转换我也很少用。弄个Word到Byte的结构到时很常用。Type RConversion = recordCase Boolean ofTrue : (aWord: Word;);False : (abyte bbyte : Byte;);end;这里附加一句观点,我和周围的同事认为这样的结构体会造成代码的易读性降低,一般在自己的代码中不建议使用,当然为兼容Windows的一些结构除外,他本来就是union当然用这样的直接套用就可以了。结构体的基本应用就是这样的。还有一些特殊的应用,比如“class-like”的结构体,和file of record。Class-like的结构体我不知道什么时候使用,既然需要Create,用类不就得了。下面有篇文章对原理有一些阐述/maozefa/archive/2007/08/27/1760612.aspx。File of record,个人比较喜欢,特别是在记录某种数据的时候,经常是把一个结构体整个写入到文件里,既实现了一定程度的加密,又简单方便,读出来也可以直接放进结构体里。这里就不详细描述了。补充2:delphi语言在传统的Records类型的基础上增加了许多像类一样的高级功能,如:Records可以有属性和方法(包括构造constructors),类属性,类方法,类静态字段和内嵌类型。下面这个示例演示定义一个功能像类一样的Records: typeTMyRecord = 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);beginRed := val;end;procedure TMyRecord.printRed;beginwriteln(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是用来定义记录类型的.具体就是比如说你做一个录入&查询学生基本情况的程序,你就可以定义student50:recordname:string;age:integer;weight:integer;height:integer;end;然后在主程序里你就可以按 :=yyydeyangzi这样来给它赋值了.读取、打印等操作类似.这就算是一定意义上的面向对象程序设计了.也就是说把student12看作一个对象,name、age、weight、height之类的就是这个对象的各种属性.但以上是按照pascal语法来说的,我对Delphi没有什么研究,但大体上应该是一致的.Delphi中record的使用补充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 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: string40; BirthDate: TDate; case Salaried: Boolean of True: (AnnualSalary: Currency); False: (HourlyWage: Currency); end; 另一个原因是可以把同样的数据就像是不同的类型的数据。比如,你有一个64位的实数做为第一个字段,你就可以把它的高32位作为整数返回。这是Delphi帮助里说的。不太好看出来,而且Real到Interger的转换我也很少用。弄个Word到Byte的结构到时很常用。Type RConversion = recordCase Boolean ofTrue : (aWord: Word;);False : (abyte bbyte : Byte;);end;这里附加一句观点,我和周围的同事认为这样的结构体会造成代码的易读性降低,一般在自己的代码中不建议使用,当然为兼容Windows的一些结构除外,他本来就是union当然用这样的直接套用就可以了。结构体的基本应用就是这样的。还有一些特殊的应用,比如“class-like”的结构体,和file of record。Class-like的结构体我不知道什么时候使用,既然需要Create,用类不就得了。下面有篇文章对原理有一些阐述/maozefa/archive/2007/08/27/1760612.aspx。File of record,个人比较喜欢,特别是在记录某种数据的时候,经常是把一个结构体整个写入到文件里,既实现了一定程度的加密,又简单方便,读出来也可以直接放进结构体里。这里就不详细描述了。delphi语言在传统的Records类型的基础上增加了许多像类一样的高级功能,如:Records可以有属性和方法(包括构造constructors),类属性,类方法,类静态字段和内嵌类型。下面这个示例演示定义一个功能像类一样的Records: typeTMyRecord = record type TInnerColorType = Integer; var Red: Integer; class var Blue: Integer; procedure printRed(); constructor Create(val: Integer); prop
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年注册环保工程师考试高频考点专项训练卷
- 预制板梁安装工程合同(3篇)
- 公务员国考历年行测真题(2018)及答案
- 2025年众创空间建设项目可行性研究报告及总结分析
- 2025年民宿客源分配协议
- 2025年山东省济宁市微山县保安员招聘考试题库附答案解析
- 2025年流媒体平台开发项目可行性研究报告及总结分析
- 2025年美容美发培训服务协议
- 2025年绿色化工技术的应用与推广可行性研究报告及总结分析
- 2025年文化艺术教育项目可行性研究报告及总结分析
- 高分子化学期末考试试卷及答案
- DB1509∕T 0004-2023 东佛里生羊饲养管理技术规程
- 宝安区集体物业招商招租管理办法(征求意见稿)
- 室内精装修工程施工工艺标准
- 算力资源集中管理与调度平台方案
- 新闻真实性的理论与实践
- 陕西教师岗前考试真题及答案解析
- 秋冬季防火安全培训课件
- YS-T1714-2024《连接器用铍铜丝》
- 越南自卫反击战课件
- Unit 1 Happy Holiday测试卷 (含答案)人教版(2024)八年级英语上册
评论
0/150
提交评论