español - delphi starter limitations
Delphi XE2: ¿posible instanciar un formulario FireMonkey en la aplicación VCL? (6)
Antes de Delphi XE2, tenemos VCL solo para crear aplicaciones GUI. Delphi XE2 establece que:
Precaución: FireMonkey (FMX) y la Biblioteca de componentes visuales (VCL) no son compatibles y no se pueden usar en el mismo proyecto o aplicación. Es decir, una aplicación debe ser exclusivamente una u otra, ya sea FireMonkey o VCL. La incompatibilidad es causada por diferencias de marco entre FireMonkey (FMX) y VCL.
Mi aplicación es una aplicación VCL pura que se creó con paquetes de tiempo de ejecución. Todos los formularios VCL se almacenan en el paquete de tiempo de ejecución. Si voy a crear un formulario FireMonkey y almacenarlo en un paquete, ¿tengo alguna posibilidad de crear una instancia de este formulario FireMonkey en mi aplicación VCL en tiempo de ejecución? Entonces puedo disfrutar los efectos 3D o HD de FireMonkey.
Descargue e instale MonkeyMixer . Cargue su proyecto VCL (o cree uno nuevo), haga clic derecho sobre él en el Explorador de proyectos, luego verá "Cambiar a FireMonkey". Haga clic en eso y podrá agregar formularios FireMonkey sin problemas a su proyecto VCL. Luego puede volver al modo VCL (si desea agregar Formularios / Marcos VCL) de la misma manera, excepto que la entrada del menú dirá "Cambiar a VCL".
¡Disfrutar!
En realidad, no es un gran problema usar ambos tipos de formas. Pero asegúrese de crear instancias sin ningún propietario, ya que los tipos de propietarios no son compatibles.
Acabo de crear dos proyectos de prueba simples, Project46 y Project47. Project46 contenía Unit25 con un formulario VCL. El Proyecto 47 contenía la Unidad 26 con un formulario FMX. En Form25, agregué un botón, con el controlador OnClick:
procedure TForm25.Button1Click(Sender: TObject);
var
F: Unit26.TForm26;
begin
F := TForm26.Create(nil);
try
F.ShowModal;
finally
F.Free;
end;
end;
Esto funcionó como se esperaba. Pero los formularios deberían ser estrictamente independientes el uno del otro. Solo se pueden intercambiar los tipos que tienen en común.
Esto es perfectamente posible, ya que el formulario FMX se puede asignar a un panel.
Ver este artículo de blog para más detalles:
Simplemente cree una nueva forma de FireMonkey (2D o 3D, no importa) guárdela y luego agréguela a su aplicación VCL (solo acepte la advertencia). Puede crear su instancia de formulario FMX en algún lugar y solo mostrarlo, no hay problema. Pero, ¿y si quieres crear un buen control con animaciones o algo así e integrarlo en tu formulario VCL existente? Bueno, pon un TPanel en tu formulario de VCL e incluye la DSharp.Windows.FMXAdapter.pas unidad DSharp.Windows.FMXAdapter.pas después de Vcl.ExtCtrls. Luego, simplemente crea tu formulario FMX en algún lugar y asígnalo a la nueva propiedad de Formulario de tu Panel, y boom, ahí lo tienes.
De hecho, el código FMXAdapter.pas es muy corto:
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;
No me he probado, pero conozco una forma confirmada de mezclar VCL y FireMonkey en la misma aplicación utilizando RemObjects Hydra y un informe no confirmado de que puede tener formularios FireMonkey en una aplicación VCL en Delphi Sorcery .
Para un enfoque más moderno, pruebe TFireMonkeyContainer
. Es un componente VCL de código abierto que puede colocar en un formulario VCL, y puede alojar / incrustar un formulario FireMonkey dentro de él.
Un formulario FMX incrustado en un formulario VCL utilizando TFireMonkeyContainer
Detalles aquí: artículo de introducción y seguimiento con algunas correcciones de errores y más características . Encuentre aquí un enlace a la TFireMonkeyContainer .
Funciona con XE2 y superior, incluido XE4 + (donde FMX tuvo algunos cambios importantes).
Descargo de responsabilidad: este es mi componente. (Lo creé para resolver este problema). Tiene licencia MPL, por lo que se puede usar libremente incluso en aplicaciones comerciales. ¡Espero que te ayude y te haga la vida más fácil!
Todos los problemas de la mezcla FMX + VCL se pueden resolver en el nivel de WinAPI. Pero personalmente, no te recomiendo usar esa mezcla en la aplicación real.