gpt4 book ai didi

变体记录中的delphi辅助函数

转载 作者:行者123 更新时间:2023-12-03 15:30:06 25 4
gpt4 key购买 nike

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;

我想为此添加几个帮助器函数,但是记录帮助器的正常语法在变体记录上使用时会引发语法错误,并且语言引用没有提及将帮助器与变体记录一起使用的情况。有没有一种方法可以做到我所缺少的?

最佳答案

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

方法一:虚拟记录

您可以对变体部分使用虚拟记录:

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:录制助手

如果这是 Not Acceptable ,您可以使用 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)的,因此所有成员都是公共(public)的——无论是在 public 之前还是之后。

关于变体记录中的delphi辅助函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61275148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com