FireMonkey 组件执行错误

FireMonkey Component Execution Error

我尝试使用 FireMonkey 平台 (XE7) 创建一个非常简单的组件 (Tgraph)。首先,我创建两个新的 类: 1)TGraph(锚点类型TLayout); 2) TMyPlot1D(anchestor 类型 Tpanel); 我保存了两个单元并创建了一个名为 'MyPackage' 的包。我在 "Samples" 页面编译并安装了它。我打开了一个新的 Firemonkey 项目并将 TGraph 实例拖放到表单中。一切正常。在设计时,我可以看到定义的组件,并且所有相关单元都可以从主单元中看到。相关代码如下:

第一个Class

unit UMyPlot;

interface

 uses
 System.SysUtils, System.Classes, FMX.Types, 
 FMX.Controls, FMX.StdCtrls;

 type
 TMyPlot1D = class(TPanel)
 private
  { Private declarations }
 protected
  { Protected declarations }
 public
  { Public declarations }
 published
  { Published declarations }
 end;

 procedure Register;

 implementation

 procedure Register;
 begin
  RegisterComponents('Samples', [TMyPlot1D]);
 end;

 end.

第二个Class

unit UMyGraph;

interface

uses
 System.SysUtils, System.Classes, FMX.Types, FMX.Controls, FMX.Layouts,      
 UMyPlot;

type
  TMyGraph = class(TLayout)
  private
    Plot : TmyPlot1D;
  public
    constructor create(Aowner:TComponent); override;
  end;

 procedure Register;

implementation

 procedure Register;
  begin
   RegisterComponents('Samples', [TMyGraph]);
  end;

 constructor TMyGraph.create(Aowner: TComponent);
  begin
   inherited;
   Plot := TMyPlot1D.Create(Self);
   plot.Parent := Self;
 end;

 end.

当我尝试 运行 我的应用程序时出现问题。 我收到以下错误: "Exception EClassNotFound in module Project1.exe at 000A51FA. Class TmyPlot1D not Found"。失败的功能似乎是 Application.RealCreateForms.

如果我只拖放 TmyPlot1D 实例,它(当然)在设计时和 运行 时都有效!

有什么想法吗?

提前致谢

在您的 TMyGraph.Create 中,您正在创建一个子对象 Plot。此行为在设计时和 运行 时都会发生。

在 运行 时没有问题,但问题出现了,因为当您保存设计时表单时,组件的子组件也被流式传输到 FMX 文件。

当您 运行 您的应用程序时,它会流式传输表单并尝试流式传输 TMyGraph 和在设计时创建的 TMyPlot1D 子对象,但失败了。即使它成功了,您也会遇到问题,因为您将同时拥有在设计时创建的 TMyPlot1D 和在 运行 时间创建的 TMyPlot1D。

您可以通过为您在设计时创建的任何子项设置 Stored := False 来解决此问题,因此您的 Create 方法将如下所示:

constructor TMyGraph.Create(Aowner: TComponent);
begin
  inherited;
  Plot := TMyPlot1D.Create(Self);
  Plot.Parent := Self;
  Plot.Stored := False;
end;

现在我们来了解一下classif 无法被流媒体系统读取的原因。在 FMX 中,您需要调用 RegisterFMX类(类 单元)以启用 class 流式传输到表单中。您需要将其放在单元末尾的初始化部分(在最终结束之前),例如:

initialization
  RegisterFMXClasses([TMYGraph]);
end.

这条命令非常重要:

Tcomponent.Stored := 真;