Потомок TStyledPresentationProxy не был зарегистрирован для класса

У меня есть пользовательский элемент управления сеткой, который наследует от TGrid называется TFmGrid, Этот элемент управления работал нормально в Rad Studio 10 Seattle Update One. Я недавно обновился до 10.1 Berlin и начал замечать это сообщение об ошибке, отображаемое на моем TFmGrid контролирует как при запуске приложения, так и в дизайнере:

Потомок TStyledPresentationProxy не был зарегистрирован для класса TFmGrid. Может быть, необходимо добавить модуль FMX.Grid.Style в раздел использования

На изображении ниже показано, как сообщение об ошибке отображается на элементах управления моей сетки:

введите описание изображения здесь

Я начал с того, что делал, как подсказывает сообщение #include <FMX.Grid.Style.hpp> в заголовочный файл моего TFmGrid контроль, однако это, кажется, ничего не сделало.

Так что, насколько пытается зарегистрировать потомок TStyledPresentationProxy Я не совсем уверен, с чего начать. я нашел эта документация о методе, который:

Попытки зарегистрировать прокси-класс представления с указанным именем или указанной комбинацией класса элемента управления и типа элемента управления.

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

Но тогда возникает вопрос, ГДЕ я называю этот код?

Мой пользовательский элемент управления имеет метод в своем пространстве имен Register() который, я считаю, был автоматически сгенерирован IDE при создании элемента управления:

namespace Fmgridu
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TFmGrid)};
RegisterComponents(L"Kalos FM Controls", classes, 0);
}
}

Нужно ли что-то называть там, чтобы зарегистрировать потомка TStyledPresentationProxy? Как правильно это сделать?

2

Решение

Просто переопределите виртуальный метод DefinePresentationName в тебе TfmGrid и вернуть имя представления презентации для сетки:

function TfmGrid.DefinePresentationName: string;
begin
Result := 'Grid-' + GetPresentationSuffix;
end;

Fm регистрирует представление по строковому имени и использует для него имя класса, поэтому, если вы создаете новый компонент (на основе существующего), вы автоматически меняете имя класса, поэтому система не может найти презентацию для вас. Есть два решения:

  1. Сказал, что вы будете использовать презентацию из TGrid (DefinePresentationName)
  2. Зарегистрируйте существующую презентацию для своего класса (см. Раздел инициализации FMX.Grid.Style.pas)

Постскриптум Год назад я написал статью об этом вместе Новый подход к разработке элемента управления FireMonkey «Управление — Модель — Презентация». Часть 1 Я надеюсь, что это поможет вам

2

Другие решения

Других решений пока нет …