質問
私がモデルに比較的複雑なデータ構造を有しています。私は、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 ~~~~~~
私は現在、このすべては、ユニットのインターフェースセクションで宣言されています。本体のみレコード構造は、ユニットを使用したものに見えていた場合、私は好むだろう、と現時点ではすべてのサブレコードも表示されます。私は実装セクションにレコード宣言を移動した場合、私は、コンパイラエラーが発生します。私は前にメインのレコードにサブレコードを宣言したが、サブレコードは公表されないように、私の再構築をどのように行いますか?
解決
あなたは、次のいずれかを行うことができます
1)別個の「サブユニット」の宣言「サブレコード」、「サブレコード」型は「サブユニット」が「使用」節内で宣言されている場合にのみ利用可能であるように。 「サブレコードは、」他のユニットのために見えるようにすることができますので、それは、あなたが探しているまさにではなく、「サブユニット」は、明示的に「サブレコード」の定義に到達するために宣言されなければならないので、それは隠しある程度を提供します。
プライベートネストされたタイプとして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;
他のヒント
情報がユニット外の他のコードに直接利用できるようにする必要がない場合であっても使用するつもりなら、コンパイラはまだサブレコードの種類について知る必要があるため、
あなたは、それを行うことはできませんメインレコードのどこかでます。
あなたは別のユニットで、他のタイプを宣言して、他のどこにも、他のユニットを使用していない試みることができる一つのこと。それは本当にかかわらず、問題を解決していません。それはちょうどそれを少し隠します。
所属していません StackOverflow