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