我有一个相对复杂的数据结构来建模。我想用Delphi中的记录结构来做这个,结构很复杂,足以证明将它拆分成嵌套记录是正确的。一个简化的例子:
type
TVertAngle = record
strict private
fDecDegrees: Double;
fDegrees: integer;
fMinutes: integer;
fDeciSeconds: integer;
function GetAngle: Double;
function GetRadians: Double;
public
Valid: Boolean;
procedure SetAsString(const Value: string; const AngleType: TInfoUnits);
property DecDegrees: Double read GetAngle;
property Radians: Double read GetRadians;
end;
~~~~ other sub record declarations ~~~~~~
TDataRecord = record
strict private
fHorzDistance: Double;
fLeicaData: TRawMessageData;
fUpdateTime: TDateTime;
function DecodeGsi8(GsiWord: string): TGSiWord;
function DecodeGsi16(GsiWord: string): TGSiWord;
public
GsiWord: TGSiWord;
Valid: Boolean;
InputMode: TDataModes;
HorzAngle: THorzAngle;
VertAngle: TVertAngle;
HorzRange: TDistance;
SlopeRange: TDistance;
PrismOffset: TConstants;
~~~~ other sub record instances~~~~~~
function SetMessage(RawMessage: string): Boolean;
~~~~ more stuff ~~~~~~
我目前在单元的Interface部分声明了所有这些。我更喜欢只有主记录结构对使用该单元的任何东西都可见,并且目前所有子记录也是可见的。如果我将记录声明移动到Implementation部分,那么我会遇到编译器错误。我如何进行重组,以便在主记录之前声明子记录但子记录未发布?
答案 0 :(得分:6)
您可以执行以下操作之一:
1)在单独的“子单元”中声明“子记录”,因此只有在“使用”子句中声明“子单元”时,“子记录”类型才可用。这并不是你想要的,因为“子记录”可以对其他单位可见,但它提供了一定程度的隐藏,因为必须明确声明“子单位”以达到“子记录”定义。 / p>
2)将“子记录”声明为私有嵌套类型,如下所示:
type
TMainRec = record
private type
TSubRec = record
FSubField: Integer;
procedure SubMethod;
end;
private
FSubRec: TSubRec;
end;
implementation
{ TMainRec.TSubRec }
procedure TMainRec.TSubRec.SubMethod;
begin
...
end;
答案 1 :(得分:1)
你不能这样做,因为即使信息不需要直接用于设备外的其他代码,编译器仍然需要知道子记录类型,如果你打算使用主要记录。
您可以尝试的一件事是在另一个单元中声明其他类型,然后在其他地方不使用其他单元。但是,这并没有真正解决问题;它隐藏了一点。