Вверх ↑
Ответов: 4628
Рейтинг: 749
#1: 2014-02-23 12:27:10 ЛС | профиль | цитата
Да, именно элементарным является понятие что после Free нельзя обращаться к своим полям.
Но "внешнее" удаление тоже не всегда может удовлетворить этим условиям, если "внутри", например, работает параллельный поток. Поток перед этим нужно будет остановить.

Galkov писал(а):
Хотя бы потому, что автор схемы, после "вызова своего метода Free", обязательно захочет сделать чего то еще
Мне об этом известно. И на это, я считаю, есть очень простое решение (в связи с нереализованностью которого в текущих контейнерах я и высказался про "способ их реализации").
Как сейчас инициализируется контейнер:
1) Создаются вложенные компоненты (ElementXXX := ThiElement.Create)
2) Вызывается Init для визуальных компонентов (вроде)
3) Заполняются свойства компонентов, для организации связей между точками. После этого компоненты могут взаимодействовать между собой и с внешней схемой.

Как уничтожается контейнер:
1) Вызываются деструкторы внутренних компонентов (ElementXXX.Destroy)

Спрашивается, почему перед этим не обнуляются связи между внутренними компонентами? Естественно, внутри после ##clear автор схемы может вызвать ещё что-нибудь.

Если уничтожение сделать в виде:
1) Обнулить связи между компонентами
2) Вызываются деструкторы внутренних компонентов (ElementXXX.Destroy)

то уничтожение из себя должно работать вполне корректно.

Также нужно кардинально переработать базовые классы контейнеров и их внутренних схем, а также их кодогенерацию (это та большая работа, о которой я говорил выше) с целью того, чтобы контейнер создавался в родительском компоненте как и любой другой элемент через ContainerXXX := ThiContainerXXX.Create с последующим заполнением связей. А не как сейчас через какие-то глобальные функции (хотя я не настаиваю). И уничтожался через ContainerXXX.Destroy, в процессе которого контейнер для каждой дочерней схемы вызывает обнуление связей, и Destroy экземпляра, уже в котором уничтожаются собственные внутренние компоненты.
карма: 26

0