Instalar Rad Studio 10.4.1 sin problemas



 A continuación les voy a detallar los pasos que he seguido para configurar RAD Studio 10.4.1 en una máquina con Windows 10.

1) En mi caso tenía un PC sin sistema operativo por lo que lo primero que hay que hacer es instalar Windows 10.

Probé a instalarlo sobre una máquina virtual  que tenía en otro PC con Windows 8 utilizando VirtualBox, pero en un momento de la instalación se quedó colgado, repetí la instalación varias veces y no lo conseguí, por lo que me decidí a instalarlo en la partición C:

2)  Ir a "Configuración de Windows" y pulsar sobre "Actualización y seguridad"

En el menú "Windows Update", pulsar el botón "Buscar actualizaciones" e instalar todas las actualizaciones que irá encontrando, seguramente necesitará reiniciar varias veces el equipo.

3) Instalar "Microsoft Office 2016"

4) Ir al paso "2" para buscar más actualizaciones, hasta que aparezca el mensaje ¡Todo está actualizado!

5) Instalar Java.

Java está certificado para Windows 10 desde la versión Java 8 Update 51.

4) Instalar Rad Studio.


 Seleccioné Delphi Windows Enterprise y Delphi Android Enterprise

En la pestaña "Additonal Options" recordar que hay que marcar "AdoptOpenJDK".

En algunos foros he leído que no marcar AdoptOpenJDK puede dar problemas al instalar o al compilar las aplicaciones.


Se pulsa el botón "Apply" y se van aceptando las sucesivas pantallas que irán apareciendo, hasta terminar la instalación del programa.

Una vez que pude ejecutar por primera vez Rad Studio y compilar uno de los programas que había realizado, me daba errores la conexión con Firedac, se cerraba el programa inesperadamente o se bloqueaba, pues para solucionarlo simplemente hay que añadir en el uses de la unit donde se establezca la conexión con la base de datos lo siguiente:

FireDAC.Phys.SQLiteWrapper.Stat

 por ejemplo:

UNIT BaseDeDatos;

INTERFACE

USES
  System.SysUtils, System.UITypes,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls,
  FireDAC.Stan.Def, FireDAC.Stan.Async, FireDAC.Stan.ExprFuncs,
  FireDAC.Phys.SQLiteDef, FireDAC.UI.Intf,
  FireDAC.FMXUI.Wait, FireDAC.Stan.Intf, FireDAC.Stan.Option,
  FireDAC.Stan.Error, FireDAC.Phys.Intf, FireDAC.Stan.Pool,
  FireDAC.Phys, FireDAC.Phys.SQLite, FireDAC.Stan.Param, FireDAC.DatS,
  FireDAC.DApt.Intf, FireDAC.DApt, Data.DB,
  FireDAC.Comp.DataSet, FireDAC.Comp.Client, FireDAC.Comp.UI,
  FMX.Objects,
  FMX.ScrollBox, FMX.Memo, FMX.Effects, FMX.Layouts,  FireDAC.Phys.SQLiteWrapper.Stat,
  System.Classes, FMX.Memo.Types;


Con eso las operaciones de búsqueda o inserción de registros, transacciones, mantenimiento de la base de datos, compactación y verificación, funcionaban perfectamente.

Otro error que me daba era al intentar ejecutar una app para Android en un dispositivo Xiaomi, me aparecía el mensaje:

INSTALL_FAILED_USER_RESTRICTED

Intenté ejecutar la app en modo "Developpment" y en modo "Application Store" y no funcionaba.

Para arreglarlo hay que activar las "Opciones de desarrollador" y hacer lo siguiente:

Ir a 

Settings -> Additional Settings -> Developer options ->

    Desactivar"MIUI optimization" y reiniciar el móvil.

    Activar "USB Debugging"

    Activar "Install via USB"

 




y aplicado la anterior ya me funcionaban las apps perfectamente en el nuevo Rad Studio 10.4.1.

Otro truco, si las apps compiladas con versiones anteriores a la 10.4 dan errores, borren el archivo AndroidMainfest.template.xml que está en la carpeta principal de su app y vuelvan a compilarla, esto provoca que Delphi vuelva a reconstruir ese archivo adaptándolo a la última versión disponible.

Espero que les haya servido de algo y que por lo menos no pierdan el tiempo que he perdido yo en buscar las soluciones a los problemas anteriores.



Acción solidaria relacionada con Delphi y con Al González


 
Hace unos días vimos una publicación en Twitter de Al haciendo un llamamiento de apoyo, de ayuda.

Pues para eso hemos creado una formación Solidaria donde los beneficios irán destinados a ayudarle, recuerda, hoy por ti, mañana por mi.

El curso se llama:
"Curso de Delphi: Nociones importantes del Lenguaje, del compilador y la depuración de código"

¿QUÉ INCLUYE LA FORMACIÓN?
- 2 horas en directo con Al
- Impartirá nociones básicas sobre el lenguaje de programación, cosas que no sueles caer en tu día a día.
- Nociones sobre el compilador que quizás, como yo, hayas tocado pocas veces.
- Nociones sobre la depuración de código, siempre hay algunas perlas que no habíamos pensado en ellas.
- También podrás conversar directamente con el formador y el resto de asistentes, entre todos se enriquecerá muchísimo más la formación.
- Tendrás acceso al curso para poder volver a verlo las veces que quieras, quedará grabado. 
- Certificado del curso a tu nombre, para que puedas adjuntarlo a Linkedin, a tu hoja de vida etc. 
- Encuesta de satisfacción
- Descuento del 40% para los componentes TMS Web Core, tanto para Delphi como para Visual Studio Code

¿CUANTO CUESTA?
Esta formación podría costar perfectamente más de 150 euros, sólo el descuento de TMS Web Core se ahorra mucho más de este dinero, pero hemos puesto un precio muy asequible para todos al ser una acción solidaria y sólo te costará 15 €.

¿CUANDO ES EL CURSO?
El curso será el próximo Martes 15 de septiembre a las 16:00 hora Madrid/España . Si no puedes asistir no te preocupes, apúntate, ayúdanos y visualiza el vídeo posteriormente.

¿QUIEN IMPARTE EL CURSO?
Detrás el curso está nuestra empresa Abatic Soluciones Tecnológicas, empresa responsable del Podcast No Solo Delphi, del Podcast Pildoras PostgreSQL, de plataformas formativas como abatic.net, nosolodelphi.com, emiliopm.com y todopostgresql.com
Pero claro, como es una formación solidaria, el formador no forma parte de nuestra empresa, es freelance y los beneficios del curso irán destinados para él, se llama Al González y es el creador de componentes como GHFreebrary.

¿Donde puedo apuntarme?
Aquí te dejo el enlace para apuntarte al curso, te damos las gracias desde el equipo Abatic por ayudarnos en esta causa en la cual podemos caer todos y cada uno de nosotros.

Memory leaks en delphi


 

¿Qué es un memory leak?

Un memory leak ocurre cuando un bloque de la memoria del ordenador no se libera, debido a un fallo del programa que se está ejecutando en ese momento, es decir en un determinado momento del programa necesitamos reservar un conjunto de bytes para almacenar datos o para hacer un cálculo, cuando se termina la operación tendremos que liberar ese bloque de bytes para que lo pueda usar otro módulo de nuestro programa

¿Que ocurre si no se libera?

Si vamos reservando bytes sin liberarlos al final agotaremos la memoria disponible del PC hasta llegar un momento en el que se bloqueará.

Esto provoca que el resto de las aplicaciones se ejecuten más lentamente, ya que cada vez tienen menos memoria disponible, el PC irá más lento.

Esto causa que algunas aplicaciones no lleguen a abrirse ya que no disponen de la memoria suficiente para su correcto funcionamiento.

¿Que tipo de liberación de memoria existe?

Puede ser manual o automática.

Manual:

En Delphi lo hacemos con la instrucción  Free / FreeAndNil  / Destroy  / Release (seguramente se me olvida alguna instrucción ...)

Automática:

En algunos lenguajes como java se utiliza lo que es un "recolector de basura".

También se utiliza un "conteo de referencias" que va contando el número de referencias a la zona bloqueada y cuando llega a 0 libera la memoria. Esto tiene un problema y es que si las referencias forman un ciclo la memoria no se liberará nunca.

Ejemplos de buenas prácticas

//CODIFICACIÓN INCORRECTA (No se libera la variable fich)

procedure obtenerdatos;
var
fich:tstringlist;
lista:string;

begin

lista:='';

fich:=tstringlist.create;

        for i:=1 to fich.count-1 do
        begin
        lista:=lista+fich.strings[i];
        end;

end;


//CODIFICACIÓN CORRECTA (siempre se va a liberar la variable fich)

procedure obtenerdatos;
var
fich:tstringlist;
lista:string;

begin

lista:='';

fich:=tstringlist.create; //siempre antes del try
try

        for i:=1 to fich.count-1 do
        begin
        lista:=lista+fich.strings[i];
        end;

finally
  fich.free;
end;

En algunos casos en el evento OnClose del Form también puedes poner "fich.free", pero yo prefiero el método anterior.

Otro ejemplo podría suceder cuando cargamos una dll externa usando LoadLibrary. Siempre hay que llamar al final a FreeLibrary para liberar la memoria ocupada.

 var
   dllHandle: THandle;
begin
   dllHandle: = Loadlibrary ('MyLibrary.DLL');
   // hacer algo con esta DLL
   if dllHandle <> 0 then FreeLibrary (dllHandle);
final;

 

Cómo encontrar fugas de memoria en nuestros programas

Mediante la instrucción 
System.ReportMemoryLeaksOnShutdown: = True;

Poniendo esta variable a true, el administrador de memoria irá escaneando el programa a medida que se va ejecutando e informará al usuario cuando el programa termine de las pérdidas de memoria que haya encontrado.

De la siguiente forma:

begin
  Application.Initialize;
  Application.MainFormOnTaskbar: = True;
  Application.CreateForm (TForm1, Form1);
  System.ReportMemoryLeaksOnShutdown: = True;
  Application.Run;
final .

Programas que detectan fugas de memoria

FASTMM
FastMM es en realidad el administrador de memoria incluido con Delphi desde hace algunos años. Es una obra original de Pierre le Riche. Aunque se incluye con Delphi, puede descargar el código fuente completo de SourceForge en http://fastmm.sourceforge.net . Para aprovechar al máximo la función FastMM, debe abrir el archivo FastMM4Options.inc y cambiar alguna directiva de compilación condicional. Este archivo está muy comentado para explicar todos los símbolos. Al desarrollar su aplicación, debe definir los símbolos "EnableMemoryLeakReporting" y "FullDebugMode". 


Memcheck
MemCheck busca pérdidas de memoria, corrupción de memoria, uso de un objeto después de su destrucción, llamadas a métodos en referencias de interfaz que se refieren a un objeto destruido, etc. MemCheck es un programa gratuito, con código fuente.
http://cc.embarcadero.com/item/16059
 

MadExcept
madExcept fue creado para ayudar a localizar memory leaks en su aplicación Delphi. Siempre que haya un bloqueo / excepción en su programa, madExcept lo detectará, analizará, recopilará mucha información útil y le dará al usuario final la posibilidad de enviarle un informe de error completo.


Eurekalog
EurekaLog es la nueva herramienta complementaria que le da a su aplicación Delphi / C ++ Builder (GUI, Consola, Web, ...) el poder de detectar cada excepción, generando un registro detallado de la pila de llamadas (con unidad, clase, método y número de línea), mostrándolo y enviándolo de vuelta por correo electrónico o mensaje web (HTTP-S / FTP).

LeakCheck (gratis)
Delphi LeakCheck es otra gran opción para detectar fugas de memoria. También es gratuito, de código abierto y tiene algunas ventajas sobre FastMM: es multiplataforma , lo que significa que puede verificar fugas directamente en aplicaciones móviles y Linux; y se integra muy bien con los marcos de prueba unitarios (a saber, DUnit y DUnitX ).

La forma de comenzar es similar a FastMM : agregue la unidad LeakCheck como la primera unidad utilizada en su cláusula de usos de dpr, y se agregará y estará lista para usar. Sin embargo, la configuración para las pruebas unitarias es un poco más complicada, pero eso es parte del juego.

Una pequeña desventaja es que para usarlo estás casi solo: el proyecto no ha recibido actualizaciones por un tiempo (lo cual no es necesariamente malo ya que está funcionando). Pero eso significa que probablemente no obtendrá mucha ayuda directamente del autor (nunca lo intenté, para ser justos). Tampoco hay mucha información al respecto en la web , solo encontré un solo artículo que explica cómo usarlo además de la descripción detallada en el repositorio oficial de Bitbucket.

Pros

Gratis;
Código fuente completo;
Plataforma cruzada;
Se integra bien con las pruebas unitarias (DUnit y DUnitX).
Contras

No hay mucha información sobre cómo usarlo;
Sin actualizaciones recientes, sin soporte oficial;

Deleaker

Delaker es una aplicación comercial que se dedica exclusivamente a detectar fugas de memoria . Eso se refleja en el producto, que le proporciona características realmente interesantes para detectar fugas de memoria.

Tiene una interfaz gráfica de usuario amigable para que pueda configurar el entorno y ver los resultados, que se puede usar de forma independiente o integrada en Delphi IDE. También puede detectar muchos más tipos de fugas de memoria : fugas de GDI, fugas de objetos y identificadores de USUARIO de Windows, fugas en API de Windows, en DLL de terceros, etc. Exactamente por eso, proporciona opciones para que usted ignore fácilmente varios tipos de Fugas : si no lo hace, obtendrá una gran cantidad de fugas en una ejecución normal de la aplicación.

Otra característica interesante es la capacidad de tomar instantáneas de la asignación de memoria . Esto le permite detectar fugas no solo durante la vida útil de toda su aplicación, sino en algunas operaciones específicas de la misma.