Delphi XE2: possibilité d'instancier un formulaire FireMonkey dans une application VCL?

avant Delphi XE2, nous avons VCL uniquement pour créer des applications GUI. Delphi XE2 déclare que:

attention: FireMonkey (FMX) et la Visual Component Library (VCL) sont pas compatibles et ne peuvent pas être utilisés dans le même projet ou application. C'est, une demande doit être exclusivement l'un ou l' autres, soit FireMonkey, soit VCL. L'incompatibilité est causée par différences de cadre entre FireMonkey (FMX) et VCL.

mon application est une pure Application VCL qui a construit avec des paquets d'exécution. Tous les formulaires VCL sont stockés dans le paquet runtime. Si je dois créer un formulaire FireMonkey et le stocker dans un paquet, ai-je une chance d'instancier ce formulaire FireMonkey dans mon application VCL à l'exécution? Je peux donc apprécier les effets 3D ou HD de FireMonkey.

24
demandé sur Whiler 2011-09-06 08:46:09

6 réponses

c'est parfaitement possible, puisque la forme FMX peut être assignée à un panneau.

Voir cet article de blog pour plus de détails:

il suffit de créer une nouvelle forme FireMonkey (2D ou 3D, peu importe) puis ajoutez-le à votre application VCL (acceptez simplement l'avertissement). Vous peut créer votre instance de forme FMX quelque part et juste la montrer-Non problème. Mais que faire si vous voulez créer un contrôle agréable avec des animations ou quelque chose et les intégrer votre formulaire VCL existant? Eh bien, mettez un Tcpanel sur votre formulaire VCL et incluez la nouvelle unité brandnew DSharp.Windows.FMXAdapter.pas après la Vcl.ExtCtrls. Puis il suffit de créer votre formulaire FMX quelque part et l'attribuer à la nouvelle forme propriété de votre Panneau - et boom, il vous allez.

en fait, le FMXAdapter.pas de code est très court:

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;
25
répondu Arnaud Bouchez 2011-09-06 14:27:48

Pour une approche plus moderne, essayez TFireMonkeyContainer. C'est un composant VCL open-source que vous pouvez placer sur un formulaire VCL, et il peut héberger / intégrer un formulaire FireMonkey à l'intérieur.

A FMX form embedded in a VCL form using TFireMonkeyContainer

une forme FMX incorporée dans une forme VCL en utilisant TFireMonkeyContainer

plus de Détails ici: introduction article et suivi avec quelques corrections de bugs et plus de fonctionnalités. Trouver un lien pour le page Google Code et source ici.

il fonctionne avec XE2 et au-dessus, y compris XE4+ (où FMX a eu quelques grands changements.)

Avertissement: ceci est mon composant. (Je l'ai créé pour résoudre ce problème. Il est sous licence MPL et peut donc être utilisé librement, même dans les applications commerciales. J'espère que cela vous aidera et vous facilitera la vie!

6
répondu David M 2015-03-03 21:26:43

Je n'ai pas essayé moi-même mais je connais une façon confirmée de mélanger VCL et FireMonkey dans la même application en utilisant RemObjects Hydra et un rapport non confirmé que vous pouvez avoir des formulaires FireMonkey dans une application VCL à Delphi Sorcery.

3
répondu LachlanG 2011-09-06 05:13:32

C'est pas grand-chose en fait, pour utiliser les deux types de formes. Mais assurez-vous que vous instanciez sans propriétaire, le propriétaire ne sont pas compatibles.

je viens de créer deux projets de test simples, Project46 et Project47. Le projet46 contenait L'Unité 25 avec un formulaire VCL. Le projet 47 contenait L'Unité 26 avec un formulaire FMX. Sur le Formulaire25, j'ai ajouté un bouton, avec le handler OnClick:

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

Cela a fonctionné comme prévu. Toutefois, les formulaires doivent être strictement indépendants des mutuellement. Seuls les types qu'ils ont en commun peuvent être échangés.

3
répondu Rudy Velthuis 2011-09-06 12:16:01

Télécharger et installer MonkeyMixer. Chargez votre projet VCL (ou Créez-en un nouveau), faites un clic droit dessus dans L'Explorateur de projet, puis vous verrez "passer à FireMonkey". Cliquez sur cela et vous serez en mesure d'ajouter des formulaires FireMonkey de façon transparente à votre projet VCL. Vous pouvez ensuite revenir en mode VCL (si vous voulez ajouter des formes/cadres VCL) de la même manière, sauf que l'entrée du menu dira "passer en VCL".

Profitez-en!

1
répondu LaKraven 2015-03-11 14:07:18

tous les problèmes du mélange FMX+VCL peuvent être résolus au niveau WinAPI. Mais personnellement, je ne vous recommande pas d'utiliser un tel mélange dans l'application du monde réel.

0
répondu Torbins 2011-09-06 11:59:11