2014-11-23 92 views
1

我有一个TCustomControl,我必须在构造函数中调用一些功能需要的控制有Parent属性集。我试图首先设置它,如果我在运行时创建控件的实例,但是当我想在设计时将它放在窗体上,则会出现访问违规。我怎样才能解决这个问题 ?如何在构造函数中调用需要设置控件`Parent`的函数?

constructor TPathHolder.Create(AOwner: TComponent); 
begin 
inherited; 
Parent:=TWinControl(AOwner); 

//.....that function here.... 
end; 
+1

@kobik'csDesigning'是不是解决这个问题的正确方法。如果需要父项,那么只有放置依赖父项的代码的适当位置在'SetParent'方法中。有时你无法避免拥有父母。例如,TComboBox控件在初始化它的项目时需要父项 - 无论是在设计阶段还是在运行阶段。 – 2014-11-24 09:58:02

回答

5

不分配控制的父母在构造函数(或在您的控制代码内部的任何部分)。设置父内部控制本身会干扰VCL框架在设计和运行时的工作方式。

相反,你可以重写的setparent方法,并做你的初始化那里。

procedure SetParent(AParent: TWinControl); override; 

procedure TMyControl.SetParent(AParent: TWinControl); 
begin 
    inherited; 
    // put custom initialization code here 
end; 

请记住,在控制生命期内可以多次调用此方法,并且传递AParent可以为零。

+1

这是如何改变什么?据推测,在构造函数中设置Parent的问题依然存在。或者你的意思是停止在构造函数中设置Parent。 – 2014-11-23 22:34:35

+1

@DavidHeffernan如果初始化移动到'SetParent'方法,那么行'Parent:= TWinControl(AOwner);'不再需要。 – 2014-11-24 09:50:12

+0

答案并没有说明。 – 2014-11-24 09:53:19

2

您不应在构造函数中设置Parent。它是如此简单。应该在构造函数返回后设置Parent

以后需要调用这些其它功能,那些需要Parent进行设置。或者找到一种方法来完成工作,而不需要设置Parent

+1

设置父内部控制本身不应该这样做,因为它在设计和运行时会干扰VCL框架的功能。 – 2014-11-24 10:15:06

+1

@DalijaPrasnikar是的,这是我的观点 – 2014-11-24 10:24:21

相关问题