如何在记录中声明固定值?

时间:2012-03-15 18:56:48

标签: delphi

我想知道如何声明一个有固定值的记录。我需要使用这种模式发送数据:Byte($FF)-Byte(0..250)-Byte(0..250)。我正在使用record,我希望它的第一个值保持不变,这样就不会搞砸了。 如:

TPacket = record
  InitByte: byte; // =255, constant
  FirstVal,
  SecondVal: byte;
end;

4 个答案:

答案 0 :(得分:13)

您不能依赖构造函数,因为与Classes相反,Records不需要使用它们,隐式使用默认的无参数构造函数。

但你可以使用常量字段:

type
  TPacket = record
   type
     TBytish = 0..250;
   const
     InitByte : Byte = 255;
   var
     FirstVal,
     SecondVal: TBytish;
  end;

然后将此作为常规记录使用,除非您没有(并且您不能)更改InitByte字段。
FillChar保留常量字段并按预期运行。

procedure TForm2.FormCreate(Sender: TObject);
var
  r: TPacket;
begin
  FillChar(r, SizeOf(r), #0);
  ShowMessage(Format('InitByte = %d, FirstVal = %d, SecondVal = %d', [r.InitByte, r.FirstVal,r.SecondVal]));
  // r.InitByte := 42;  // not allowed by compiler
  // r.FirstVal := 251; // not allowed by compiler
  r.FirstVal := 1;
  r.SecondVal := 2;
  ShowMessage(Format('InitByte = %d, FirstVal = %d, SecondVal = %d', [r.InitByte, r.FirstVal,r.SecondVal]));
end;

已更新以包含嵌套类型范围0..250

答案 1 :(得分:2)

Delphi的现代版本允许记录方法。虽然您无法阻止某人更改字段,但您至少可以正确初始化它:

type
  TPacket = record
    InitByte: byte; // =255, constant
    FirstVal,
    SecondVal: byte;
    constructor Create(val1, val2 : byte);
  end;


constructor TPacket.Create(val1, val2: byte);
begin
  InitByte := 255;
  FirstVal := val1;
  SecondVal := val2;
end;

答案 2 :(得分:0)

鉴于记录现在可以拥有属性,您可以将记录定义为:

TMixedFixed = record
strict private
  FFixed: byte;
  FVariable1: byte;
  FVariable2: byte;
public
  property Fixed read FFixed;
  property Variable read FVariable write FVariable;
  constructor Create(Var1, Var2: byte);
end; 

constructor TMixedFixed.create(Var1, Var2: byte);
begin
  FFixed:= 255;
  FVariable1:= Var1;
  FVariable2:= Var2;  
end;

鉴于真实变量是严格私密的,你应该无法在没有特殊魔法的情况下触碰它们。 您必须使用构造函数来初始化“固定”值。

答案 3 :(得分:0)

这是最简单的方法:

type
  TPacket = record
    InitByte: byte; // =255, constant
    FirstVal,
    SecondVal: byte;
  end;

var  
  Packet : TPacket = (InitByte: 255);

const
  Packet1 : TPacket = (InitByte: 255);