2014-11-23 19 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

相關問題