2008-10-10 28 views
11

我一直在使用Delphi 7中的一個項目,在那裏我想讓窗體繼承其他窗體的組件。我能夠得到這個工作,但遇到以下問題(我將發佈解決方案,希望在未來幫助其他人):如何在Delphi中使用或解決可視化表單繼承問題?

  1. 在表單的.pas文件中,我會將窗體更改爲從其他窗體繼承,但不會從祖先窗體獲取組件。
  2. 對於某些後代形式,在設計時打開窗體時會出現以下錯誤消息:「創建窗體時出錯:未找到'TAncestorForm'的祖先。」我必須先手動打開祖先表單,然後才能打開後代表單。

回答

25

首先,對於那些不知道如何以可視方式繼承表單的人,可以照常創建祖先表單。然後轉到文件>新建>其他。選擇具有當前項目名稱的選項卡,然後選擇要從其繼承的表單。如果您想從不屬於當前項目的表單繼承,請打開該表單,右鍵單擊該表單並選擇添加到存儲庫。然後,您可以轉到文件>新建>其他,然後從相應的選項卡中選擇該表單。

鑑於這一點,我遇到了問題,因爲一些後代形式已經創建,所以我不能按照上面的過程。此外,我對Delphi創建的標準代碼進行了一些更改。我可以使用下面的準則,以解決與視覺形式繼承的所有問題:

  • 後裔形式的的.pas文件必須從正確的祖先類窗體的類繼承,如:
    type TMyForm = class(TAncestorForm)
  • 在後代形式的.DFM的第一行必須有字inherited代替object,如:
    inherited MyForm: TMyForm
  • 編輯:雙重檢查後,以下是不需要:祖先形式的.PAS文件必須具有德爾福創建標準的全局變量,如:
    var AncestorForm: TAncestorForm;
  • 項目.dpr文件的uses部分必須有相同的全局變量作爲後評論單位的文件名,如:
    unAncestor in 'unAncestor.pas' {AncestorForm}

手冊/ Tips:

  • 無論是祖先形式和後裔的形式都(如果需要,請設置爲非自動創建)(在項目>選項>表單>自動創建表單中設置)。
  • 若要將後代表單上的屬性還原爲祖先表單的值,請右鍵單擊Object Inspector中的屬性,然後選擇還原爲繼承。
  • 要將組件的所有屬性值還原爲祖先的值,請右鍵單擊組件並選擇還原爲繼承。
+2

全局變量是n不需要。 – 2008-10-10 15:07:14

1

DPR似乎有點棘手。就我而言,我創建了一個從TFrame派生的祖先。然後我從TAncestorFrame派生出多個幀。我DPR的uses子句則看起來像:

uses 
    Forms, 
    ancestorFrame in 'ancestorFrame.pas' {AncestorFrame : TFrame}, 
    frame1Unit in 'frame1Unit.pas' {frame1:TFrame}, 
    frame2Unit in 'frame2Unit .pas' {frame2:TFrame}, 

的DPROJ文件應該是這樣:

<DCCReference include="frame1Unit.pas"> 
    <Form>frame1</Form> 
    <DesignClass>TFrame</DesignClass> 
</DCCReference> 

派生的框架應該是這樣的:

TFrame1 = class(TAncestorFrame) 

和派生框架.DFM文件應該說:

inherited Frame1:TFrame1