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-效果展示

Android recorder保存为WAV格式_delphi


3-以下部分转载

虽然现在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平台上能实现接口

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;
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位即可。

所以针对上面的问题,在程序开发中尽量少采用记录体类型,直接定义一个相应的类即可,定义一个相应的类处理的好处时,可以与面对对象的开发的方法相一致,只不过是比记录体多了创建与释放而已,但相应的初始化或方法、属性在类中很容易实现,同时对于程序的扩展类也很容易处理,记录体可能会比较麻烦,如在记录体中增加一个字段,那有可能整个程序都需要变化,但在对象中增加一个属性会显得非常方便,同时也容易对于对象中的属性内容进行初始化处理。

另:在对不定长记录进行再分配空间时,如增加一个长度的空间,在系统中的处理是先开避一块内存地址保存当前内容再在此基础上加一个长度的地址长度,即在相应的内存中需要复制两个长度的地址后才能完成增加长度。