Delphi-记录类型record的使⽤1-案例代码(控制台应⽤程序)
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
// 定义⼀个结构类型
type Tpeople = record
Name :string;
Age:Integer;
Sex:string;
end;
var people:Tpeople;
begin
with  people do
begin
Name :='⼯藤新⼀';
Age :=18;
Sex :='男';
end;
Writeln('Name:',people.Name);
Writeln('Age:',people.Age);
Writeln('Sex:',people.Sex);
Readln;
end.
2-效果展⽰
3-以下部分转载
虽然现在records能实现许多类的特性,但它与类之间还是有⼀些不同:
1 records不⽀持继承
2 records能含有variant parts(呵呵,不知翻译成什么能说明⽩,就是case部分),类不可以
3 records是值类型,可以通过赋值拷贝,类是参考类型,因此不能通过赋值来拷贝。
4 records在win32和上允许操作符重载,类仅在上⽀持操作符重载
5 records使⽤⼀个缺省的没有参数的构造函数(constructor)⾃动创建,⽽类必须明确的创建。在record中⽤户定义的构造函数必须有⼀个或多个参数。
6 record类型不能有析构函数(destructors)
7 虚⽅法(那些指定了virtual、dynamic和message关键字的)不能使⽤在record类型中
8 record类型在win32开台上不能实现接⼝,在平台上能实现接⼝
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 wa y 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位作为整数返回。这是Delph i帮助⾥说的。不太好看出来,⽽且Real到Interger的转换我也很少⽤。弄个Word到Byte的结构到时很常⽤。
Type
RConversion = record
Case Boolean of
True : (aWord: Word;);
False : (abyte bbyte : Byte;);
end;
4-以下为转载
在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 app

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。