我正在设计我自己的 Delphi XE5 自定义网格。我对 VCL 不感兴趣,所以我只使用 FireMonkey。因为它必须是数据感知的,所以 LiveBindings 是必须的。任务很复杂,所以我会尝试只针对非常具体的问题提出问题。
一个前言。我发现 FireMonkey(就像旧的 VCL)有点难以扩展。它确实广泛使用接口,但仍有很多代码不可覆盖或引用私有成员。我发现自己不得不复制整个课程来改变 5-10 行行为。
我现在拥有的是(ME.Grid):
TCustomGrid -> TMECustomGrid -> TMEGrid (my custom grid)
TColumn -> TMEColumn -> TMExxxColumn (specific custom column classes)
Txxx -> TMExxxCell (specific custom grid cell classes)
所有注册到 RegisterFmxClasses。TMEGrid 也注册了 RegisterComponents。
我也有(ME.Bind.Grid):
TMELinkGridColumnDescription = Class(TLinkGridColumnDescription)
TMELinkGridToDataSourceControlManager = Class(TInterfacedObject,
ILinkGridToDataSourceControlManager)
TMELinkGridToDataSourceColumnFactory = Class(TLinkGridToDataSourceColumnFactory)
...后者在 RegisterLinkGridToDataSourceColumnFactory 中注册
所有这一切都以最小的实现。之后我将添加/更改行为。我现在的目标是在表单上放置一个 TMEGrid,放置一些数据集并让绑定对我的网格做一些事情。
我得到的(当应用程序启动时)是 EBindCompError '没有可用的列表控件编辑器'。
由于这在我从 TGrid 派生 TMEGrid 时起作用(由于其他原因,这是不可接受的),所以我检查了一下,发现 Bind.Editors 明确引用了 TGrid(而不是 TCustomGrid)。所以我写了我自己的(ME.Bind.Editors):
TMEBindListGridEditor = Class(TBindListEditorCommon,
IBindListVirtualEditor,
IBindGridEditor,
IBindListVirtualEditorScope)
TMEBindGridEditorFactory = Class(TBindEditorFactory)
...后者在 RegisterBindEditorFactory 注册
但这似乎并没有改变什么。我仍然收到相同的错误消息。
有任何想法吗?
请记住,所有组件、工厂等......都在它们自己的包(MEComps)中。该项目只有一个带有网格和其他一些东西(导航器,一些按钮)的表单。
编辑:我想我找到了线索。我从测试项目中检查了我的源代码,我发现
RegisterBindEditorFactory([TMEBindGridEditorFactory]);
代码行没有编译到项目中(我不能在那里设置断点)。显然它没有被拉入项目,这当然不是一个好兆头。所以我检查了使用对应单元的位置(FMX.Bind.Editors),我发现这个非常有趣的 BindCompFMXReg 单元,我没有对应的. 我会研究这个,看看我能不能到达某个地方。