25

在 Delphi XE2 之前,我们只有 VCL 来创建 GUI 应用程序。Delphi XE2 指出:

注意:FireMonkey (FMX) 和 Visual Component Library (VCL) 不兼容,不能在同一个项目或应用程序中使用。也就是说,应用程序必须是 FireMonkey 或 VCL 中的一个或另一个。不兼容是由 FireMonkey (FMX) 和 VCL 之间的框架差异引起的。

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

4

6 回答 6

25

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

有关详细信息,请参阅此博客文章

只需创建一个新的 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;
于 2011-09-06T14:27:48.727 回答
6

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

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

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

此处的详细信息:介绍文章,以及一些错误修复和更多功能的跟进。在此处找到指向Google 代码页面和来源的链接。

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

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

于 2013-12-27T21:57:38.867 回答
3

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

于 2011-09-06T05:13:32.790 回答
3

两种形式都使用其实没什么大不了的。但请确保在没有任何所有者的情况下实例化它们,因为所有者类型不兼容。

我刚刚创建了两个简单的测试项目,Project46 和 Project47。Project46 包含带有 VCL 表单的 Unit25。项目 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;

这按预期工作。但是这些表格应该彼此严格独立。只有它们共有的类型可以交换。

于 2011-09-06T12:16:01.560 回答
1

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

享受!

于 2013-04-29T22:33:01.293 回答
0

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

于 2011-09-06T11:59:11.693 回答