2

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

4

1 回答 1

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.

我已经帮你了。

于 2015-02-03T11:48:44.583 回答