记录在案(无法初始化)

时间:2011-07-12 15:53:52

标签: delphi

我有2条这样的记录:

TYPE
 TRecord2= packed record
  i2: Integer;
 end;

 TRecord1= packed record
  i1: Integer;
  R2: TRecord2;
 end;

我想将记录字段初始化为零,但我不想使用FillMemory,因此我声明了2个常量记录,其中我初始化字段。

CONST
  Record2c: TRecord2=
  (
   i2: 0;
  );

  Record1c: TRecord1=
  (
    i1: 0;
    R2: Record2c;      <------- error line
  );

但是,我无法将Record2c分配给R2字段。编译器说:E2029'('期望但标识符'Record2c'找到。

但是这有用(如果我评论我有错误的行):

procedure test;
var Record1: TRecord1;
begin
 Record1:= Record1c;      // initialize variable by associating the constant to it
end

那么,我如何初始化R2字段?

3 个答案:

答案 0 :(得分:5)

那是因为Record2c是一个类型常量,它不是真正的&#34;真实的&#34;不变。所以你不能用它来初始化另一个常量。您必须声明Record1c喜欢

  Record1c: TRecord1 =
    (
    i1: 0;
    R2: (i2: 0);
    );

答案 1 :(得分:5)

您只能使用 true常量初始化consts。真常量没有类型 - 那些是类型常量。请参阅Delphi文档中的Declared Constants。代码中的Record2c是一个类型化常量,因此它不能用于初始化Record1c所需的const表达式中。您只需要列出Record1c.R2的定义:

const
  Record1c: TRecord1 = (
    i1: 0;
    R2: (i2: 0;);
  );

当您注释掉错误行时,您将R2字段默认初始化为零。

答案 2 :(得分:3)

在Delphi-2009及更高版本中,可以通过Default调用将记录归零。

record1 := Default(TRecord1);  // This will zero record1 including R2

请参阅问题David's answerHow to properly free records that contain various types in Delphi at once?