使用LiveBindings的自定义网格 - EBindCompError'没有可用的列表控件编辑器'

时间:2014-04-23 14:10:20

标签: delphi custom-controls firemonkey delphi-xe5 livebindings

我正在设计自己的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单元,其中我没有等效的。我会研究这个,看看能不能到达某个地方。

1 个答案:

答案 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.

我帮助了你。