是否可以在销毁组件/表单之前显示表单?

时间:2012-04-02 21:07:21

标签: delphi components vcl delphi-5

我在Delphi5工作

我希望在项目运行时销毁组件之前显示自定义表单。

是否可以在自定义组件中执行此操作?换句话说,我可以在自定义组件在运行时销毁之前显示一个表单,当它放置它的表单时,它会被关闭吗?

我尝试将以下内容放在组件的析构函数中,但是在表单关闭时出现访问冲突错误:

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

  inherited Destroy;
end;

2 个答案:

答案 0 :(得分:1)

一般来说,AV是某些代码试图调用不再存在的例程的信号。

从这个角度来看,这个特定析构函数的AV可能表明两种情况之一:

  1. SurveyForm不再存在,或
  2. 作为SurveyForm.Click的结果的代码期望您的组件存在,但无论如何都会销毁该组件。
  3. 名称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

    简而言之:现在问题太笼统,无法给出具体答案。

答案 1 :(得分:0)

请看一下覆盖BeforeDestruction()方法而不是析构函数。

但为什么在组件层呢?为什么不在父表单的OnClose事件中呢?