Circular unit reference - как обойти?
(креатит при создании)
FormMotorState: TFmMotorState;
форма описана в другом модуле. Нужно по нажатию кнопы на форме
вызывать метод хозяина-мотора
но объявить у формы что-нибудь типа
HostMotor : Tmotor я не могу!
потому как для этого в uses необходимо прописать uMotors, а в модуле
uMotors, само собой разумеется, УЖЕ объявлена uFmMotorState!
Circular unit reference, однако!
как выйти из положения?
ps пока писал, пришло в голову, что можно тупо весь модуль uMotors
засунуть в uFmMotorState. Выход из ситуации, однако как-то это некрасиво..
может, кто знает способ получше?
2. Пропиши нужное в implementation.
Цитата: mfender
1. Делаешь модуль - постарайся сделать его действительно отдельным, чтобы в него только передавались переменные, константы и ссылки.
так я так и делаю! поэтому в кучу мешать модули не хочу
Цитата: mfender
2. Пропиши нужное в implementation.
Каким образом это сделать? Поле типа uFmMotorState декларируется в объявлении класса, т.е. в interface, соответственно, если объявлять HostMotor типа Tmotor - он тоже объявляется в интерфейсной части модуля с формой. В реализацию вынести невозможно :(
что-то до меня не совсем дошло:). может попробовать тогда запись вида имя_модуля.класс?
Цитата: kosfiz
что-то до меня не совсем дошло:). может попробовать тогда запись вида имя_модуля.класс?
Unit unit1;
type
TUnit1_ClassOne
variable: TUnit2_ClassTwo
end;
Unit unit2
type
TUnit2_ClassTwo
variable: TUnit1_ClassOne
end;
давайте попробуем это скомпилировать? ;)
теперь мне понятно какая у тебя проблема. я тебе кстати немного другое предложил нежели ты написал, но здесь оно ни к чему.
Почита про интерфейсы, с помощью них можно творить такие вещи.
1. В блоке объявлений (это там где классы описываются)
2. В блоке реализации (это там где код методов и функций пишется)
Соответственно, нужно требуемый модуль нужно объявить во втором блоке
Ближайшая аналогия (для С++) - это когда 2 c++ файла содержат include h-файлов друг друга :)
P.S.
Если я что-то не так понял
Можно в одном файле просто сделать "предварительное объявление" класса. Тогда ссылку на объект можно спокойно использовать в объявлении другого класса.
P.S.S.
Цитата:
форма описана в другом модуле. Нужно по нажатию кнопы на форме вызывать метод хозяина-мотора
Самое простое решение - у формы сделать СОБЫТИЕ. Тип стандартный - TNotifyEvent. А значению поля в конструктроре TMotor присвоить имя вызываемой функции - надо только функцию написать с параметрами соответствующими типу события