Delphi中的RecordDelphi 2009-05-23 14:21:14 阅读889 评论0 字号:大中小 订阅
Delphi中的Record是什么作者:一笑 人气:0 更新:2008-4-12 16:03:50 出自:WWW.YgRen.CN 在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位即可。
所以针对上面的问题,在程序开发中尽量少采用记录体类型,直接定义一个相应的类即可,定义一个相应的类处理的好处时,可以与面对对象的开发的方法相一致,只不过是比记录体多了创建与释放而已,但相应的初始化或方法、属性在类中很容易实现,同时对于程序的扩展类也很容易处理,记录体可能会比较麻烦,如在记录体中增加一个字段,那有可能整个程序都需要变化,但在对象中增加一个属性会显得非常方便,同时也容易对于对象中的属性内容进行初始化处理。
另:在对不定长记录进行再分配空间时,如增加一个长度的空间,在系统中的处理是先开避一块内存地址保存当前内容再在此基础上加一个长度的地址长度,即在相应的内存中需要复制两个长度的地址后才能完成增加长度
------------------------------------------------------------------
把DELPHI的RECORD转成简单CLASS
近来把一些DELPHI写的代码重构过程中,遇到点小问题.旧代码是比较纯粹的面向过程方式书写,定义了若干种的RECORD类型来表示应用中的实体信息,当然也少不了定义了大堆对这些RECORD类型各自操作的函数.
重构代码计划我考虑分几步,首先为部分RECORD定义相应的类,然后一步步理清各种实体的派生关系,用多态替换掉原有大量难看的条件判断,
首先就有一个问题摆在面前,首先要解决RECORD与类(对象)相互转换问题,这儿有个问题,旧代码里面的RECORD有部分是临时变量,是栈分配,另一部分则是分配在自定义的几个内存堆里,可以一次简单全部释放.
而DELPHI对象呢,一般都是从一个全局堆里分配,要同RECORD转换,这是关键性的矛盾.
既然回避不了,就想法解决,当仔细跟踪DELPHI对象实例化的过程代码后,才发觉解决方法原来如此简单:
一个简单例子:
type
THello =class
public
a:Integer;
b:char;
c:string;
procedure Say;
procedure FreeInstance;override;//override它之后,FREE时就不会释放内存.
end;
THelloRec=record
p:pointer;//它是一个TClass指针,这儿纯为占四字节用.
a:Integer;
b:char;
c:string;
end;
.......................
{ THello }
procedure THello.Say;
begin
ShowMessage('Hello');
end;
procedure THello.FreeInstance;
begin
// inherited;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
hello:THello;
buf:THelloRec;
begin
// fillchar(buf,sizeof(buf),0);//这句多余了,InitInstance会清空这块内存,记住这点很重要.
hello:=THello(THello.InitInstance(@buf));//这样,对象与这个RECORD变量
//就共享同一块空间
hello.a:=500;
hello.b:='d';
hello.c:='hello....!!';
hello.Say;
ShowMessage(buf.c);
// hello.Free; 这个对象自己没分配空间,是使用BUF的空间.因此不要FREE.
end;
==========================================
另一种写法可以更直接些..
procedure TForm1.Button1Click(Sender: TObject);
var
hello:THello;
buf :THelloRec;
begin
buf.p:=THello;
hello:=THello(@buf);//这样,对象与这个RECORD变量
//就共享同一块空间
hello.a:=500;
hello.b:='d';
hello.c:='hello....!!';
hello.Say;
end;
分享到:
相关推荐
delphi 三层中传递自定义Record的例子
在Delphi三层中如何传递自定义Record类型数据的例子
delphi数据集和json互转自己封装的调用的是lkJSON-1.07解析json字符串
delphi 2010 socket发送结构体协议
Delphi编写soap服务器与客户端程序[收集].pdf
3、System.SysUtils中TCurrency的Record Helper使货币的工作更加简单和容易。 4、C++ RTL的改进包括在Delphi类中使用make_shared和make_unique,对Delphi字符串的string_view支持,以及Delphi/C++字符串的简单转换。...
Delphi结构中使用String时遇到的内存泄露问题.mht
Delphi 类型指针变得简单。 它是什么? 它是一个用于在运行时创建某种类型数组的小单元,忘记GetMem()和FreeMem()并try..finally块。 通常当需要使用数组作为指针时,我们必须使用GetMem()或alloc()通过指定元素的...
一个实现录音功能的Delphi模块类源码,结合电话可实现电话录音
摘要:Delphi源码,系统相关,计数引用,串长 本Delphi示例源码用于演示直接操作引用计数和串长。 输出结果是: ______________________________________________________ Str: 123456 Ref: 1 ...
delphi2-delphi2010 全支持 dcu 装换 pas -------------------------------------------------------------------------------- Project Dcu2Pas Version 1.3 Purpose Decompile a D2-D7, K1-K3's dcu(dpu) file ...
修改方法:在WINDOWS单元中找到此函数后,把BOOL改为Integer,共有三处要修改,然后在Delphi安装路径Lib中找到WINDOWS.DCU文件,把它改名或者删除,并把修改后的WINDOWS.PAS源码复制到Lib路径中。 ---- 该函数只有...
修改方法:在WINDOWS单元中找到此函数后,把BOOL改为Integer,共有三处要修改,然后在Delphi安装路径Lib中找到WINDOWS.DCU文件,把它改名或者删除,并把修改后的WINDOWS.PAS源码复制到Lib路径中。 ---- 该函数只有...
本人已在Delphi 2010中运行通过,在本人编制的进销存软件中应用完全正常。 注:Delphi2010里面安装不要修改bpl文件的输出路径,采用默认值,否则安装难以成功。 Version 5.0的改进: + At design-time grid can ...
as well as customizing when a custom control appears in a column instead of showing up for every record. Also includes integrated sorting, filtering, and grouping enhancements. Delphi XE3 ...
万一的博客,很好的delphi资料,很多的介绍,几本的都有了。还有些拓展的东西,值得一看,当然也可以去找找他的正式的博客也行。可能更全
众所周知,在Delphi中,类的private和protected域中的变量可以被同一单元中可以自由的被访问(Delphi的类没有“友元”的概念,但同一个unit中可以说自动友元化了),而并非是真正的私有或只能被继承类访问。...
Delphi读取硬盘驱动器序列号的源代码范例, 一个读取硬盘驱动器序列号的功能的 DLL Delphi 调用端. 一个简单的查看 硬盘驱动器信息。还有一个导出函数 读取硬盘序列号。相关代码参考如下: const PDLL = '...
elphi 获取硬盘序列号、cpu号、bios号、网卡号2010-08-08 11:27转载自 blackscreen最终编辑 jxq61delphi 获取硬盘 序列号 function GetIdeNum: String; type TSrbIoControl = packed record HeaderLength : ULONG...
该源码是Delphi7写的一个IOCP简单例子,主要是演示IOCP的应用基础,以及帮助大家理解IOCP,便于初学者学习和理解IOCP到底是怎么一回事,是怎么实现网络通信的。 主程序由客户端和服务端组成,服务端完成端口操作定义...