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;我想添加几个辅助函数,但是记录辅助函数的正常语法在用于变体记录时会抛出语法错误,并且语言参考没有提到将助手与变体记录一起使用的情况。有没有办法解决我错过的这个问题?
发布于 2020-04-17 23:27:50
问题是,记录的变体部分必须是记录的最后部分,而成员列表中的方法和属性下面不允许使用字段。这使得很难将这两个功能组合在一起。然而,有多种方法可以有效地绕过这一限制。
方法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:记录帮助器
如果这是不可接受的,您可以使用record helper
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之前还是之后。
https://stackoverflow.com/questions/61275148
复制相似问题