CEF4Delphi es un proyecto de código abierto creado por Salvador Díaz Fau para incluir navegadores basados en Chromium dentro de aplicaciones realizadas con Delphi o Lazarus/FPC para Windows, Linux y MacOS.
CEF4Delphi se basa en DCEF3 y fpCEF3 pero dichos proyectos usan ramas anticuadas de CEF. Para poder añadir pestañas de navegador web basadas en Chromium en BriskBard es necesario utilizar la última rama estable de CEF y disponer de actualizaciones con regularidad. Dado que esos proyectos ya no reciben actualizaciones se decidió crear un proyecto nuevo.
El objetivo principal de CEF4Delphi es simplificar en lo posible el trabajo necesario para adaptarlo a las nuevas versiones de CEF. Para ello fue necesario tomar las siguientes medidas :
La última versión de CEF4Delphi usa la rama 7049 de CEF. En concreto se usa la versión CEF 135.0.22 que incluye Chromium 135.0.7049.115
CEF4Delphi se ha desarrollado en Delphi 12.3 y también se ha probado en Delphi 6, Delphi XE, Delphi 10, Delphi 11 y Lazarus 3.8 con FPC 3.2.2. CEF4Delphi incluye componentes VCL, FireMonkey (FMX) y Lazarus de 32 y 64 bits.
Si desea probar CEF4Delphi puede descargar gratuitamente la última versión de Delphi Community Edition desde Embarcadero.
También es posible probar CEF4Delphi descargando gratuitamente Lazarus/FPC.
Antes de usar CEF4Delphi con una aplicación hecha con Delphi o Lazarus es necesario comprender que CEF4Delphi es una capa (wrapper) que usa la API C de CEF. A su vez, CEF aisla al usuario de las complejidades de Chromium y Blink.
La rama master del repositorio está considerada como una rama en desarrollo y puede tener errores. Use la última versión publicada si necesita un componente estable.
Proyecto CEF4Delphi :
Proyecto Chromium Embedded Framework (CEF) :
Archivos binarios de CEF usados por CEF4Delphi :
Proyecto OldCEF4Delphi :
Proyecto Chromium :
CEF4Delphi se puede usar en aplicaciones VCL, FMX y LCL con Delphi o Lazarus/FPC.
Lea esta página wiki para obtener más información sobre CEF4Delphi en Lazarus.
Google anunció en 2015 que Chrome no seguiría siendo compatible con Windows XP. La última rama de CEF compatible con Windows XP fue la rama 2623, publicada en 2016.
Google también anunció que Chromium no sería compatible con Windows 7, 8.0 y 8.1 en 2022. La última versión de CEF compatible con Windows 7 fue CEF 109 y esta es la última versión de CEF4Delphi compatible con Windows 7.
Dado que CEF4Delphi usa la rama más reciente de CEF, no es compatible con Windows 7, 8/8.1, XP, Windows Vista, Windows Server 2003, Windows Server 2008 y Windows Server 2012.
CEF4Delphi necesita Windows 10, 11 o posterior para funcionar pero si se desea probar alguna otra versión de Windows solo hay que descargar e intentar ejecutar la aplcación de ejemplo de CEF (Sample Application en inglés) desde la página de descargas del proyecto CEF.
Si necesita que su aplicación funcione en Windows XP o Vista use OldCEF4Delphi.
Linux está totalmente soportado por CEF4Delphi con Firemonkey y Lazarus/FPC en CPUs x86 y ARM.
En el caso de aplicaciones para Linux, CEF requiere tener instalado Ubuntu 16.04 o una versión posterior.
MacOS también está totalmente soportado por CEF4Delpi con Firemonkey y Lazarus/FPC en CPUs x86.
CEF4Delphi no se ha probado en MacOS con CPUs ARM. CEF requiere MacOS 10.11 o posterior para funcionar.
Para compilar e instalar CEF4Delphi en Delphi XE2, XE3, XE4, XE6, XE7, XE8, 10, 11 or 12 hay que seguir los siguientes pasos :
Para compilar e instalar CEF4Delphi en Delphi 6, 7, 8, 2005, 2006, 2007, 2009, 2010 o XE hay que seguir los siguientes pasos :
Para compilar e instalar CEF4Delphi en Lazarus hay que instalar el paquete DCPCrypt usando el Online Package Manager. Después hay que seguir los siguientes pasos :
Antes de seguir con más detalles vamos a compilar una de las demostraciones para ver como funciona un navegador CEF.
Construya esta demo dependiendo del IDE que use :
En unos segundos verá un nuevo ejecutable dentro del directorio CEF4Delphi/bin llamado MiniBrowser.exe o SimpleBrowser2.exe pero si intenta ejecutarlo verá un mensaje de error con una lista de archivos de CEF que no se pudieron encontrar.
Necesita copiar los archivos binarios de CEF en el directorio CEF4Delphi/bin que previamente tiene que descargar desde estos enlaces :
Una vez que ha descargado y descomprimido el paquete de archivos debe copiar el contenido de los directorios Release and Resources dentro del directorio CEF4Delphi/bin.
La disposición final es esta :
Fíjese que los archivos cef_sandbox.lib y libcef.lib se pueden omitir.
Si todo está en su lugar debería ser capaz de ejecutar la demo.
Construya esta demo dependiendo del IDE que use :
Si usa Lazarus verá un nuevo ejecutable llamado MiniBrowser dentro del directorio CEF4Delphi/bin pero si usa Delphi tendrá que copiar los ejecutables desde la ventana de Deployment para encontrarlos en un subdirectorio de paserver/scratch-dir/Username-ConnectionProfileName
.
De igual manera que las demos de Windows, es necesario descargar los arhivos binarios de CEF usando estos enlaces :
Descomprima el paquete correspondiente y copie el contenido de los directorios Release and Resources dentro del directorio CEF4Delphi/bin en caso de usar Lazarus.
Si usa Delphi descomprima el paquete correspondiente y copie el contenido de los directorios Release and Resources dentro del directorio $HOME/cef
. El ejecutable FMXExternalPumpBrowser2_sp que se encuentra dentro del directorio paserver/scratch-dir/Username-ConnectionProfileName/FMXExternalPumpBrowser2_sp/
también tiene que copiarse dentro de $HOME/cef
.
La disposición final es esta :
Fíjese que el archivo libcef.so es enorme porque contiene los símbolos de depurado. Al ejecutar la demo notará que tarda unos segundos debido al tamaño de libcef.so. Para acelerar este proceso y reducir su tamaño puede eliminar los símbolos de depurado con el siguiente comando :
strip libcef.so
Si los archivos binarios de CEF están en el lugar adecuado debería ser capaz de ejecutar la demo ahora.
Si usa Lazarus construya las demos Lazarus_Mac/ExternalPumpBrowser y Lazarus_any_OS/AppHelper.
En este momento debería ver 2 nuevas aplicaciones en el directorio CEF4Delphi/bin correspondientes a esas 2 demos.
Descargue el paquete de archivos binarios de CEF usando este enlace : MacOS x86 (64 bit)
Las aplicaciones de MacOS deben tener unos contenidos y una estructura de directorios muy precisa. En este caso debe descomprimir el paquete de archivos binarios de CEF y copiar los contenidos del directorio Release/Chromium Embedded Framework.framework dentro del directorio ExternalPumpBrowser.app/Contents/Frameworks/Chromium Embedded Framework.framework/
La aplicación AppHelper debe añadirse dentro de la aplicación ExternalPumpBrowser y para hacer eso es necesario ejecutar Lazarus_any_OS/AppHelper/create_mac_helper_apps.sh con la ruta completa de ExternalPumpBrowser.app como argumento.
La disposición final es esta :
ExternalPumpBrowser.app/
Contents/
Frameworks/
Chromium Embedded Framework.framework/
Chromium Embedded Framework
Libraries/
libEGL.dylib
libGLESv2.dylib
libswiftshader_libEGL.dylib
libswiftshader_libGLESv2.dylib
libvk_swiftshader.dylib
vk_swiftshader_icd.json
Resources/
chrome_100_percent.pak
chrome_200_percent.pak
resources.pak.pak
Info.plist
icudtl.dat
snapshot_blob.bin
v8_context_snapshot.x86_64.bin
en.lproj/
locale.pak
es.lproj/
locale.pak
****.lproj/
locale.pak
ExternalPumpBrowser Helper.app/
Contents/
Info.plist
MacOS/
ExternalPumpBrowser Helper
Pkginfo
ExternalPumpBrowser Helper (GPU).app/
Contents/
Info.plist
MacOS/
ExternalPumpBrowser Helper (GPU)
Pkginfo
ExternalPumpBrowser Helper (Plugin).app/
Contents/
Info.plist
MacOS/
ExternalPumpBrowser Helper (Plugin)
Pkginfo
ExternalPumpBrowser Helper (Renderer).app/
Contents/
Info.plist
MacOS/
ExternalPumpBrowser Helper (Renderer)
Pkginfo
ExternalPumpBrowser Helper (Alerts).app/
Contents/
Info.plist
MacOS/
ExternalPumpBrowser Helper (Alerts)
Pkginfo
Info.plist
MacOS/
ExternalPumpBrowser
Pkginfo
Resources/
binding.html, ...
Si los archivos binarios de CEF están correctamente copiados dentro de la aplicación ExternalPumpBrowser y create_mac_helper_apps.sh se ha ejecutado sin errores debería ser capaz de ejecutar ExternalPumpBrowser.
En caso de que use Delphi abra el archivo Delphi_FMX_Mac/FMXExternalPumpBrowser/FMXExternalPumpBrowserGroup.groupproj
, construya todos los proyectos de dicho grupo y use la ventana de Deployment de cada proyecto para copiar cada app bundle en el sistema remoto.
Descomprima el paquete de archivos binarios de CEF y copie los contenidos del directorio Release/Chromium Embedded Framework.framework dentro del directorio paserver/scratch-dir/Username-ConnectionProfileName/Chromium Embedded Framework.framework
.
Cuando ejecute el proyecto principal del grupo se copiaran automáticamente los archivos binarios de CEF y todos los app bundles correspondientes a los proyectos helper dentro del directorio FMXExternalPumpBrowser.app/Contents/Frameworks/
.
Antes de usar CEF4Delphi por primera vez es muy recomendable leer la información sobre CEF y los documentos sobre el diseño de Chromium.
La documentacion de la API de CEF está disponible en magpcss.org y hay muchísima información sobre el uso de CEF en los comentarios de su código fuente.
Como se puede ver en la documentación, por defecto CEF usa multiples hilos y procesos para proteger a la aplicación de posibles errores del motor de renderizado.
Con el proposito de crear esos procesos, CEF puede ejecutar de nuevo el mismo ejecutable de la aplicación o también se puede configurar para que use un ejecutable diferente.
Por defecto CEF usará el mismo ejecutable pero esto puede causar problemas si la aplicación tiene una inicialización compleja o el sistema operativo tiene otros requerimientos.
CEF4Delphi simplifica toda la inicialización de CEF gracias a GlobalCEFApp, el cual es una instancia de la clase TCEFApplication.
Las aplicationes de Windows pueden configurar CEF para usar un archivo EXE para todos los procesos o un EXE diferente para los subprocesos de CEF.
Si decide usar el mismo EXE para todos los procesos entonces necesita modificar el archivo del proyecto (*.DPR en Delphi y *.LPR en Lazarus) para crear GlobalCEFApp, asignar sus propiedades y llamar GlobalCEFApp.StartMainProcess antes que realizar la llamada a Application.Initialize.
Comencemos usando un proyecto de Delphi ya que los archivos de proyecto en Lazarus son casi idénticos.
Las aplicaciones de Delphi suelen tener este código en el archivo DPR :
program Project1;
uses
Vcl.Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Para incluir CEF4Delphi necesitaría modificarlo de esta manera :
program Project1;
uses
Vcl.Forms,
WinApi.Windows,
uCEFApplication,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}
begin
GlobalCEFApp := TCefApplication.Create;
if GlobalCEFApp.StartMainProcess then
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end;
GlobalCEFApp.Free;
end.
Las diferencias son :
usestiene una referencia a uCEFApplication.
Applicationse inicialice y ejecute.
El proceso principal ejecutará el código del archivo de proyecto siguiendo estos pasos :
initializationde todas las unidades declaradas en la clausula
uses.
Applicationse inicialice y ejecute.
finalizationde todas las unidades declaradas en la clausula
uses.
Sin embargo, los subprocesos de CEF ejecutarán el código del archivo de proyecto siguiendo estos pasos :
initializationde todas las unidades declaradas en la clausula
uses.
Application.
finalizationde todas las unidades declaradas en la clausula
uses.
Si está añadiendo un navegador CEF a una aplicación ya existente necesita decidir si se puede usar el mismo EXE o hay que usar otro diferente para los subprocesos de CEF para lo que será necesario comprobar el código presente en el archivo de proyecto de la aplicación y en las secciones de initialization
y finalization
porque se ejecutarán en todos los procesos de CEF.
Si no es posible sacar todo el código de las secciones de initialization
y finalization
, y mover el código del archivo de proyecto es demasiado complicado o no está permitido entonces puede uasr un EXE diferente para los subprocesos de CEF.
En ese caso puede crear GlobalCEFApp en cualquier momento de la vida de su aplicación.
Usar un archivo EXE diferente le permite inicializar CEF solo cuando el usuario necesita ver un navegador web pero recuerde que CEF solo se puede inicializar una vez por proceso. Esta es una caraterística de CEF que no se puede evitar.
Eche un vistazo a estas demostraciones para conocer todos los detalles :
Usar CEF4Delphi en Linux tiene pocas diferencias con Windows y se puede reutilizar casi todo el código. Lea las instrucciones para Windows antes de leer esta sección.
Las demos de Lazarus deben añadir UseCthreads
a las opciones personalizadas dentro de la ventana de las opciones del proyecto.
Todas las demostraciones de Lazarus usan GTK 2 mientras que la de Delphi usa GTK 3. QT no está soportado por el momento.
Chromium debería inicializarse en un proceso con un solo hilo y esto puede causar problemas algunas veces porque GTK crea algunos hilos cuando se inicializa.
Lazarus inicializa GTK en la sección de Initialization
de la unidad Interfaces
y Delphi inicializa GTK en la sección de Initialization
de la unidad FMX.Platform
.
Las secciones de Initialization
se ejecutan antes que el código del archivo de proyecto y esto puede generar problemas con CEF.
Las demos de Lazarus pueden evitar este problema de dos maneras :
Interfacespersonalizada que saque la inicialización de GTK de la sección de
Initialization.
Initializationy añadirla a la clausula de
usesantes que la unidad de
Interfaces.
Las demos de Delphi usan FMXLinux y necesita crear una unidad personalizada que cree GlobalCEFApp en su sección de Initialization
y añadirla a la clausula uses
en primera posición.
Eche un vistazo a estas demostraciones para obtener más detalles :
Las aplicaciones de MacOS con navegadores CEF deben incluir 5 paquetes de aplicaciones asistentes (Helper app bundles) para los subprocesos. Chromium los busca internamente cuando necesita crear un nuevo subproceso. Lea esto para más información.
Los 4 Helper deben estar en el directorio <nombredelaaplicacion>.app/Contents/Frameworks
con estos nombres :
Los 5 Helper son copias identicas con un nombre diferente y solo necesitan crear GlobalCEFApp, llamar GlobalCEFApp.InitLibLocationFromArgs y GlobalCEFApp.StartSubProcess, y por último destruir GlobalCEFApp.
Lea los comentarios en el código de la siguientes demostraciones para saber más detalles :
CEF se puede configurar para crear navegadores web con diferentes modos de funcionamiento :
normalo
en ventana: CEF creará un control hijo para dibujar los contenidos web por si mismo y muchas otras características y eventos también los controla CEF intérnamente.
renderizado fuera de pantallau
OSRusando las siglas en inglés : CEF ofrecerá un buffer de píxeles con los contenidos web. La aplicación será la responsable de dibujar el contenido del buffer en un control y también gestionará todos los eventos.
El modo normal requiere mucho menos código y es mucho más rápido que el modo OSR pero el modo OSR ofrece a la aplicación un control mucho mayor sobre del navegador.
Puede comparar estos dos modos con las demos SimpleBrowser2 y SimpleOSRBrowser.
Otra de las configuraciones de CEF que merece la pena mencionar es el uso del bucle de mensajes multi-hilo
.
Por defecto, CEF tiene esta opción activada y usará un hilo de fondo para ejecutar el bucle de mensajes del navegador para mejorar el rendimiento. Como consecuencia de ello, todos los eventos de CEF se ejecutan en un hilo de CEF que es diferente del hilo principal de la aplicación.
No es seguro manipular los controles de Windows y Linux en hilos que no sean el principal de la aplicación y debe evitar crear, destruir o modificar controles dentro de los eventos de CEF si está configurado para usar el bucle de mensajes multi-hilo.
Algunas demostraciones ignoran esto porque están simplificadas al máximo con el propósito de mantener el código tan simple y fácil de entender como sea posible, pero debería mover todo el código que manipula el interfaz de usuario a un procedimiento que se ejecute en el hilo principal de la aplicación.
Si se configura CEF para desactivar el bucle de mensajes multi-hilo entonces todos los eventos de CEF se ejecutan en el hilo principal de la aplicación pero el rendimiento del navegador no es tan bueno.
Los navegadores CEF en MacOS siempre tienen que tener desactivado el bucle de mensajes multi-hilo.
Puede comparar el código de las demostraciones SimpleBrowser2 y ExternalPumpBrowser para conocer todos las diferencias de implementación cuando se activa o no esta opción.
CEF4Delphi incluye muchas clases y componentes VCL, FMX y LCL para añadir un navegador web con todas las configuraciones de CEF posibles.
La principal clase usada para simplificar la inicialización y destrucción de CEF es TCEFApplication y la mayor parte de las demostraciones crean GlobalCEFApp
como una instancia de TCEFApplication.
La demostración SubProcess
es una excepción a esta regla para evitar problemas con MS Office y usa TCEFApplicationCore en su lugar.
TCEFApplication crea automáticamente algunos handlers de CEF únicamente si se necesitan. Esos handlers son CefApp, CefBrowserProcessHandler, CefRenderProcessHandler, CefResourceBundleHandler y CefLoadHandler.
Lea esto para obtener más información sobre esta clase.
Este es el componente que reune todos los procedimientos, funciones, propiedades y eventos del navegador en un solo lugar. Tiene todo lo necesario para crear, modificar y destruir un navegador web.
Las aplicaciones VCL y LCL usan TChromium pero las aplicaciones FireMonkey usan TFMXChromium. Ambos componentes heredan de TChromiumCore, el cual tiene la mayor parte del código pero verá referencias a TChromium en el foro por simplificar.
TChromiumCore también crea muchos handlers de CEF en caso de que se necesiten, como CefClient, CefResourceRequestHandler, etc.
Lea esto para obtener más información sobre este componente.
El componente TCEFWindowParent se usa en aplicaciones VCL y LCL junto al componente TChromium para empotrar un navegador web en modo normal.
Tal como se comentó anteriormente, los navegadores en modo normal permiten que CEF cree algunos controles hijo nativos para mostrar los contenidos web en ellos. TCEFWindowParent hereda de TCEFWinControl y se usa como padre de dichos controles. TCEFWindowParent también controla el tamaño de esos controles automáticamente. Vea la demostración SimpleBrowser2 para conocer más detalles.
TFMXWindowParent es un componente FireMonkey con el mismo uso que TCEFWindowParent pero debido a la estructura del código de FMX hereda de TCommonCustomForm.
TFMXWindowParent se usa junto a TFMXChromium y se debe crear en tiempo de ejecución. Vea la demostración SimpleFMXBrowser para conocer los detalles.
Este componente se puede usar en aplicaciones VCL y LCL. Tiene el mismo uso que TCEFWindowParent pero incluye una propiedad Chromium para enlazarlo directamente con un componente TChromium.
TCEFLinkedWindowParent cambia el tamaño de los controles creados por CEF en navegadores en modo normal y asigna el foco usando el componente que se ha enlazado.
TCEFWindowParent y TCEFLinkedWindowParent funcionan correctamente en Windows y se pueden usar indistintamente pero en Linux o MacOS no se puede usar TCEFWindowParent.
TBufferPanel se usa en aplicaciones VCL y LCL con navegadores en modo OSR para dibujar los contenidos web. TFMXBufferPanel tiene el mismo propósito per se usa en aplicaciones FireMonkey.
Vea la demostración SimpleOSRBrowser para obtener más detalles.
TCEFWorkScheduler se usa en aplicaciones VCL y LCL con navegadores CEF que han desactivado el bucle de mensajes multi-hilo. TFMXWorkScheduler tiene el mismo propósito pero se usa en aplicaciones FireMonkey.
Estos componentes gestionan las llamadas a GlobalCEFApp.DoMessageLoopWork usando el parámetro delayMs del evento GlobalCEFApp.OnScheduleMessagePumpWork.
Las aplicaciones VCL y LCL deben crear GlobalCEFWorkScheduler como una instancia de TCEFWorkScheduler antes de crear GlobalCEFApp.
Las aplicaciones FMX deben crear GlobalFMXWorkScheduler como una instancia de TFMXWorkScheduler antes de crear GlobalCEFApp.
También es necesario destruir GlobalCEFApp antes de destruir GlobalCEFWorkScheduler o GlobalFMXWorkScheduler.
Vea las demostraciones ExternalPumpBrowser y FMXExternalPumpBrowser para saber más detalles sobre su uso.
TChromiumWindow se creó para añadir navegadores web extremádamente simples de una manera un poco más sencilla que usando una pareja de TChromium y TCEFWindowParent.
TChromiumWindow se puede usar en aplicaciones VCL y LCL con navegadores en modo normal pero si se usan muchos eventos o procedimientos de TChromium deberí sopesar usar los otros componentes.
Vea la demostración SimpleBrowser para saber más detalles.
TBrowserWindow es un componente LCL que simplifica la creación de aplicaciones multi-plataforma con navegadores web en modo normal. TOSRBrowserWindow tiene el mismo propósito pero usa navegadores en modo OSR.
Si utiliza el mismo código fuente para contruir con Lazarus las versiones de Windows, Linux y MacOS de su aplicación entonces se recomienda usar estos componentes.
TBrowserWindow y TOSRBrowserWindow fueron creados por Martin_fr, también conocido como User4martin. Martin_fr es uno de los administradores del proyecto Lazarus.
Todas las demostraciones del directorio Lazarus_any_OS muestran como usar estos componentes.
TCEFServerComponent le permite crear un pequeño servidor HTTP y WebSocket en aplicaciones VCL, LCL y FMX.
Se puede usar para implementar un sistema de comunicación entre procesos (IPC) que comunique una aplicación con un servidor local.
Vea la demostración SimpleServer para saber como usarlo.
TCEFUrlRequestClientComponent le permite realizar peticiones URL sin relación con ningún navegador desde una aplicación VCL, LCL o FMX.
Vea la demostración URLRequest para saber más detalles sobre su funcionamiento.
TCEFSentinel se usa como un temporizador que comprueba el número de procesos CEF en ejecución cuando se cierran todos los navegadores antes de cerrar la aplicación totalmente.
Este componente solo se usa como último recurso cuando hay algún problema sin resolver en CEF o CEF4Delphi que genera excepciones cuando se cierra la aplicación.
Todos los componentes de la pestaña Chromium Views Framework
permiten usar artilugios (widgets) y gestores de disposición (layout managers) de Views/Aura en aplicaciones VCL y LCL.
CEF usa este mismo framework de interfaz de usuario internamente en Windows, Linux y MacOS para crear navegadores.
Vea la demostración ToolBoxBrowser2 y lea este documento para conocer más detalles sobre estos componentes.
Cuando se deja GlobalCEFApp con los valores por defecto CEF tiene activado el bucle de mensajes multi-hilo y se inicializa en un hilo de fondo tras la llamada a GlobalCEFApp.StartMainProcess.
Los navegadores de CEF solo pueden crearse cuando la inicialización de CEF se ha completado y esto puede causar una condición de carrera si la aplicación intenta crear un navegador cuando la ventana principal de la aplicación se muestra por primera vez.
Casi todas las demostraciones usan un simple TTimer para reintentar la llamada a TChromium.CreateBrowser tras unos pocos milisegundos pero también es posible usar el evento TCEFApplication.OnGlobalContextInitialized para enviar un mensaje a la ventana principal con el fin de crear el navegador web.
Las aplicaciones de Lazarus que usan los componentes TBrowserWindow o TOSRBrowserWindow gestionan todo esto automáticamente.
Chromium requiere que todos los navegadores se la aplicación se cierren correctamente antes de destruir GlobalCEFApp, lo cual sucede en las últimas lineas del archivo del proyecto.
Los navegadores CEF deben seguir estos pasos para cerrarlos apropiadamente :
Cada demostración tiene una secuencia de destrucción en los comentarios del código porque cada configuración del navegador puede añadir u omitir algún paso pero en general, la aplicación debería esperar hasta que todos los eventos TChromium.OnBeforeClose se han ejecutado antes de proseguir cerrando la aplicación.
Lea los comentarios del código de la demostración que usó como plantilla para su aplicación para saber todos los detalles.
FireMonkey es una interfaz de usuario gráfica muy poderosa capaz de crear aplicaciones para Windows, MacOS, Linux, iOS y Android con el mismo código pero esa capa de abstracción puede dificultar un poco las cosas porque CEF necesita acceso a algunas características de APIs de nivel más bajo.
Por ejemplo, algunas demostraciones de Windows usan una clase personalizada que implementa el interfaz IFMXApplicationService para acceder a los mensajes de Windows. Otras demostraciones usan un procedimiento WndProc personalizado por la misma razón. La demo de MacOS usa una clase personalizada que implementa el interfaz IFMXApplicationService para implementar CrAppProtocol porque Chromium lo requiere.
Si necesita añadir un navegador CEF con CEF4Delphi en una aplicación FireMonkey tiene que añadir el codicional $(FrameworkType) en las opciones del proyecto.
Para hacer esto abra el menú Project
y haga clic en Options...
. Después seleccione la opción Building→Delphi Compiler
en la parte izquierda, seleccione All configurations
en la casilla de Target
y teclee $(FrameworkType) en la casilla de Conditional defines
.
También puede usar FMX
sin las comillas en lugar de $(FrameworkType) si el condicional no funciona en ese proyecto.
El directorio CEF4Delphi\demos tiene varios subdirectorios con demostraciones para Delphi y Lazarus :
windowdel
frame.
window.
windowdel
frame.
window.
Para probar las demostraciones de Windows y Linux siga estos pasos :
Para probar las demostraciones de MacOS siga las instrucciones dadas en la sección de MacOS de Construyendo la primera demo
.
El uso de múltiples procesos puede dificultar la depuración en Delphi pero en esos casos se pueden usar las siguientes herramientas :
Debido a problemas de licencias y a la ley de patentes de EE.UU., los archivos de CEF disponibles en Spotify tienen desactivados los codecs privativos. Si usa esos archivos, los sitios web que ofrezcan multimedia usando H264 no funcionarán.
En el caso de que necesite usar esos codecs puede compilar usted mismo los archivos de CEF siguiendo las instrucciones de este hilo del foro.
Para compilar los archivos de CEF es necesario usar un PC de gran rendimiento. Puede llevar varias horas incluso con una cpu Intel I7 con 16GB de RAM. Se recomienda tener 32GB de RAM y usar una unidad de almacenamiento SSD.
Lea los artículos 'Quick Start', 'Branches And Building' y 'Automated Build Setup' en las páginas Wiki de CEF antes de intentar compilarlos.
Las fuentes de CEF usadas para la compilaci$ón deben tener exactamente la misma versió:n soportada por CEF4Delphi en ese momento.
Una versión reducida de la guía para compilar CEF está disponible en este hilo del foro.
El complemento PPAPI de Adobe Flash ya no está soportado.
Google no soporta complementos NPAPI desde la versión 45 de Chromium, publicada en septiembre de 2015. Solo las ramas anteriores a 2454 de CEF soportan complementos NPAPI para Java, Silverlight o Facebook video.
Las extensiones del navegador que no requieran el interfaz de usuario de Chrome como la barra de direcciones, iconos, etc. puede que fuincionen. Las extensiones de navegador solo están soportadas con ventanas del estilo Chrome que muestren parcialmente el interfaz de Chrome como por ejemplo la barra de direcciones.
CEF4Delphi es solo un numerónimo y se debería interpretar como CEF for Delphi, es decir CEF para Delphi en español. No significa que esté basado en CEF4.
Si desea ayudar en este proyecto puede realizar una donación pulsando el siguiente botón :
También puede usar Patreon para ayudar a este proyecto :
O patrocinar este proyecto en GitHub :
O patrocinar este proyecto en Liberapay :
También puede ayudar dando a conocer este proyecto a sus amistades, compartiendo los mensajes de este proyecto en las redes sociales, escribiendo artículos sobre este proyecto en su página web, haciendo sugerencias, informando sobre errores, etc.
Si realiza compras en Internet también puede ayudar usando estos enlaces para sus compras :
Declaración de divulgación: Este sitio y BriskBard contienen enlaces de afiliado y eso quiere decir que yo puedo recibir una comisión si usted realiza una compra usando esos enlaces. Como socio de eBay obtengo una comisión con dichas compras.
Artículo actualizado el 25 de abril de 2025.