Очередь/порядок создания компонентов формы

Вопросы программирования и использования среды Lazarus.

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

Ответить
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Очередь/порядок создания компонентов формы

Сообщение VirtUX »

Как узнать в каком порядке будут созданы компоненты некоторой формы? Или как указать очередность их создания?

У меня есть невизуальный компонент, и несколько визуальных компонентов. Все принадлежат одной форме. Все компоненты самописные. Невизуальный наследуется от TComponent, а визуальные от TGraphicControl.
Мне нужно, чтобы невизуальный был создан первым. Так как все визуальные в своём конструкторе должны использовать свойства этого невизуального.
Последний раз редактировалось VirtUX 30.11.2018 19:04:00, всего редактировалось 1 раз.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

А есть ли вообще смысл заморачиваться? Возможно, что и без этого будет нормально работать. Компилятор может и учесть дерево наследования.

Можно попытаться создавать визуальные компоненты вручную, когда невизуальный будет уже создан.
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Лекс Айрин писал(а):Можно попытаться создавать визуальные компоненты вручную, когда невизуальный будет уже создан.

Дело в том, что визуальные и невизуальный компоненты распологает по форме разработчик во время верстки интерфейса (в дизайн редакторе Lazarus). Мне же нужно сделать так, что если разработчик добавил невизуальный, то он должен быть создан во время выполнения первым. Если разработчик отказался от его использования, то визуальные берут свойства из собственных настроек.
mig-31
постоялец
Сообщения: 224
Зарегистрирован: 14.07.2011 13:46:48

Сообщение mig-31 »

А что тут сложного.
Никакого порядка и не надо. У вас же зависимость одного компонента на другом. Решается через property.

Выкиньте код из конструктора. В визуальном сделайте property на невизуальный компонент. В Set функции добавите код из конструктора. В дизайнере в Object Inspector появиться новое свойство. Кините на форму невизуальный компонент на форму и выберете его в Object Inspector визуального. Может понадобится еще сделать Property Editor для property невизуального компонента.
Тут почитайте
http://wiki.freepascal.org/How_To_Write_Lazarus_Component
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

VirtUX, ну воткни его запуск в раздел инициации модуля, в котором он определен, а в визуальных компонентах проверяй его наличие... конечно, тут еще может играть порядок модулей в uses.

А может проще наоборот? Невизуальный, при запуске, меняет настройки визуальных?

Да и вообще,имхо, лучше просто связать невизуальный с визуальными прямо в конструкторе. Так как поиск, что одних, что других может быть затруднителен. Я имею ввиду то, как это сделано для подручных (popup) меню.
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

2 mig-31 То есть, разработчику нужно в каждом визуальном компоненте будет указывать на невизуальный. В принципе, в этом есть даже некоторый плюс. Но хотелось бы обойтись без этого. Задача стоит сделать так: если есть невизуальный на форме, то используем его свойства, иначе собственные.
Спасибо за вариант!
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

VirtUX, компилятор довольно тупая программа... как ты собираешься ей объяснять, какой из компонентов ей нужен? Ей имя подавай или ссылку (что почти одно и тоже)?

Тебе придется создавать переменную для хранения имени компонента... но ведь ты ее создаешь и в предложенном тебе варианте, только в самих компонентах, с уменьшением кода, который надо написать.
mig-31
постоялец
Сообщения: 224
Зарегистрирован: 14.07.2011 13:46:48

Сообщение mig-31 »

VirtUX писал(а):Дело в том, что визуальные и невизуальный компоненты распологает по форме разработчик во время верстки интерфейса (в дизайн редакторе Lazarus). Мне же нужно сделать так, что если разработчик добавил невизуальный, то он должен быть создан во время выполнения первым. Если разработчик отказался от его использования, то визуальные берут свойства из собственных настроек.


Мне трудно представить для чего это нужно. Обычно, например в случае библиотеки LNet, "визуальный" наследован от TComponent (отображается только на вкладке компонентов) и он не отображется на форме после компиляции проекта, а не визуалньный от TObject. Визуальный нужен только для того, чтобы его кинуть на формочку и настроить в ObjectInspector, a не визуальный создать с помощью кода.
Я так понимаю, что верстает только GUI, так ему ТComponent не нужен. В коде пакета просто не указывайте вкладку отображения.

1. Если у вас оба компонента дублируют друг друга, так можете разработчику на вкладке компонетов показывать только визуальные.
2. Если так не подходит ограничить его только использованием одного типа. В конструкторе проверить на наличие, показать сообщение и удалить.
3. В конструкторе проверять наличие компонента с идентичными свойствами и предложить удаление.
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

VirtUX писал(а):То есть, разработчику нужно в каждом визуальном компоненте будет указывать на невизуальный.

Оставил так. В принципе - годится!
Аватара пользователя
Vapaamies
постоялец
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vapaamies »

В VCL для правильной работы равноправных ссылок между компонентами надо было перекрывать метод Notification. В LCL такого нет? Самое логичное место для выбора между разделяемыми настройками и собственными, ИМХО.
Ответить