簡體   English   中英

Delphi XE2:可以在VCL應用程序中實例化FireMonkey表單嗎?

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

在Delphi XE2之前,我們只使用VCL來創建GUI應用程序。 Delphi XE2聲明:

警告:FireMonkey(FMX)和可視組件庫(VCL)不兼容,不能在同一項目或應用程序中使用。 也就是說,應用程序必須只有一個或另一個,FireMonkey或VCL。 不兼容性是由FireMonkey(FMX)和VCL之間的框架差異引起的。

我的應用程序是一個使用運行時包構建的純VCL應用程序。 所有VCL表單都存儲在運行時包中。 如果我要創建一個FireMonkey表單並存儲在一個包中,我是否有機會在運行時在我的VCL應用程序中實例化這個FireMonkey表單? 所以我可能會喜歡FireMonkey的3D或HD效果。

這是完全可能的,因為可以將FMX表格分配給面板。

有關詳情,請參閱此博客文章

只需創建一個新的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;

要獲得更現代的方法,請嘗試使用TFireMonkeyContainer 它是一個開源的VCL組件,可以放在VCL表單上,它可以在其中托管/嵌入FireMonkey表單。

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

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

詳細信息: 介紹文章 ,以及一些錯誤修正和更多功能的后續內容 在此處找到Google代碼頁的鏈接和來源

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

免責聲明:這是我的組件。 (我創建它來解決這個問題。)它是MPL許可的,因此即使在商業應用程序中也可以自由使用。 希望它能幫助您,讓您的生活更輕松!

我沒有嘗試過,但我知道有一種確認的方法可以使用RemObjects Hydra在同一個應用程序中混合VCL和FireMonkey,還有一個未經證實的報告,你可以在Delphi Sorcery的VCL應用程序中使用FireMonkey表單。

實際上,使用兩種形式並不重要。 但請確保您在沒有任何所有者的情況下實例化它們,因為所有者類型不兼容。

我剛剛創建了兩個簡單的測試項目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;

這按預期工作。 但是,這些形式應該嚴格地彼此獨立。 只能交換它們共有的類型。

下載並安裝MonkeyMixer 加載VCL項目(​​或創建一個新項目),在Project Explorer中右鍵單擊它,然后你會看到“切換到FireMonkey”。 單擊它,您將能夠無縫地將FireMonkey表單添加到您的VCL項目中。 然后,您可以以相同的方式切換回VCL模式(如果要添加VCL表單/幀),除了菜單項將顯示“切換到VCL”。

請享用!

可以在WinAPI級別上解決FMX + VCL混合的所有問題。 但我個人不建議你在現實世界的應用程序中使用這種混合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM