Конференция "Компоненты" » Как компоненту узнать о завершении загрузки не используя Loaded? [D7]
 
  • MegaVolt_old (30.09.14 19:27) [0]
    Есть компонент (Telement = class TComponent) который является свойством TСollectionItem
    Для сохранение в DFM установлено SetSubComponent(True);

    Но есть проблема в виду того что TСollectionItem не является компонентом не происходит вызов Loaded по завершению загрузки из DFM.

    Собственно вопрос: Как внутри Telement узнать про то что загрузка завершена. Очень желательно обойтись только внутренними ресурсами. Имеется в виду что про окончание загрузки компонент должен знать сам. Вызов из Loaded формы не подходит.

    Может можно как то подписаться на вызов Loaded? В classes есть некий GlobalLoaded и BeginGlobalLoading но как их правильно использовать не очень понятно.

    Может кто что знает по этой теме?
  • DimaBr © (01.10.14 10:28) [1]
    Ещё раз по подробнее, а лучше с кодом.
    Компонент является свойством элемента коллекции ?
    Тогда вызовите самостоятельно Loaded для каждого элемента коллекции из Loaded основного компонента
  • MegaVolt_old (01.10.14 10:49) [2]
    >Компонент является свойством элемента коллекции ?

    Да.

    >Тогда вызовите самостоятельно Loaded для каждого элемента коллекции из Loaded основного компонента

    Хотялось бы чтобы была независимость написнного мной класса. Т.е. чтобы он работал без дописания дополнительного кода. А то как то криво смотриться рекомендации что для корректной работы моего класса нужно будет дёргать его метод из чего то внешнего просто ради того чтобы он работал а не потому что это нужно пользователю  :(

    >Ещё раз по подробнее, а лучше с кодом.

    Так не вопрос. Только вот код чего интересует? У меня же глюков нет. Всё работает штатно.
  • DimaBr © (01.10.14 11:27) [3]
    О том что вы где то в недрах одного компонента спрятали другой среда ничего не знает и естественно никакого Loaded не будет, если вы его не пошлёте самостоятельно. А рекомендации что нужно дёргать внутренний метод смотрятся вовсе не криво.
    Как вы считаете должна ПО ДРУГОМУ работать Loaded ?
  • MegaVolt_old (01.10.14 11:40) [4]
    >Как вы считаете должна ПО ДРУГОМУ работать Loaded ?

    Можно и на ты :)

    Я хочу работать с Loaded не по другому а так же как она и работает в дельфи.  Т.е. хотелось бы иметь возможность подписаться на получение Loaded. Причём этот функционал есть в TReader только вот он не доступен :(

    Есть GlobalLoaded и BeginGlobalLoading но я не очень знаю для чего они и можно ли их дёргать. И прописываться в них.
  • MegaVolt_old (01.10.14 11:53) [5]
    Или возможно есть другие пути узнать о завершении загрузки.
  • DimaBr © (01.10.14 14:36) [6]
    Других путей нет. Вы придумали эту архитектуру. Среда не может обходить все возможные TPersistent, TList, array, приват свойства, в поисках того, кому бы ещё послать Loaded, да это и не логично. Неужели трудно организовать цикл ?

    procedure TMyComp.Loaded;
    var i: integer;
    begin
     inherited Loaded;
     with MyCollection do
       for i := 0 to Items.Count -1 do
         if Assigned(Items[i].MyPropComponent) then Items[i].MyPropComponent.Loaded;
    end;

  • MegaVolt_old (01.10.14 14:40) [7]
    Само собой не трудно. Но я хотел сделать отдельный компонент который бы без проблем встраивался в другие. Без написания дополнительного кода. Так же как это происходит с обычными компонентами.

    Само собой среда не будет оповещать всех. Но ведь она могла бы оповещать тек кто попросит. Так же как это сделано с уведомлениями о удалении компонента например.

    И даже есть подходящий список GlobalLoaded только вот я не очень понимаю при каких условиях он будет загружен и какие есть ограничения на добавление в него своих компонентов.
  • DimaBr © (01.10.14 15:55) [8]
    Что значит "встраивался в другие" ? В какой другой (НЕ СВОЙ) компонент вы можете его встроить ?
  • MegaVolt_old (01.10.14 16:07) [9]
    Как в какой? Я могу взять  модуль и передать его соседу рядом. И очень хотелось бы чтобы он там работал вне зависимости от того прописал ли сосед волшебные строчки или забыл.
  • MegaVolt_old (01.10.14 17:28) [10]
    GlobalLoaded увы тоже не доступен. Ну или я не нашел как к нему достучаться :(
  • MegaVolt_old (01.10.14 18:41) [11]
    Короче сдался :(

    Создал в парном компонете список в котором можно регистрироваться и запряг его вызывать Loaded всех кто в нём зарегистировался.

    Парный компонент это комонент который точно будет в проекте использующем мой компонент.

    Извращение однако... Но работает :)
  • DimaBr © (02.10.14 09:16) [12]
    То есть вы считаете, что кто-то сможет прицепить ваш ВНУТРЕННИЙ компонент к своему ВНЕШНЕМУ ? Тогда что же мешает вызвать LOADED ? Не получается с LOADED, попробуйте изменить логику так, чтобы нужные вам действия происходили в другом месте.
    А вообще, разговор об абстракциях - сотрясение воздуха. Нет ни строчки кода, ни намёка, что вообще делает ваш компонент.
  • MegaVolt_old (02.10.14 10:46) [13]
    >То есть вы считаете, что кто-то сможет прицепить ваш ВНУТРЕННИЙ компонент к своему ВНЕШНЕМУ ?

    Где я такое написал?

    >Тогда что же мешает вызвать LOADED ?

    Никто так и сделал.

    >А вообще, разговор об абстракциях - сотрясение воздуха. Нет ни строчки кода, ни намёка, что вообще делает ваш компонент.

    Компонент хранит список ссылок на существующеие компоненты. С сохранением этого списка в dfm через DefineProprty. Чтобы при чтении из dfm корректно восстановить ссылки нужно сделать FixUp по завершению загрузки.

    Ещё раз спрашиваю код чего именно вас интересует??
  • DimaBr © (02.10.14 12:28) [14]
    >Компонент хранит список ссылок на существующие компоненты.
    1. Зачем хранить список ссылок, если они и так есть в списке Формы ?
    2. Что будут делать 10 компонентов в 10-ти элементах коллекции ?  Десять раз Фиксить ?
    3. Пытаюсь понять для чего это вообще нужно - ума не приложу. А раз непонятна цель, то и выбор средств тоже неясен. Может вообще не в LOADED дело ?
  • MegaVolt_old (02.10.14 13:35) [15]
    >1. Зачем хранить список ссылок, если они и так есть в списке Формы ?

    Для использования в личных целях компонента. Т.е. ему не нужны все. Ему нужны некоторы например первый, пятый и десятый.

    >2. Что будут делать 10 компонентов в 10-ти элементах коллекции ?  Десять раз Фиксить ?

    Не очень понял про какие 10 компонентов идёт речь?  Какдлый список нужно фиксить отдельно. Если списков будет десять то само собой фикс для каждого.

    >3. Пытаюсь понять для чего это вообще нужно - ума не приложу.

    Компоненты отвечают за отрисовку данных для пользователя. Т.е. в дизайн тайме можно набрать список комопонентов которые будут отображать некие данные. Компоненты не визуальные типа Taction.
  • Юрий Зотов © (05.10.14 13:02) [16]
    > в дизайн тайме можно набрать список компонентов

    То есть, компоненты из списка принадлежат форме и сохраняются в DFM. Это значит, что Loaded каждого из них будет вызван дважды: один раз - автоматически, второй - Вашим кодом. Получается, что Вам делать ничего не нужно, все сработает само.

    Или я чего-то не понял?
  • MegaVolt_old (06.10.14 11:16) [17]
    Не совсем.
    Реализовывалась связь многие ко многим.
    Соответственно:

    Есть TElement
    Есть TElementList

    Они само собой принадлежат форме и сохраняются в DFM. При чтении само собой получают Loaded.

    Но есть ещё много TElementCollection которые хранят только списки ссылок на те элементы которые есть в TElementList. И тоже сохраняет их в DFM но уже как имя компонентов. Так как TElementCollection является полем TCollectionItem то никакого Loaded ему не приходит и соответственно ссылки нельзя корректно востановить.

    Пока сделал глобальный список в котором TElementList регистрирует себя как желающий получить Loaded. А TElementList в своём Loaded обходит этот список и вызывает Loaded всем загрузившимся.

    По хорошему хотелось бы регистрироваться в списках TReader но не вышло :(
  • Юрий Зотов © (06.10.14 12:04) [18]
    Чего-то я не понимаю, видимо.

    > Есть TElement
    > Есть TElementList
    >
    > Они само собой принадлежат форме и сохраняются в DFM. При
    > чтении само собой получают Loaded.


    Пока все нормально. Но тут же Вы пишете:

    > сделал глобальный список в котором TElementList регистрирует
    > себя как желающий получить Loaded.


    Зачем нужна эта регистрация, если TElementList  и без нее получает свой Loaded?

    А в нем TElementList проходит по элементам коллекции и восстанавливает ссылки. Без всяких дополнительных списков.
  • MegaVolt_old (06.10.14 12:15) [19]
    Упс... Следует читать: Пока сделал глобальный список в котором TElementCollection регистрирует... далее по тексту.
 
Конференция "Компоненты" » Как компоненту узнать о завершении загрузки не используя Loaded? [D7]
Есть новые Нет новых   [118667   +39][b:0][p:0.001]