No se puede confiar en un constructor, ya que, al contrario de las clases, los registros no están obligados a usarlos, el constructor sin parámetros por defecto que se utiliza de forma implícita.
Pero se puede utilizar un campo constante:
type
TPacket = record
type
TBytish = 0..250;
const
InitByte : Byte = 255;
var
FirstVal,
SecondVal: TBytish;
end;
A continuación, utilice esto como un registro regular, excepto que usted no tiene (y no se puede) cambiar el campo InitByte
.
FillChar
conserva el campo constante y se comporta como se esperaba.
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;
Actualizado para incluir el alcance tipo anidado 0..250
Se podría recurrir a tipos subrango – OnTheFly
Si todo lo que estamos haciendo es valores de bytes en un TPacket, en lugar me gustaría utilizar RawByteString y simplemente definir constantes con nombre InitByte = 0, FIrstVal = 1, y así sucesivamente. Y me aseguraré de que el valor inicial sea el valor constante correcto al hacerlo en CÓDIGO en mi función PacketBuild. –
¿Qué versión de Delphi usará? – kobik