__published
замыкания не дают никаких гарантий такого рода, замыкание - это просто указатель на экземпляр класса и функцию внутри. Однако в VCL есть и другие механизмы, которые это делают.
Обычно при разработке компонентов, зависящих от других компонентов, рекомендуется удалять все внутренние ссылки на компонент при его удалении. В VCL это можно сделать с помощью бесплатных уведомлений в TComponent
.
Если компонент, на который вы полагаетесь, имеет другого владельца и отсутствует в форме, то вам необходимо зарегистрировать компонент, чтобы получать эти уведомления. Это делается с помощью функции FreeNotification
(не забудьте снова отменить регистрацию компонента при удалении компонента, для которого используется уведомление, для этого используйте RemoveFreeNotification
). Всякий раз, когда элемент управления добавляется в ту же форму (или владельца), что и этот компонент, вызывается функция Notification
со ссылкой на добавленный или удаленный компонент и выполненное действие.
Таким образом, вы просто перезаписываете функцию Notification
, не забудьте также вызвать функцию родителя. Перегруженная функция может выглядеть так:
void __fastcall TMyComponent::Notification(TComponent* AComponent, TOperation Operation)
{
if (Operation == opRemove && AComponent == interestingComponent)
{
this->interestingComponent = NULL;
}
inherited::Notification(AComponent, Operation);
}
Если это сторонний элемент управления, он, конечно, должен убедиться в этом и убедиться, что есть висячие указатели из-за освобождения компонента, если они по какой-то причине забыли, вам придется добавить функциональность, либо путем подкласса или сброса событий, как вы заявили. Если это ваш собственный компонент, убедитесь, что вы делаете это.