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 := 真;
我尝试使用 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 := 真;