2016-01-30 67 views
-4

嗨,大家提前對不起,我的英語。創建不同自定義組件集合的方法是什麼?

我解釋我的問題。對於OpenGL庫。我有一個通用的Shader組件(TGLCustomGLSLShader)。我想製作一個Shader庫集合。目前,我可以在我的收藏中添加TGLCustomGLSLShader。但我也想添加TGLCustomGLSLShader的後代。例如:我創建了特定的着色器,如TGLBumpMapShader,一個TGLWaterShader等...,每個都有不同的自定義屬性,並且不存在於基類中。我想在我的收藏中添加這些新類,並在設計時查看自定義屬性。有可能的 ? 如何做到這一點?你有一些鏈接?我試圖用谷歌搜索,但我沒有找到任何線索。

問候

回答

1

有全設計時和DFM的支持來實現這個方法有兩種:

  1. 有共同的基類(TGLCustomGLSLShader)從TCollectionItem派生,然後創建一個TOwnedCollection在您的主庫組件中發佈屬性以保存它們。用戶將無法在設計時在表單上放置着色器,但本機集合編輯器應該能夠正常刪除/編輯着色器對象。您可以創建一個自定義設計時編輯器,允許用戶創建着色器類的實例,並將TOwnedCollection對象傳遞給它們的構造函數。您還必須爲庫組件實現自定義DFM流,以便在加載DFM時創建相應着色器類的實例,否則它將創建TGLCustomGLSLShader對象而不是派生對象。

  2. 讓公共基類從TComponent派生,從而允許用戶在窗體上放置着色器,並像普通組件一樣配置它們的屬性。然後,在您的庫組件中,創建一個TOwnedCollection已發佈的屬性,併爲其定義一個具有已發佈的TGLCustomGLSLShader屬性的定製TCollectionItem類。這將允許用戶使用本地集合編輯器添加項目,然後根據需要手動將它們鏈接到所需的着色器組件。雖然這需要更多的對象和更多的用戶設置,但它對本地設計時編輯器和DFM更友好,因爲它允許默認行爲正常運行,並且不需要任何定製設計時編輯器來管理對象。

+0

謝謝雷米,如果我明白我必須爲每個着色器組件創建一個自定義TCollectionItem。像TCustomShaderItem,TBumpShaderItem,TWaterShaderItem和Register items作爲我的集合中的類。 – Shadar

+0

如果你採用第一種方法,那麼是的,因爲每個'TGLCustomGLSLShader'都會直接作爲自己的收集項目。但是如果你使用第二種方法,那麼不用,因爲一個'TCollectionItem'類可以指向任何外部的'TGLCustomGLSLShader'組件。就個人而言,我會建議第二種方法,它更容易實施。 –

+0

哼,感謝雷米。我不想做的事情是將100個Shader組件放在我的表單上。所以我會看看第一個解決方案,我會搜索一些關於這種技術的教程,如果可以的話就做。否則,不需要有shaderlibrary,因爲我可以在我的3D對象中設置和選擇直接着色器。 – Shadar

相關問題