Можно ли отобразить форму до того, как компонент / форма будет уничтожена? - PullRequest
0 голосов
/ 03 апреля 2012

Я работаю в Delphi5

Я хотел бы, чтобы пользовательская форма отображалась до того, как компонент был уничтожен во время выполнения проекта.

Возможно ли это сделать из пользовательского компонента?Другими словами, можно ли отобразить форму до того, как пользовательский компонент будет уничтожен во время выполнения, когда форма, в которой он размещен, закрыта?

Я попытался поместить следующее в деструктор компонента, ноПри закрытии формы я получаю сообщение об ошибке доступа:

destructor TqqFormLogger.Destroy;
begin
  if NOT (csDesigning in ComponentState) then
    SurveyForm.Click;

  inherited Destroy;
end;

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

Вообще говоря, AV - это сигнал, что некоторый код пытается вызвать процедуру чего-то, что больше не существует.

В этом свете AV как результат этого конкретного деструктора может указывать на один из двух случаев:

  1. SurveyForm больше не существует или
  2. Код как результат 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 до того, как сообщение будет отправлено или обработано.

Короче говоря: сейчас вопрос слишком общий, чтобы дать конкретный ответ.

0 голосов
/ 03 апреля 2012

Взгляните на переопределение метода BeforeDestruction() вместо деструктора.

Но почему это делается на уровне компонентов? Почему бы не сделать это в событии родительской формы OnClose вместо этого?

...