Как обратиться к свойствам владельца?

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Как обратиться к свойствам владельца?

Сообщение DropSoft » 25.06.2019 16:55:32

Код: Выделить всё
 
// Модуль MyDevice
uses MyUart;

type
  TMyDevice = class
  private
    Freg : array[0..1023] of word;
    procedure SetReg(Index: integer; Value:word);
    function  GetReg(Index: integer) :word;
  public
    UART: TMyUart;
    property Reg[i:integer]:word read GetReg write SetReg;
    constructor Create;
  end;

implementation

  constructor MyDevice.Create;
  begin
    UART := TMyUart.Create; // здесь надо как-то сделать, чтобы экземпляр UART мог читать и писать Reg
  end;

  ...

(***************************************)
// Модуль MyUart
type
  TMyUart = class
  public
    procedure SendReg(adr,len: word);
    procedure ReceiveReg(adr,len: word);
  end;

implementation

    procedure TMyUart.ReceiveReg(adr,len: word);
    begin
      // Здесь мне надо писать и читать Reg из TMyDevice
    end;


В главном модуле создаю MyDevice := TMyDevice.Create; который создает экземпляр UART класса TMyUart.
UART должен писать и читать регистры MyDevice.Reg Как это сделать? В модуле TMyUart не дает сделать uses TMyDevice (циклическая ссылка)
Если в SendReg можно явно передавать ссылку на Reg, поскольку вызов идет MyDevice.Uart.SengReg(...), то ReceiveReg вызывается в критической секции из другого потока, и ничего не знает про MyDevice.
Собственно вопрос, как сделать, чтобы при создании TMyUart.Create(...) он далее мог работать с public свойствами TMyDevice?
DropSoft
новенький
 
Сообщения: 31
Зарегистрирован: 31.03.2013 13:47:40

Re: Как обратиться к свойствам владельца?

Сообщение serbod » 25.06.2019 18:23:59

Почему бы не объявить TMyUart как наследника TMyDevice? Тогда он будет иметь доступ к Reg без всяких заморочек.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Как обратиться к свойствам владельца?

Сообщение DedFrend » 25.06.2019 22:17:47

В принципе можно вот так:

Код: Выделить всё
     
    // Модуль MyDevice
    uses MyUart;

    type
      TMyDevice = class
      private
        Freg : array[0..1023] of word;
        procedure SetReg(Index: integer; Value:word);
        function  GetReg(Index: integer) :word;
      public
        UART: TMyUart;
        property Reg[i:integer]:word read GetReg write SetReg;
        constructor Create;
      end;

    implementation

      constructor MyDevice.Create;
      begin
        UART := TMyUart.Create(self); // здесь надо как-то сделать, чтобы экземпляр UART мог читать и писать Reg
      end;

      ...

    (***************************************)
    // Модуль MyUart
    type
      TMyUart = class
          fMydevice: TObject;
      public
        procedure SendReg(adr,len: word);
        procedure ReceiveReg(adr,len: word);
        constructor Create(AOwner: TObject);
      end;

    implementation
    uses  MyDevice;

     constructor TMyUart.Create( AOwner: TObject);
     begin
        fMyDevice := AOwner;
     end;

        procedure TMyUart.ReceiveReg(adr,len: word);
        begin
           (fMyDevice as TMyDevice).SendReg(...
          // Здесь мне надо писать и читать Reg из TMyDevice
        end;
DedFrend
постоялец
 
Сообщения: 156
Зарегистрирован: 25.11.2018 12:21:50

Re: Как обратиться к свойствам владельца?

Сообщение DropSoft » 26.06.2019 14:11:26

serbod Это не совсем то, что надо. У меня MyDevice содержит описание программной модели ресурсов железячных приборов. MyUart - реализация протокола обмена с прибором (порой стандартного, чаще нет), с учетом ограничения ресурсов прибора. То есть MyUart должен быть по сути одним из группы свойств для MyDevice. И MyDevice может поддерживать несколько разных протоколов MyUart.
DedFrend Да, спасибо. Это работает. Но как-то это.. некрасиво.
В общем, пока я так решил проблему: выделил свойство Reg в отдельный класс (и отдельный модуль), подключаемый в секции interface и к MyDevice, и к MyUart. MyDevice создает экземпляр Reg и создает MyUart со ссылкой на Reg.
Но хотелось бы понять, как же надо делать правильно.
DropSoft
новенький
 
Сообщения: 31
Зарегистрирован: 31.03.2013 13:47:40

Re: Как обратиться к свойствам владельца?

Сообщение serbod » 27.06.2019 03:08:46

DropSoft TMyUart может работать отдельно от TMyDevice? Если нет, то не вижу смысла делать его отдельным классом.

У меня есть набор компонентов DataPort, там все компоненты имеют одинаковый базовый класс, умеющий подключаться, передавать и принимать данные. И на его основе сделаны разные порты данных - UART, TCP, UDP, Pipe, Handle.. Их можно "подключать" как свойство объекта, и работать одинаково с любым портом. Но если используются какие-то особенности порта кроме передачи данных - например, сигнальные линии модема, то лучше сразу встраивать это в класс устройства, поскольку в других портах таких особенностей нет и вряд ли эти другие порты будут использоваться.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16

Рейтинг@Mail.ru