-
Есть компонент (Telement = class TComponent) который является свойством TСollectionItem
Для сохранение в DFM установлено SetSubComponent(True);
Но есть проблема в виду того что TСollectionItem не является компонентом не происходит вызов Loaded по завершению загрузки из DFM.
Собственно вопрос: Как внутри Telement узнать про то что загрузка завершена. Очень желательно обойтись только внутренними ресурсами. Имеется в виду что про окончание загрузки компонент должен знать сам. Вызов из Loaded формы не подходит.
Может можно как то подписаться на вызов Loaded? В classes есть некий GlobalLoaded и BeginGlobalLoading но как их правильно использовать не очень понятно.
Может кто что знает по этой теме?
-
Ещё раз по подробнее, а лучше с кодом.
Компонент является свойством элемента коллекции ?
Тогда вызовите самостоятельно Loaded для каждого элемента коллекции из Loaded основного компонента
-
>Компонент является свойством элемента коллекции ?
Да.
>Тогда вызовите самостоятельно Loaded для каждого элемента коллекции из Loaded основного компонента
Хотялось бы чтобы была независимость написнного мной класса. Т.е. чтобы он работал без дописания дополнительного кода. А то как то криво смотриться рекомендации что для корректной работы моего класса нужно будет дёргать его метод из чего то внешнего просто ради того чтобы он работал а не потому что это нужно пользователю :(
>Ещё раз по подробнее, а лучше с кодом.
Так не вопрос. Только вот код чего интересует? У меня же глюков нет. Всё работает штатно.
-
О том что вы где то в недрах одного компонента спрятали другой среда ничего не знает и естественно никакого Loaded не будет, если вы его не пошлёте самостоятельно. А рекомендации что нужно дёргать внутренний метод смотрятся вовсе не криво.
Как вы считаете должна ПО ДРУГОМУ работать Loaded ?
-
>Как вы считаете должна ПО ДРУГОМУ работать Loaded ?
Можно и на ты :)
Я хочу работать с Loaded не по другому а так же как она и работает в дельфи. Т.е. хотелось бы иметь возможность подписаться на получение Loaded. Причём этот функционал есть в TReader только вот он не доступен :(
Есть GlobalLoaded и BeginGlobalLoading но я не очень знаю для чего они и можно ли их дёргать. И прописываться в них.
-
Или возможно есть другие пути узнать о завершении загрузки.
-
Других путей нет. Вы придумали эту архитектуру. Среда не может обходить все возможные 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;
-
Само собой не трудно. Но я хотел сделать отдельный компонент который бы без проблем встраивался в другие. Без написания дополнительного кода. Так же как это происходит с обычными компонентами.
Само собой среда не будет оповещать всех. Но ведь она могла бы оповещать тек кто попросит. Так же как это сделано с уведомлениями о удалении компонента например.
И даже есть подходящий список GlobalLoaded только вот я не очень понимаю при каких условиях он будет загружен и какие есть ограничения на добавление в него своих компонентов.
-
Что значит "встраивался в другие" ? В какой другой (НЕ СВОЙ) компонент вы можете его встроить ?
-
Как в какой? Я могу взять модуль и передать его соседу рядом. И очень хотелось бы чтобы он там работал вне зависимости от того прописал ли сосед волшебные строчки или забыл.
-
GlobalLoaded увы тоже не доступен. Ну или я не нашел как к нему достучаться :(
-
Короче сдался :(
Создал в парном компонете список в котором можно регистрироваться и запряг его вызывать Loaded всех кто в нём зарегистировался.
Парный компонент это комонент который точно будет в проекте использующем мой компонент.
Извращение однако... Но работает :)
-
То есть вы считаете, что кто-то сможет прицепить ваш ВНУТРЕННИЙ компонент к своему ВНЕШНЕМУ ? Тогда что же мешает вызвать LOADED ? Не получается с LOADED, попробуйте изменить логику так, чтобы нужные вам действия происходили в другом месте.
А вообще, разговор об абстракциях - сотрясение воздуха. Нет ни строчки кода, ни намёка, что вообще делает ваш компонент.
-
>То есть вы считаете, что кто-то сможет прицепить ваш ВНУТРЕННИЙ компонент к своему ВНЕШНЕМУ ?
Где я такое написал?
>Тогда что же мешает вызвать LOADED ?
Никто так и сделал.
>А вообще, разговор об абстракциях - сотрясение воздуха. Нет ни строчки кода, ни намёка, что вообще делает ваш компонент.
Компонент хранит список ссылок на существующеие компоненты. С сохранением этого списка в dfm через DefineProprty. Чтобы при чтении из dfm корректно восстановить ссылки нужно сделать FixUp по завершению загрузки.
Ещё раз спрашиваю код чего именно вас интересует??
-
>Компонент хранит список ссылок на существующие компоненты.
1. Зачем хранить список ссылок, если они и так есть в списке Формы ?
2. Что будут делать 10 компонентов в 10-ти элементах коллекции ? Десять раз Фиксить ?
3. Пытаюсь понять для чего это вообще нужно - ума не приложу. А раз непонятна цель, то и выбор средств тоже неясен. Может вообще не в LOADED дело ?
-
>1. Зачем хранить список ссылок, если они и так есть в списке Формы ?
Для использования в личных целях компонента. Т.е. ему не нужны все. Ему нужны некоторы например первый, пятый и десятый.
>2. Что будут делать 10 компонентов в 10-ти элементах коллекции ? Десять раз Фиксить ?
Не очень понял про какие 10 компонентов идёт речь? Какдлый список нужно фиксить отдельно. Если списков будет десять то само собой фикс для каждого.
>3. Пытаюсь понять для чего это вообще нужно - ума не приложу.
Компоненты отвечают за отрисовку данных для пользователя. Т.е. в дизайн тайме можно набрать список комопонентов которые будут отображать некие данные. Компоненты не визуальные типа Taction.
-
> в дизайн тайме можно набрать список компонентов
То есть, компоненты из списка принадлежат форме и сохраняются в DFM. Это значит, что Loaded каждого из них будет вызван дважды: один раз - автоматически, второй - Вашим кодом. Получается, что Вам делать ничего не нужно, все сработает само.
Или я чего-то не понял?
-
Не совсем.
Реализовывалась связь многие ко многим.
Соответственно:
Есть TElement
Есть TElementList
Они само собой принадлежат форме и сохраняются в DFM. При чтении само собой получают Loaded.
Но есть ещё много TElementCollection которые хранят только списки ссылок на те элементы которые есть в TElementList. И тоже сохраняет их в DFM но уже как имя компонентов. Так как TElementCollection является полем TCollectionItem то никакого Loaded ему не приходит и соответственно ссылки нельзя корректно востановить.
Пока сделал глобальный список в котором TElementList регистрирует себя как желающий получить Loaded. А TElementList в своём Loaded обходит этот список и вызывает Loaded всем загрузившимся.
По хорошему хотелось бы регистрироваться в списках TReader но не вышло :(
-
Чего-то я не понимаю, видимо.
> Есть TElement
> Есть TElementList
>
> Они само собой принадлежат форме и сохраняются в DFM. При
> чтении само собой получают Loaded.
Пока все нормально. Но тут же Вы пишете:
> сделал глобальный список в котором TElementList регистрирует
> себя как желающий получить Loaded.
Зачем нужна эта регистрация, если TElementList и без нее получает свой Loaded?
А в нем TElementList проходит по элементам коллекции и восстанавливает ссылки. Без всяких дополнительных списков.
-
Упс... Следует читать: Пока сделал глобальный список в котором TElementCollection регистрирует... далее по тексту.