嗨大家提前抱歉我的英语。
我在解释我的问题。对于OpenGL库。我有一个通用的着色器组件(TGLCustomGLSLShader)。我想制作一个Shader Library集合。这时我可以在我的收藏中添加TGLCustomGLSLShader。但我还想添加TGLCustomGLSLShader的后代。例如:我创建了特定的着色器,如TGLBumpMapShader,TGLWaterShader等,每个都有不同的自定义属性,并且不存在于基类中。我想在我的集合中添加这些新类,并在设计时查看自定义属性。有可能的 ? 怎么能做到这一点?你有一些链接吗?我试图用谷歌搜索,但我找不到任何线索。
祝你好运
答案 0 :(得分:1)
有两种方法可以通过完整的设计时和DFM支持来实现这一点:
让公共基类(TGLCustomGLSLShader
)派生自TCollectionItem
,然后在主库组件中创建一个TOwnedCollection
已发布属性来保存它们。用户将无法在设计时在窗体上删除着色器,但本机收集编辑器应该能够正常删除/编辑着色器对象。您可以创建一个自定义设计时编辑器,允许用户创建着色器类的实例,并将TOwnedCollection
对象传递给它们的构造函数。您还必须为Library组件实现自定义DFM流,以便在加载DFM时创建相应着色器类的实例,否则将创建TGLCustomGLSLShader
个对象而不是派生对象。
使公共基类派生自TComponent
,从而允许用户在表单上删除着色器并像普通组件一样配置其属性。然后,在“库”组件中,创建TOwnedCollection
已发布的属性,并为其定义具有已发布TCollectionItem
属性的自定义TGLCustomGLSLShader
类。这将允许用户使用本机集合编辑器添加项目,然后根据需要手动将它们链接到所需的着色器组件。虽然这需要更多的对象和更多的用户设置,但它在本机设计时编辑器和DFM上更友好,因为它允许默认行为正常运行,并且不需要任何自定义设计时编辑器来管理对象。