質問

私がモデルに比較的複雑なデータ構造を有しています。私は、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;

他のヒント

情報がユニット外の他のコードに直接利用できるようにする必要がない場合であっても使用するつもりなら、コンパイラはまだサブレコードの種類について知る必要があるため、

あなたは、それを行うことはできませんメインレコードのどこかでます。

あなたは別のユニットで、他のタイプを宣言して、他のどこにも、他のユニットを使用していない試みることができる一つのこと。それは本当にかかわらず、問題を解決していません。それはちょうどそれを少し隠します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top