TStyledPresentationProxy 的后代尚未为类注册

Jam*_*gle 2 c++ firemonkey c++builder-10-seattle c++builder-10.1-berlin

TGrid我有一个继承自名为 的自定义网格控件TFmGrid。该控件在 Rad Studio 10 西雅图更新一中运行良好。TFmGrid我最近升级到 10.1 Berlin,并开始注意到当我运行应用程序和设计器时,我的控件上显示此错误消息:

尚未为类 TFmGrid 注册 TStyledPresentationProxy 的后代。也许有必要将 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);
    }
}  
Run Code Online (Sandbox Code Playgroud)

我需要在那里调用一些东西来注册 的后代吗TStyledPresentationProxy?解决这个问题的正确方法是什么?

Yar*_*vin 5

只需重写TfmGrid中的虚拟方法DefinePresentationName并返回网格的演示名称名称:

\n\n
function TfmGrid.DefinePresentationName: string;\nbegin\n  Result := \'Grid-\' + GetPresentationSuffix;\nend;\n
Run Code Online (Sandbox Code Playgroud)\n\n

Fm 通过字符串名称注册演示文稿并为其使用类名,因此,如果您创建新组件(基于现有组件),您会自动更改类名,因此系统无法为您找到演示文稿。有两种解决方案:

\n\n
    \n
  1. 表示您将使用 TGrid 中的演示文稿 (DefinePresentationName)
  2. \n
  3. 为您的类注册现有的演示文稿(查看 FMX.Grid.Style.pas 的初始化部分)
  4. \n
\n\n

PS 一年前,我在常见的FireMonkey 控件 \xe2\x80\x9cControl \xe2\x80\x93 Model \xe2\x80\x93Presentation\xe2\x80\x9d 开发新方法中写了一篇关于它的文章。第1部分希望对您有帮助

\n