Delphi 创建不同自定义组件集合的方法是什么?

Delphi 创建不同自定义组件集合的方法是什么?,delphi,opengl,collections,Delphi,Opengl,Collections,大家好,我的英语很抱歉 我正在解释我的问题。对于OpenGL库。我有一个通用着色器组件TGLCustomGLSLShader。我想制作一个着色器库集合。此时,我可以在我的集合中添加TGLCustomGLSLShader。但我还想添加TGLCustomGLSLShader的后代。例如:我创建了特定的着色器,如TglumpMapShader、TGLWaterShader等。。。。在每个中具有不同的自定义属性,并且在基类中不存在。我想在我的集合中添加这些新类,并在设计时查看这些自定义属性。有可能吗?

大家好,我的英语很抱歉

我正在解释我的问题。对于OpenGL库。我有一个通用着色器组件TGLCustomGLSLShader。我想制作一个着色器库集合。此时,我可以在我的集合中添加TGLCustomGLSLShader。但我还想添加TGLCustomGLSLShader的后代。例如:我创建了特定的着色器,如TglumpMapShader、TGLWaterShader等。。。。在每个中具有不同的自定义属性,并且在基类中不存在。我想在我的集合中添加这些新类,并在设计时查看这些自定义属性。有可能吗? 你怎么能做到这一点?你有一些链接吗?我试着用谷歌搜索,但没有找到任何线索


致以最诚挚的问候

通过完整的设计时间和DFM支持,有两种方法可以实现这一点:

让公共基类TGLCustomGLSLShader派生自TCollectionItem,然后在主库组件中创建TOwnedCollection published属性来保存它们。用户在设计时将无法在窗体上放置着色器,但本机集合编辑器应能够正常删除/编辑着色器对象。您可以创建自定义设计时编辑器,允许用户创建着色器类的实例,并将TOwnedCollection对象传递给其构造函数。您还必须为库组件实现自定义DFM流,以便它在加载DFM时创建相应着色器类的实例,否则它将创建TGLCustomGLSLShader对象而不是派生对象

让公共基类派生自TComponent,从而允许用户在窗体上放置着色器,并像普通组件一样配置其属性。然后,在库组件中,创建TOwnedCollection published属性,并为其定义具有已发布TglCustomGlsShader属性的自定义TCollectionItem类。这将允许用户使用本机集合编辑器添加项目,然后根据需要手动将它们链接到所需的着色器组件。虽然这需要更多的对象和更多的用户设置,但在本机设计时编辑器和DFM上更友好,因为它允许默认行为正常运行,并且不需要任何自定义设计时编辑器来管理对象


谢谢Remy,如果我理解的话,我必须为我拥有的每个着色器组件创建一个自定义TCollectionItem。像TCustomShaderItem、TBumpShaderItem、TWaterShaderItem和Register items一样作为我的集合中的类。如果使用第一种方法,则选择“是”,因为每个TglCustomGlsShader将直接作为自己的集合项。但是如果使用第二种方法,则不会,因为单个TCollectionItem类将能够指向任何外部TglCustomGlsShader组件。就个人而言,我建议第二种方法,它更容易实现。嗯,谢谢雷米。我不想做的事情是在我的窗体上放置100个着色器组件。所以,我会看看第一个解决方案,我会搜索一些关于这项技术的教程,如果可以的话,我会这样做。否则就没有必要使用shaderlibrary,因为我可以在3D对象中设置和选择直接着色器。