Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Circular unit reference - как обойти?

32K
25 ноября 2007 года
AnTeml
3 / / 08.11.2007
Имеется модуль, в нём класс Tmotor, который содержит в себе форму
(креатит при создании)
FormMotorState: TFmMotorState;

форма описана в другом модуле. Нужно по нажатию кнопы на форме
вызывать метод хозяина-мотора

но объявить у формы что-нибудь типа
HostMotor : Tmotor я не могу!
потому как для этого в uses необходимо прописать uMotors, а в модуле
uMotors, само собой разумеется, УЖЕ объявлена uFmMotorState!
Circular unit reference, однако!

как выйти из положения?

ps пока писал, пришло в голову, что можно тупо весь модуль uMotors
засунуть в uFmMotorState. Выход из ситуации, однако как-то это некрасиво..
может, кто знает способ получше?
8
25 ноября 2007 года
mfender
3.5K / / 15.06.2005
1. Делаешь модуль - постарайся сделать его действительно отдельным, чтобы в него только передавались переменные, константы и ссылки.
2. Пропиши нужное в implementation.
32K
25 ноября 2007 года
AnTeml
3 / / 08.11.2007
Цитата: mfender
1. Делаешь модуль - постарайся сделать его действительно отдельным, чтобы в него только передавались переменные, константы и ссылки.

так я так и делаю! поэтому в кучу мешать модули не хочу

Цитата: mfender
2. Пропиши нужное в implementation.

Каким образом это сделать? Поле типа uFmMotorState декларируется в объявлении класса, т.е. в interface, соответственно, если объявлять HostMotor типа Tmotor - он тоже объявляется в интерфейсной части модуля с формой. В реализацию вынести невозможно :(

257
26 ноября 2007 года
kosfiz
1.6K / / 18.09.2005
что-то до меня не совсем дошло:). может попробовать тогда запись вида имя_модуля.класс?
32K
26 ноября 2007 года
AnTeml
3 / / 08.11.2007
Цитата: kosfiz
что-то до меня не совсем дошло:). может попробовать тогда запись вида имя_модуля.класс?



Unit unit1;
type
TUnit1_ClassOne
variable: TUnit2_ClassTwo
end;

Unit unit2

type
TUnit2_ClassTwo
variable: TUnit1_ClassOne
end;


давайте попробуем это скомпилировать? ;)

257
26 ноября 2007 года
kosfiz
1.6K / / 18.09.2005
теперь мне понятно какая у тебя проблема. я тебе кстати немного другое предложил нежели ты написал, но здесь оно ни к чему.
17K
18 декабря 2007 года
jack marked
20 / / 12.11.2006
Почита про интерфейсы, с помощью них можно творить такие вещи.
309
19 декабря 2007 года
el scorpio
1.1K / / 19.09.2006
Обратите внимание, что раздел uses в pas файле может встречаться дважды
1. В блоке объявлений (это там где классы описываются)
2. В блоке реализации (это там где код методов и функций пишется)

Соответственно, нужно требуемый модуль нужно объявить во втором блоке

Ближайшая аналогия (для С++) - это когда 2 c++ файла содержат include h-файлов друг друга :)


P.S.
Если я что-то не так понял
Можно в одном файле просто сделать "предварительное объявление" класса. Тогда ссылку на объект можно спокойно использовать в объявлении другого класса.

P.S.S.
Цитата:
форма описана в другом модуле. Нужно по нажатию кнопы на форме вызывать метод хозяина-мотора


Самое простое решение - у формы сделать СОБЫТИЕ. Тип стандартный - TNotifyEvent. А значению поля в конструктроре TMotor присвоить имя вызываемой функции - надо только функцию написать с параметрами соответствующими типу события

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог