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

问题描述 投票:24回答:6

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

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

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

delphi vcl delphi-xe2 firemonkey
6个回答
25
投票

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

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

只需创建一个新的FireMonkey表单(2D或3D,无所谓)保存,然后将其添加到您的VCL应用程序(只需接受警告)。您可以在某处创建FMX表单实例并显示它 - 没问题。但是如果你想用动画或其他东西创建一些不错的控件并将其嵌入到现有的VCL表单中呢?好吧,在你的VCL表格上放一个TPanel,并在Vcl.ExtCtrls之后加入全新的单位DSharp.Windows.FMXAdapter.pas。然后只需在某处创建您的FMX表单并将其分配给Panel的新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;

6
投票

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

使用TFireMonkeyContainer以VCL格式嵌入的FMX表单

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

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

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


3
投票

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


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;

这按预期工作。但是,表格应该严格地相互独立。只能交换它们共有的类型。


1
投票

下载并安装MonkeyMixer。加载VCL项目(​​或创建一个新项目),在Project Explorer中右键单击它,然后你会看到“切换到FireMonkey”。单击它,您将能够无缝地将FireMonkey表单添加到您的VCL项目中。然后,您可以以相同的方式切换回VCL模式(如果要添加VCL表单/帧),除了菜单项将显示“切换到VCL”。

请享用!


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.