Вообще говоря, AV - это сигнал, что некоторый код пытается вызвать процедуру чего-то, что больше не существует.
В этом свете AV как результат этого конкретного деструктора может указывать на один из двух случаев:
SurveyForm
больше не существует или
- Код как результат
SurveyForm.Click
ожидает, что ваше существование компонента будет истинным, но компонент все равно будет уничтожен.
Название Click
предполагает, что SurveyForm
является кнопочным элементом управления. Если этот элемент управления не является частью вашего компонента, но является частью формы, в которой находится компонент, тогда первое (случай 1), безусловно, может быть верным: деструктор формы уже уничтожил SurveyForm
и теперь собирается уничтожить ваш составная часть. Вы можете предотвратить это, используя BeforeDestruction
, как уже упоминал Реми. Также (но в качестве общего совета, а не решения вашей проблемы) вы можете запретить использование уничтоженного компонента, зарегистрировав этот компонент самостоятельно, чтобы получать уведомления о его уничтожении. Сделайте это с FreeNotification
в сочетании с переопределением Notification
, в котором вы обнулите компонент:
procedure TqqFormLogger.SetSurveyForm(Value: TForm);
begin
FSurveyForm := Value;
FSurveyForm.FreeNotification(Self);
end;
procedure TqqFormLogger.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (AComponent = FSurveyForm) and (Operation = opRemove) then
FSurveyForm := nil;
end;
destructor TqqFormLogger.Destroy;
begin
if FSurveyForm <> nil then
...
Если элемент управления действительно является частью вашего компонента, то я подозреваю, что код, стоящий за Click
, так или иначе разрешает обработку деструктора компонента (случай 2). Например, при публикации сообщения (вручную или в результате внутренних операций VCL или Windows) будет вызываться inherited Destroy
до того, как сообщение будет отправлено или обработано.
Короче говоря: сейчас вопрос слишком общий, чтобы дать конкретный ответ.