delphi-helper函数在变量记录中



Delphi 10.2:我有一个变体记录定义:

type
TIPMCCmdPacket = packed record
TransactionID: Word;
FuncCode: Word;
DataLen: Word;
case byte of
//raw data buffer
0: (RawBuf: Array[0..16383] of Byte);
//error response
1: (ErrCode: Word;                            //error type code
ErrLen: Word;                             //length of error msg/data
ErrBuf: Array[0..16379] of AnsiChar);     //err msg buffer
//normal response, usually an ansistring
2: (BufCnt: Word;                             //byte count
Buffer: Array[0..16381] of Byte);         //response data
//structured-data response
3: (RecType: Word;                            //type code of record 
RecCnt: Word;                             //# of records
RecSize: Word;                            //size of each record
RecBuf: Array[0..16377] of Byte);         //data block
end;

我想添加几个helper函数,但记录helper的正常语法在变体记录上使用时会引发语法错误,并且语言引用没有提到将helper与变体记录一起使用的情况。有没有办法做到这一点,我错过了?

问题是记录的变体部分必须是记录的最后一部分,而成员列表中方法和属性下面不允许有字段。这使得很难将这两个功能结合起来。然而,有各种方法可以有效地规避这一限制。

方法1:伪记录

您可以使用变体部分的伪记录:

type
TTest = record
Name: string;
Age: Integer;
Dummy: record
case Byte of
0: (Data: Integer);
1: (Tag: Byte);
end;
procedure Test;
end;

这具有明显的效果,即您需要写入t.Dummy.Data而不是t.Data

方法2:记录助手

如果这是不可接受的,你可以使用一个记录助手:

type
TTest = record
Name: string;
Age: Integer;
case Byte of
0: (Data: Integer);
1: (Tag: Byte);
end;
TTestHelper = record helper for TTest
procedure Test;
end;
procedure TTestHelper.Test;
begin
ShowMessage(Name);
ShowMessage(Age.ToString);
ShowMessage(Data.ToHexString);
end;

方法3:使用可见性关键字作为分隔符

David Heffernan在一条评论中建议您可以使用public可见性关键字来规避您所观察到的语法限制。通过使用此关键字,您可以编写

type
TTest = packed record
procedure Test;
public
Name: string;
Age: Integer;
case Byte of
0: (Data: Integer);
1: (Tag: Byte);
end;

其没有不想要的副作用。这是因为默认可见性是公共的,所以所有成员都是公共的——在public之前和之后。

最新更新