Страница 1 из 1
Как обратиться к свойствам владельца?
Добавлено: 25.06.2019 15:55:32
DropSoft
Код: Выделить всё
// Модуль 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?
Re: Как обратиться к свойствам владельца?
Добавлено: 25.06.2019 17:23:59
serbod
Почему бы не объявить TMyUart как наследника TMyDevice? Тогда он будет иметь доступ к Reg без всяких заморочек.
Re: Как обратиться к свойствам владельца?
Добавлено: 25.06.2019 21:17:47
DedFrend
В принципе можно вот так:
Код: Выделить всё
// Модуль 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;
Re: Как обратиться к свойствам владельца?
Добавлено: 26.06.2019 13:11:26
DropSoft
serbod Это не совсем то, что надо. У меня MyDevice содержит описание программной модели ресурсов железячных приборов. MyUart - реализация протокола обмена с прибором (порой стандартного, чаще нет), с учетом ограничения ресурсов прибора. То есть MyUart должен быть по сути одним из группы свойств для MyDevice. И MyDevice может поддерживать несколько разных протоколов MyUart.
DedFrend Да, спасибо. Это работает. Но как-то это.. некрасиво.
В общем, пока я так решил проблему: выделил свойство Reg в отдельный класс (и отдельный модуль), подключаемый в секции interface и к MyDevice, и к MyUart. MyDevice создает экземпляр Reg и создает MyUart со ссылкой на Reg.
Но хотелось бы понять, как же надо делать правильно.
Re: Как обратиться к свойствам владельца?
Добавлено: 27.06.2019 02:08:46
serbod
DropSoft TMyUart может работать отдельно от TMyDevice? Если нет, то не вижу смысла делать его отдельным классом.
У меня есть набор компонентов DataPort, там все компоненты имеют одинаковый базовый класс, умеющий подключаться, передавать и принимать данные. И на его основе сделаны разные порты данных - UART, TCP, UDP, Pipe, Handle.. Их можно "подключать" как свойство объекта, и работать одинаково с любым портом. Но если используются какие-то особенности порта кроме передачи данных - например, сигнальные линии модема, то лучше сразу встраивать это в класс устройства, поскольку в других портах таких особенностей нет и вряд ли эти другие порты будут использоваться.