2016-11-11 64 views
2

我想定義一個TCustomFrame的子類,但我在TabOrder屬性上得到一個錯誤。如何正確定義TCustomFrame的子類?

這些步驟,我已經按照:

  1. 添加新TFRAME傳人的形式(右鍵單擊項目,添加新的,其他的,幀)。 enter image description here
  2. 將父類從TFrame切換到TCustomFrame。

    TMyFrame = A類(TCustomFrame)

  3. 檢查TFRAME定義和發佈完全相同的特性(這樣做,TMyFrame應該是相同的TFRAME,對吧?)。

  4. 保存並關閉。
  5. 定義TMyFrame的開放單元。

它得到一個錯誤,說TabOrder屬性不存在。 enter image description here

有人可以澄清我做了什麼和如何正確創建TCustomFrame的子類嗎?

+0

這不是一個框架,但它可以解決您的問題:Delphi的自定義Conatainer包http://blog.dummzeuch.de/2014/09/14/custom-container-pack-for-delphi-xe2-to -xe7/ – dummzeuch

回答

0

重要的是,已發佈的屬性存在於組件駐留的設計時包中,以便IDE能夠對其進行流式處理。

當您向項目中添加一個框架時,相應的'dfm'文件包括在TFrame類中發佈的屬性。這包括TabOrder和其他。當您關閉並重新打開該項目時,無法在TCustomFrame中找到TabOrder,因此出現此錯誤。

爲了能夠使用更常見的組件進行解釋,請在您的項目中添加一個表單。將已發佈的屬性添加到您的表單中。保存該項目,關閉並重新打開。您不會在對象檢查器中看到您發佈的屬性。如果IDE試圖流式傳輸您的媒體資源,則會出現錯誤。

要正確操作,您需要做的是在工具選項板中註冊組件。您需要在包中編譯它,因爲您將無法使用TCustomFrame上的「添加到調色板」快捷方式。有關如何實現該功能的詳細信息,請參見documentation。爲方便起見,您可以從包含TFrame後代的單位開始,但不要忘記在保存單位之前更改方位並手動刪除(Alt + F12)您取消發佈的屬性。

1

你似乎過於複雜這一點,我不知道爲什麼你認爲你需要你的第2步

以下爲我工作得很好:

  1. 沒有項目啓動打開,創建一個新的框架,粘貼一個或兩個組件(我只是使用TListBox),將其重命名爲MyFrame並保存。

  2. 右鍵單擊框架,從上下文菜單中選擇「添加到調色板」,完成隨後的對話框以指定它應出現在哪個調色板頁面並再次保存。默認情況下,它會將其稱爲「MyFrameTemplate」。

  3. 做一個「全部關閉」,然後開始一個新的項目。導航到您在步驟2中指定的調色板頁面,並像任何其他組件一樣將TMyFrame的實例添加到表單中。系統會提示您將框架的單元添加到您的項目中。這就是你應該做的所有事情。鰭。

上述工作至少可以追溯到D7和西雅圖。

如果您重命名了框架的DFM文件,然後嘗試重新打開使用它的項目,IDE會抱怨它無法打開DFM,然後無法找到類TMyFrame並詢問是否它應該從你的表格中刪除。因此,幀的使用取決於其DFM的存在,並且由於幀上的組件的屬性已經流入其DFM中,所以難以看到如何防止它們以使用幀的形式被改變,因爲你需要擊敗通常的蒸制機制。也許有人知道一個狡猾的方法來做到這一點,但在我看來,如果這就是你想做的事情,TFrame就是開始的地方。

順便說一句,如果你想阻止你的評論中提到的事情發生變化,我個人會將它作爲一個新的複合組件,使用GExpert的「組件代碼」爲其構造函數生成代碼。

+0

我想定義一個TCustomFrame後裔,因爲我想避免發佈一些屬性(在問題中,我發佈了所有屬性只是爲了使測試更簡單),此外我想避免意外使用鼠標移動組件。 – ExDev

+0

然後這聽起來有點像一個框架可能不是最好的開始。 – MartynA

+0

您也可以在運行時創建框架。這避免了使用鼠標移動組件,加上一些其他「奇怪」(但罕見)的視覺繼承效應。 – quasoft