Конференция "Компоненты" » Как компоненту узнать о завершении загрузки не используя Loaded? [D7]
 
  • DimaBr © (06.10.14 14:33) [20]
    >Юрий Зотов
    У него в элементах коллекции хранятся компоненты, которые "должны" получать LOADED. Среда о них естественно не знает и LOADED для них не вызывает. А написать свой LOADED, как я предлагал в [6], он не хочет.
  • MegaVolt_old (06.10.14 15:11) [21]
    Почему не хочу? Я так и сделал.
  • Юрий Зотов © (07.10.14 09:51) [22]
    > DimaBr ©   (06.10.14 14:33) [20]

    А почему среда о них не знает? Если я правильно понял, то включение в элементы коллекции ссылок на эти компоненты (или их имен, неважно) делается в design-time. Значит, эти компоненты УЖЕ лежат на форме и, следовательно,  каждый из них получит свой Loaded обычным путем.
  • Юрий Зотов © (07.10.14 10:09) [23]
    Тут, по-моему, проблема другая. Вот положил я на форму компонент, создал элемент коллекции и включил в него имя этого компонента. А потом взял, да и переименовал этот компонент - а в элементе коллекции имя осталось старым. Или удалил этот компонент - а в элементе коллекции его имя осталось. В обоих случаях получим битую ссылку.

    Чтобы такого безобразия не было, компонент должен знать все элементы коллекции, в которые он включен, а еще в компоненте надо перекрывать SetName, Notification и еще какой-то метод (не помню его названия, ну да не в этом суть). Значит, этот компонент уже не может быть любым, а может быть только специальным.
  • MegaVolt_old (07.10.14 12:00) [24]
    >Значит, этот компонент уже не может быть любым, а может быть только специальным.

    Увы это так. С любым не вышло.

    >Если я правильно понял, то включение в элементы коллекции ссылок на эти компоненты (или их имен, неважно) делается в design-time. Значит, эти компоненты УЖЕ лежат на форме и, следовательно,  каждый из них получит свой Loaded обычным путем.

    Так проблема не с самими компонентами а со списком который хранит на них ссылки. Так как список невизуальный ему ничего не приходит. А в дизайн тайме у него просто написан редактор.
  • Юрий Зотов © (07.10.14 13:28) [25]
    > MegaVolt_old   (07.10.14 12:00) [24]

    > Так проблема не с самими компонентами а со списком который хранит на них
    > ссылки. Так как список невизуальный ему ничего не приходит.

    А ему и ничего и не надо. Этот список надо включить в компонент-менеджер, который получит свой законный Loaded, в нем пройдет по списку и разрешит все ссылки на рабочие компоненты. А заодно и пропишет себя в каждый рабочий компонент, чтобы те знали, кого уведомлять о своем переименовании/удалении (чтобы в итоге обновить список).
  • MegaVolt_old (07.10.14 13:50) [26]
    >Этот список надо включить в компонент-менеджер, который получит свой законный Loaded

    Так и сделал :)
  • DimaBr © (08.10.14 02:08) [27]
    На сколько я понял, компоненты лежат не на форме а внутри коллекции хозяина.
  • MegaVolt_old (08.10.14 11:02) [28]
    Неа. [17] прочитай ещё раз.
  • MegaVolt_old (08.10.14 20:42) [29]
    Проблема не решена.

    Form1.Loaded приходит раньше чем загружен весь проект. Т.е. например DataModul может быть не загружен вообще :(
  • DimaBr © (10.10.14 15:37) [30]
    Здрасте, приехали !!!
    При чём здесь Form1.Loaded и DataModule ????
    Datamodule может вообще никогда не загрузиться, если его создавать динамически.
    На лицо пункт 3 из поста [14]
    3. Пытаюсь понять для чего это вообще нужно - ума не приложу. А раз непонятна цель, то и выбор средств тоже неясен. Может вообще не в LOADED дело ?

  • MegaVolt_old (10.10.14 16:46) [31]
    Да чёрт с ним с динамическим созданием.

    В DataModul лежит Контейнер с компонентами.

    Форма должна восстановить ссылки на них. А DataModul ущё не создан.

    Чтобы было понятнее привожу на примере Action:

    Имеем:
    _____________________
    Unit1;
    Uses Unit2;
    ...
    Form1.Action:=DataModule3.FontEdit1; (само собой это настроено в дизайнере а не ручками прописано)

    _____________________
    Unit2:

    ActionList1 который содержит FontEdit1;
    _____________________

    FixUp для Form1.Action дельфи делает сама. Причём в не зависимости от того что физически создаётся первее или форма или модуль.

    В моём случае я его делаю сам.
    Где правильно вызывать мой FixUp?

    Пока сделал так:

    1. Если первой создалась форма то FixUp вызывается в ActionList1.Loaded;

    2. Если же первой создан модуль то никакой FixUp не нужен все компоненты уже созданы и связывание идёт во время чтения свойст из DFM.

    Кривовато. Но работает.

    Если иметь одно место из которого вызывался бы FuxUp по окончанию создания всех форм и модулей то можно было бы упростить и отказаться от 2.
  • Cobalt © (12.10.14 22:37) [32]
    Вы хотите, чтобы можно было зависимые друг от друга модули создавать в разном порядке и при этом ссылки на компоненты восстанавливались при загрузке модуля, от которого есть ссылки?

    Скажите, чем вызвано подобное требование?
    Не проще ли создавать требуемый модуль в нужном порядке?
  • MegaVolt_old (13.10.14 02:30) [33]
    >Вы хотите..........

    Ага. Более того я это сделал как описано в [31]. Причём это же далает дельфи без малейших проблем. Чтобы убедиться создайте две зависимые формы и в dpr поменяйте местами Application.CreateForm....

    >Скажите, чем вызвано подобное требование?

    Тем что подобную перестановку допускает дельфи. И как следствие мой компонент должен точно так же это переносить.

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

    У того кто пишет компоненту нету никакой возможности влиять на порядок создания форм и модулей. Повторюсь: Дельфи допускает создание проекта в любом порядке вне зависимости от того какие зависимости есть. Я скажу даже больше зависимости служат скорее для корректности написания программы а при создании формы уже не важно кто от кого зависит.
  • Юрий Зотов © (14.10.14 11:29) [34]
    Что-то тут не так. Миллион раз писаны программы, в которых есть DataModule с DataSet'ами, и на эти DataSet'ы ссылается главная форма. И все прекрасно загружается без всяких дополнительных усилий.
  • MegaVolt_old (14.10.14 14:14) [35]
    >И все прекрасно загружается без всяких дополнительных усилий.

    Ссылка на датасет у формы это поле? Типа TDataSet?

    А у меня сассив таких полей. Дельфи не хочет массив автоматом фиксить.
  • icWasya © (14.10.14 17:19) [36]
    С подобной проблемой сталкиваются наследники TDataSet при установке свойства Active. То есть в дизайнере установлено TSQL1.Active:=True;
    А TSession находится в DataModule, который ещё не загрузился. Или, что ещё чаще, на той же форме, но ниже по тексту. Посмотрите, как устроен SetActive у TDataSet.
  • MegaVolt_old (15.10.14 00:23) [37]
    icWasya проблемы с одним полем нету. Есть проблема с массивом компонентов как поле.
  • dimabr © (16.10.14 17:24) [38]
    Вы ошибаетесь, если думаете что без разницы в какой последовательности создавать формы и датамодули. Если это работает в дизайнере с датасетами (в последних версиях delphi), то это вовсе не значит что всё происходит так как вы видите на экране. В ранних версиях среды, открытие формы, без предварительного открытия датамодуля, приводило к тому, что ссылки на датасеты и прочие компоненты на датамодуле терялись. Поэтому я лично себя приучил открывать проекты строго в определённой последовательности, сначала датамодули, а затем формы. В нынешней среде (по крайней мере у меня хе2) при открытии формы, которая ссылается на датамодуль, последний создаётся автоматически, просто вы его не видите.

    Итого.
    Фиксить вручную ссылочные компонеты не нужно. Нужно менять идеологию вашего компонента, возможно вешать хак на нотификацию и фиксить не на LOADED, а INSERT формы.
  • MegaVolt_old (17.10.14 01:17) [39]
    >Вы ошибаетесь, если думаете что без разницы в какой последовательности создавать формы и датамодули.

    Я не ошибаюсь а говорю про результаты изучения работы исходников D7 в них восстановление ссылок корректно работает при любом порядке создания форм и модулей.
 
Конференция "Компоненты" » Как компоненту узнать о завершении загрузки не используя Loaded? [D7]
Есть новые Нет новых   [134427   +35][b:0][p:0.001]