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

在Delphi XE2之前,我们只有VCL才能创建GUI应用程序。 Delphi XE2规定:

Caution: FireMonkey (FMX) and the Visual Component Library (VCL) are
not compatible and cannot be used in the same project or
application. That is,an application must be exclusively one or the
other,either FireMonkey or VCL. The incompatibility is caused by
framework differences between FireMonkey (FMX) and VCL.

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

解决方法

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

详见this blog article

Just create a new FireMonkey form (2D or 3D,doesn’t matter) save it
and then add it to your VCL application (just accept the warning). You
can create your FMX form instance somewhere and just show it – no
problem. But what if you want to create some nice control with
animations or something and embed it into your existing VCL form?
Well,put a TPanel on your VCL form and include the brandnew unit
07001 after the Vcl.ExtCtrls. Then just create
your FMX form somewhere and assign it to the new Form property of your
Panel – and boom,there you go.

其实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;

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...