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

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

Потомок TStyledPresentationProxy не зарегистрирован для класса TFmGrid. Возможно стоит добавить модуль FMX.Grid.Style в раздел uses

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

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

Я начал с того, что сделал, как предлагает сообщение, и добавил #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? Каков правильный способ сделать это?


person James Hogle    schedule 17.05.2016    source источник


Ответы (2)


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

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

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

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

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

person Yaroslav Brovin    schedule 20.05.2016

Это просто: просто поместите компонент StyleBook в свою форму.

person AliReza    schedule 14.09.2020