首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变量记录中的delphi辅助函数

变量记录中的delphi辅助函数
EN

Stack Overflow用户
提问于 2020-04-17 23:24:15
回答 1查看 205关注 0票数 4

Delphi 10.2:我有一个不同的记录定义:

代码语言:javascript
复制
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;

我想添加几个辅助函数,但是记录辅助函数的正常语法在用于变体记录时会抛出语法错误,并且语言参考没有提到将助手与变体记录一起使用的情况。有没有办法解决我错过的这个问题?

EN

回答 1

Stack Overflow用户

发布于 2020-04-17 23:27:50

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

方法1:虚拟记录

您可以对变量部件使用虚拟记录:

代码语言:javascript
复制
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

代码语言:javascript
复制
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可见性关键字来规避您正在观察的语法限制。通过使用此关键字,您可以编写

代码语言:javascript
复制
type
  TTest = packed record
    procedure Test;
  public
    Name: string;
    Age: Integer;
    case Byte of
        0: (Data: Integer);
        1: (Tag: Byte);
  end;

不会有任何副作用。这是因为默认的可见性是公共的,所以所有成员都是公共的--无论是在public之前还是之后。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61275148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档