我在Delphi5工作
我希望在项目运行时销毁组件之前显示自定义表单。
是否可以在自定义组件中执行此操作?换句话说,我可以在自定义组件在运行时销毁之前显示一个表单,当它放置它的表单时,它会被关闭吗?
我尝试将以下内容放在组件的析构函数中,但是在表单关闭时出现访问冲突错误:
destructor TqqFormLogger.Destroy;
begin
if NOT (csDesigning in ComponentState) then
SurveyForm.Click;
inherited Destroy;
end;
答案 0 :(得分:1)
一般来说,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
。
简而言之:现在问题太笼统,无法给出具体答案。
答案 1 :(得分:0)
请看一下覆盖BeforeDestruction()
方法而不是析构函数。
但为什么在组件层呢?为什么不在父表单的OnClose
事件中呢?