Delphi XE2:可以在VCL应用程序中实例化FireMonkey表单吗?

时间:2011-09-06 04:46:09

标签: delphi vcl delphi-xe2 firemonkey

在Delphi XE2之前,我们只使用VCL来创建GUI应用程序。 Delphi XE2声明:

  

警告:FireMonkey(FMX)和可视组件库(VCL)是   不兼容,不能在同一个项目中使用或   应用。也就是说,申请必须是一个或一个   另外,FireMonkey或VCL。不兼容性是由   FireMonkey(FMX)和VCL之间的框架差异。

我的应用程序是一个使用运行时包构建的纯VCL应用程序。所有VCL表单都存储在运行时包中。如果我要创建一个FireMonkey表单并存储在一个包中,我是否有机会在运行时在我的VCL应用程序中实例化这个FireMonkey表单?所以我可能会喜欢FireMonkey的3D或HD效果。

6 个答案:

答案 0 :(得分:25)

这是完全可能的,因为可以将FMX表格分配给面板。

有关详细信息,请参阅this blog article

  

只需创建一个新的FireMonkey表单(2D或3D,无关紧要)保存即可   然后将其添加到您的VCL应用程序(只需接受警告)。您   可以在某处创建你的FMX表单实例并只显示它 - 不   问题。但是,如果你想创建一些很好的控件怎么办?   动画或其他内容并将其嵌入您现有的VCL表单中?   好吧,在你的VCL表格上放一个TPanel并加入全新的单位   在Vcl.ExtCtrls之后DSharp.Windows.FMXAdapter.pas。然后创建   您的FMX表单在某处并将其分配给您的新的Form属性   面板 - 和繁荣,你去。

事实上,FMXAdapter.pas代码很短:

procedure TPanel.Resize;
begin
  inherited;
  ResizeForm();
end;

procedure TPanel.ResizeForm;
begin
  if Assigned(FForm) then
    Platform.SetWindowRect(FForm, RectF(BorderWidth, BorderWidth,
      ClientWidth + BorderWidth, ClientHeight + BorderWidth));
end;

procedure TPanel.SetForm(const AForm: TCommonCustomForm);
begin
  FForm := AForm;  
  FForm.BorderIcons := [];
  FForm.BorderStyle := TFmxFormBorderStyle.bsNone;
  ResizeForm();
  FForm.Visible := True;
  Winapi.Windows.SetParent(FmxHandleToHWND(FForm.Handle), Handle);
end;

答案 1 :(得分:6)

对于更现代的方法,请尝试TFireMonkeyContainer。它是一个开源的VCL组件,可以放在VCL表单上,它可以在其中托管/嵌入FireMonkey表单。

A FMX form embedded in a VCL form using TFireMonkeyContainer

使用TFireMonkeyContainer嵌入VCL表单的FMX表单

此处的详细信息:introduction articlefollowup with some bugfixes and more features。找到Google Code page and source here的链接。

适用于XE2及以上版本,包括XE4 +(其中FMX有一些大的变化。)

  

免责声明:这是我的组件。 (我创造它来解决这个问题   问题。)它是MPL许可的,因此即使在商业应用程序中也可以自由使用。希望它能帮助你,让你的生活更轻松!

答案 2 :(得分:3)

我没有尝试过,但我知道有一种确认方法可以使用RemObjects Hydra在同一个应用程序中混合使用VCL和FireMonkey,还有一个未经证实的报告,您可以在{{3}的VCL应用程序中使用FireMonkey表单}。

答案 3 :(得分:3)

实际上,使用两种形式并不重要。但请确保您在没有任何所有者的情况下实例化它们,因为所有者类型不兼容。

我刚刚创建了两个简单的测试项目,Project46和Project47。 Project46包含第25单元,其中包含VCL表格。项目47包含具有FMX形式的Unit26。在Form25上,我添加了一个按钮,其中包含OnClick处理程序:

procedure TForm25.Button1Click(Sender: TObject);
var
  F: Unit26.TForm26;
begin
  F := TForm26.Create(nil);
  try
    F.ShowModal;
  finally
    F.Free;
  end;
end;

这按预期工作。但是,这些形式应该严格地彼此独立。只能交换它们共有的类型。

答案 4 :(得分:1)

下载并安装MonkeyMixer。加载您的VCL项目(​​或创建一个新项目),在Project Explorer中右键单击它,然后您将看到"切换到FireMonkey"。单击该按钮,您就可以将FireMonkey表单无缝添加到您的VCL项目中。然后您可以以相同的方式切换回VCL模式(如果您想要添加VCL表格/框架),除了菜单条目将说“"切换到VCL"。

享受!

答案 5 :(得分:0)

可以在WinAPI级别解决FMX + VCL混音的所有问题。但我个人不建议你在现实世界的应用程序中使用这种混合。