2009-02-26 57 views
3

來自我的另一個TFrame IDE註冊組件問題。感謝所有的幫助,同行的程序員。 :)TFrame繼承重構

與Darrian的TFRAME繼承建議here打圍:

具體細節:

基本上,我有,我已經註冊到IDE基於TFRAME成分,它已表現的很出色。我現在正在開發幾個「姐妹」組件,它們將共享大量現有組件的非視覺功能和屬性。因此,將大量元素轉移到新組件和舊組件可以繼承的父類/超類中是有道理的。

以這種方式「重構」TFrame繼承的最佳方式是什麼? (這也可能適用於TForm類的後代,不確定)。有什麼需要注意的事項和注意事項?

例子:

我試過了,例如,創建一個新的TFRAME,沒事就可以了,並調用框架TMyBaseFrame。然後修改我現有組件的類定義(我們稱之爲TMyFrameTreeView),以從中繼承而不是TFrame。

它編譯得很好,但是當我嘗試將它放在窗體上時,我得到「ClientHeight未找到」(或「ClientHeight property not found」),並且它不會放在窗體上。從相關的DFM中刪除ClientHeight和ClientWidth帶來了巨大的破壞,而且無論如何它們都會在調整大小後被替換。我注意到後代類中的ExplicitHeight和ExplicitWidth,並且認爲它涉及來自繼承值的屬性值覆蓋,但我不確定。通過New - > Inherited Items重新創建一個全新的框架,然後複製一切,還沒有產生很好的結果。

最後請注意

我意識到這可能會導致混亂很快,隨着流媒體DFM文件和後裔等多代....這就是爲什麼我問的整體「的東西的一部分尋找「的概念方面,但也給出了一個特定的現實世界簡單版本的問題以及(在我看來,應該是可行的)。

我已經創建了一個小測試包來學習嘗試,並且正在學習很多東西,但是它很慢,並且任何有關Delphi的「絕地大師」的指導/洞察將會最受讚賞。 :)



答案更新後:

的答案都低於都是有幫助的。同樣,創建一個「基本框架類」,它與正常的TFrame沒有任何變化,並且在添加任何屬性,方法等之前繼承它,似乎穩定了流傳的巨大繼承。不知道爲什麼,但到目前爲止。

回答

8

除了改變基類的TMyFrameTreeViewTMyBaseFrame變化在DFM文件中的第一個字用於TMyFrameTreeViewobjectinherited

3

我現在開發的幾個「姐妹」,這將共享一個偉大的 交易的現有組件的 非可視功能和性能 組件 。這是有道理的,然後, 將大量的移動到 父/超類,新的 和舊的組件可以從 繼承。

什麼是「重構」的最佳方式 這樣的TFrame繼承?

以上文字的癥結可能是「組件的非可視功能」。所以,在這種情況下,恕我直言,最好是分開視覺和非視覺層。

所以,也許這是更好地使用裝飾:

TMySharedEngine = class(Whatever) 
property LinkedFrame: TFrame; 
property P1; 
property P2; 
... 
procedure Proc1; 
procedure Proc2; 
... //etc. 
end; 

,並在你的「姐姐」幀使用它的實例:

var 
TMyFrame1 = class(TFrame) 
... 
FDecorator: TMySharedEngine; 
    ... 
    public 
    property MySharedPart: TMySharedEngine read FDecorator; 
    constructor Create(AOwner: TComponent); override; 
    ... 
end; 

constructor TMyFrame1.(AOwner: TComponent); override; 
begin 
    inherited; 
    FDecorator:=TMySharedEngine.Create; //ok, ok do not forget to Free it .Destroy 
    FDecorator.LinkedFrame:=Self; 
    ... 
end; 

OTOH,如果你想用你的方法您可以使用Visual Form Inheritance(如Darian建議)或(更靈活),您可以手動完成:使用IDE創建以下框架:TBaseFrame,TChildFrame1,TChildFrame2等。現在繼續TChildFrame1的單位並更改從TChildFrame1 = class(TFrame)到TChildFrame1 =的類定義類(TBaseFrame)。編譯。它應該工作。雖然這是建議,當你將這個技巧TBaseFrame爲空以避免可能的小怪癖(特徵碰撞等)

HTH。

+0

看來到目前爲止,「TBaseFrame完全空」是避免許多小故障的關鍵。同時確保DFM文件在後面的課程中以「inhertied」而不是「object」開頭。也會考慮你的裝飾者的想法 - 謝謝你! – Jamo 2009-02-27 02:29:02