我正在设计自己的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单元,其中我没有等效的。我会研究这个,看看能不能到达某个地方。
答案 0 :(得分:1)
首先我很抱歉,我是巴西人,我不会说英语,所以我用谷歌翻译:) - ,但是想帮助你......
我遇到了同样的问题,我创建了一个动态构建查询和列的网格,但是为了激活这个网格,错误是生成EBindCompError。
发生这种情况的原因是LiveBindigs结构需要一个在设计时使用的相同类型的编辑器。
我查看了Delphi代码并为我的案例找到了一个简单的解决方案,也适用于您的情况。
我导入了库Fmx.Bind.Editors,并声明了一个类型为TBindListGridEditor的变量,只是在我的Grid的Create方法中创建,下面是示例:
MyUnit unit;
interface
uses
Fmx.Bind.Editors ...
type
TMyGrid = class (TGrid)
private
FBindingEditor: TBindListGridEditor;
public
constructor Create (AOwner: TComponent); override;
end;
Implementation
constructor TFBGrid.Create (AOwner: TComponent);
begin
inherited Create (AOwner);
FBindingEditor: = TBindListGridEditor.Create (Self);
end;
end.
我帮助了你。