2013-07-12 33 views
2

嗨我正在開發一個TControl後代,讓它命名爲THTMLBaseControl,在運行時,控件只會根據該控件的設置生成並輸出HTML代碼,所以基本TControl類和方法的所有其他屬性,包括Windows消息系統在運行時並未使用,並導致內存開銷。如何在Delphi中在運行時更改繼承類的父類?

我需要控制從TControl繼承,所以在設計時我可以使用所有IDE設計器的東西。

但是在運行時,幾乎所有那些在設計時需要的屬性我都不需要它們。

我也擁有從THTMLBaseControl繼承的所有控件,因此,爲每個控件類創建包裝類不是一種選擇,因爲它會重複代碼。

所以我需要的是,在運行時,類實例化之前,我可以更改父類,以便基於另一個TControl類的實例化,也許命名爲TonBaseControl作爲TControl從「TComponent」繼承,但那不會有TControl內存的所有開銷,並且只會擁有THTMLBaseControl所需的屬性和方法。

我真的沒有在rutime的GUI是一個Web服務器,將只提供HTML,是intraweb和Raudus做的一些事情,但總是問題是所有都基於TControl,所以他們必須創建在運行時間併產生很多未使用的內存和進程開銷。也許可以有一個解決方案,所以在運行時實例化的任何THTMlBaseControl後代將繼承TmyBaseControl的所有屬性和方法,而不是從TControl中繼承。

我見過有辦法破解VMT,但也許有其他解決方案,並沒有看到它。我已經完成了更改NewInstance,ClassParent和TnstanceSize類的方法,但是我必須指定從哪個類中顯然我必須對每個繼承的THTMLBaseControl類執行相同的步驟

並且爲了所有: 這只是一個懷疑,我需要將組件作爲TEdit,TPanel等控件進行控制,並且可以通過設計器IDE進行編輯,我甚至可以創建自己的TControl類,但是我只是在考慮是否可以重用已存在的代碼。

Regards

+0

即使可能,您提出的問題並不是解決問題的方法。你主要擔心的是開銷?你有多少個這個對象的實例?你知道'TComponent'後代的特性出現在設計師身上嗎? –

+1

爲什麼要使用TCustomControl,@Lightbulb? TCustomControl與TConrol相同,只是它有* more *東西,特別是一個窗口句柄和一個畫布。 –

+1

這真的是錯誤的。沒有足夠的細節可以說,你是否考慮過一個THTMLControlConfigComponent設計時間behehaviour,然後根據它的設置實例化你的控件? –

回答

10

您無法更改類的運行時間。一旦對象被實例化,它的類是固定的。你可能破解對象來改變它的VMT指針,使它指向一個不同的類,但那仍然不會解決你的主要擔心,這是內存使用—即使你改變VMT指針,對象的所有內存已經分配;改變VMT指針不會神奇地使對象佔用較少的內存。

您可以做的第一件事就是從TControl下降。正如你所指出的,你不需要它提供的任何東西。所有你想要的是你可以在設計時刻放置在表單上以設置其屬性。爲此,您需要的全部是TComponent,所以請製作您的基本類而不是TControl。然後你會得到更像TTimer的東西,它沒有GUI。一旦你完成了,你不再需要TForm。相反,您可以將組件放在TDataModule上,該設計專門用於在設計時管理非可視組件。

+0

謝謝,這只是一個疑問,我需要組件像TEdit,tpanel,可見和設計器IDE可編輯我甚至可以創建我自己的tControl類,但我只是想我是否可以重用已存在的代碼。問候 – fduenas

+0

是不是自定義屬性編輯器不夠好? –