Пользовательская сетка с LiveBindings - EBindCompError «Нет доступного редактора управления списком»

Я разрабатываю собственную пользовательскую сетку 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 "Нет доступного редактора управления списком".

Поскольку это работало, когда я производил TMEGrid из TGrid (что было неприемлемо по другим причинам), я проверил и заметил, что Bind.Editors явно ссылается на TGrid (вместо TCustomGrid). Поэтому я написал свой собственный (ME.Bind.Editors):

TMEBindListGridEditor = Class(TBindListEditorCommon,
  IBindListVirtualEditor,
  IBindGridEditor,
  IBindListVirtualEditorScope)
TMEBindGridEditorFactory = Class(TBindEditorFactory)

... последний зарегистрирован в RegisterBindEditorFactory

Но это, похоже, ничего не изменило. Я все еще получаю то же сообщение об ошибке.

Любые идеи?

Имейте в виду, что все компоненты, фабрики и т. д. находятся в своих собственных пакетах (MEComps). В проекте только одна форма с сеткой и еще кое-что (навигатор, какие-то кнопки).

Редактировать: я думаю, что нашел подсказку. Я проверил свой источник из тестового проекта и обнаружил, что

RegisterBindEditorFactory([TMEBindGridEditorFactory]);

строка кода не компилируется в проект (не могу поставить точку останова). Очевидно, что его не втягивают в проект, что, безусловно, не является хорошим знаком. Итак, я проверил, где используется аналогичный модуль (FMX.Bind.Editors), и нашел очень интересный модуль BindCompFMXReg, аналога которому у меня нет. Я изучу это, чтобы посмотреть, смогу ли я куда-нибудь добраться.


person Frazz    schedule 23.04.2014    source источник


Ответы (1)


во-первых, извините, я бразилец и не говорю по-английски, поэтому я использовал Google переводчик :)-, но хотел бы вам помочь ...

У меня была такая же проблема, я создал сетку, которая динамически строит запрос и столбцы, но для активации этой сетки выдавалась ошибка EBindCompError.

Это происходит потому, что для структуры LiveBindigs требуется редактор того же типа, который используется во время разработки.

Я просмотрел код Delphi и нашел простое решение для моего случая, которое может быть и для вашего случая.

Я импортировал библиотеку Fmx.Bind.Editors и объявил переменную типа TBindListGridEditor и только что создал ее в методе 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.

Я помог тебе.

person Luiz    schedule 03.02.2015
comment
Большое спасибо. Этот вопрос все еще открыт для меня, хотя он был перемещен в очередь с более низким приоритетом;) Я обязательно рассмотрю ваше решение и посмотрю, поможет ли оно. - person Frazz; 04.02.2015