Вложенная запись информации скрывается в Delphi - PullRequest
1 голос
/ 20 февраля 2010

У меня относительно сложная структура данных для моделирования. Я хотел бы сделать это со структурой записей в 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 ~~~~~~

В настоящее время все это объявлено в разделе «Интерфейс» устройства. Я бы предпочел, чтобы только основная структура записи была видна кому-либо, использующему устройство, и на данный момент все вспомогательные записи также видны. Если я перемещаю объявления записей в раздел Реализация, то я получаю ошибки компилятора. Как мне реструктурировать так, чтобы я объявлял вложенные записи до основной записи, но вложенные записи не были опубликованы?

Ответы [ 2 ]

6 голосов
/ 21 февраля 2010

Вы можете сделать одно из следующих действий:

1) Объявите «вспомогательные записи» в отдельной «вспомогательной единице», поэтому типы «вспомогательной записи» доступны только в том случае, если «вспомогательная единица» объявлена ​​в предложении «использует». Это не совсем то, что вы ищете, поскольку «вспомогательные записи» можно сделать видимыми для других единиц, но это обеспечивает некоторую степень сокрытия, поскольку «вспомогательная единица» должна быть явно объявлена ​​для достижения определений «вспомогательной записи». 1003 *

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 голос
/ 20 февраля 2010

Вы не можете сделать это, потому что даже если информация не должна быть напрямую доступна для другого кода вне модуля, компилятору все равно нужно знать о типах вложенных записей, если вы собираетесь использовать где-то основная запись.

Одна вещь, которую вы можете попробовать, это объявить другие типы в другом устройстве, а затем не использовать это другое устройство в другом месте. Это на самом деле не решает проблему; это просто немного скрывает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...