简体   繁体   中英

Delphi XE2: Possible to instantiate a FireMonkey Form in VCL application?

Prior to Delphi XE2, we have VCL only to create GUI apps. Delphi XE2 states that:

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.

My application is a pure VCL application that is built with runtime packages. All VCL forms are stored in a runtime package. If I am going to create a FireMonkey form and store in a package, do I have any chance to instantiate this FireMonkey form in my VCL application at runtime? So I may enjoy the 3D or HD effects of FireMonkey.

This is perfectly possible, since the FMX form can be assigned to a panel.

See this blog article for details:

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 DSharp.Windows.FMXAdapter.pas 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.

In fact, the FMXAdapter.pas code is very short:

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;

For a more modern approach try TFireMonkeyContainer . It's an open-source VCL component you can place on a VCL form, and it can host / embed a FireMonkey form inside it.

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

A FMX form embedded in a VCL form using TFireMonkeyContainer

Details here: introduction article , and followup with some bugfixes and more features . Find a link to the Google Code page and source here .

It works with XE2 and above, including XE4+ (where FMX had some large changes.)

Disclaimer: this is my component. (I created it to solve this very problem.) It's MPL-licensed so can be freely used even in commercial apps. Hope it helps you and makes your life easier!

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

It is no big deal actually, to use both kinds of forms. But be sure that you instantiate them without any owner, as the owner types are not compatible.

I just created two simple test projects, Project46 and Project47. Project46 contained Unit25 with a VCL Form. Project 47 contained Unit26 with an FMX form. On Form25, I added a button, with the OnClick handler:

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

This worked as expected. But the forms should otherwise be strictly indepedent of each other. Only types they have in common can be exchanged.

Download and install MonkeyMixer . Load up your VCL project (or create a new one), right-click on it in the Project Explorer, then you'll see either "Switch to FireMonkey". Click that and you'll be able to add FireMonkey forms seamlessly to your VCL project. You can then switch back to VCL mode (if you want to add VCL Forms/Frames) the same way, except the menu entry will say "Switch to VCL".

Enjoy!

All problems of the FMX+VCL mix can be resolved on the WinAPI level. But personally I don't recommend you to use such mix in the real world application.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM