25

Delphi XE2 より前は、GUI アプリを作成するための VCL しかありませんでした。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 フォームを作成し、それを 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;
于 2011-09-06T14:27:48.727 に答える
6

より現代的なアプローチについては、 を試してくださいTFireMonkeyContainer。これは、VCL フォームに配置できるオープンソースの VCL コンポーネントであり、その中に FireMonkey フォームをホスト/埋め込むことができます。

TFireMonkeyContainer を使用して VCL フォームに埋め込まれた FMX フォーム

TFireMonkeyContainer を使用して VCL フォームに埋め込まれた FMX フォーム

詳細はこちら:紹介記事、およびいくつかのバグ修正とその他の機能のフォローアップ. Google Code ページとソースへのリンクは、こちら にあります。

XE4+ を含む XE2 以降で動作します (FMX にはいくつかの大きな変更がありました)。

免責事項: これは私のコンポーネントです。(まさにこの問題を解決するために作成しました。) MPL ライセンスなので、商用アプリでも自由に使用できます。それがあなたを助け、あなたの人生を楽にしてくれることを願っています!

于 2013-12-27T21:57:38.867 に答える
3

両方の種類のフォームを使用することは、実際には大したことではありません。ただし、所有者の型には互換性がないため、所有者なしでそれらをインスタンス化するようにしてください。

Project46 と Project47 という 2 つの簡単なテスト プロジェクトを作成しました。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 に答える
3

私自身は試したことはありませんが、RemObjects Hydraを使用して同じアプリケーションで VCL と FireMonkey を混在させる確認済みの方法と、 Delphi Sorceryの VCL アプリケーションで FireMonkey フォームを使用できるという未確認のレポートを 1 つ知っています。

于 2011-09-06T05:13:32.790 に答える
0

FMX+VCL ミックスのすべての問題は、WinAPI レベルで解決できます。しかし、個人的には、このような組み合わせを実際のアプリケーションで使用することはお勧めしません。

于 2011-09-06T11:59:11.693 に答える