CodeRage XII comienza la semana que viene

CodeRage XII

La semana que viene comienza la Conferencia online favorita de los desarrolladores Delphi: CODERAGE XII, si no te has apuntado ¿a qué esperas?, el registro es gratuito.


Desde el 5 al 7 de Noviembre podrás aprender de los mejores.
Desde luego es una oportunidad única para profundizar en tus conocimientos, ampliar tu visión, mejorar tu técnica como programador, etc.

Estarán entre otros:

  • Robert C. “Uncle Bob” Martin, autor de "Clean Code: A Handbook of Agile Software Craftsmanship"
  • Steven McConnell, autor de “Code Complete”, hablará sobre “Managing Technical Debt”. 
  • Marco Cantu, autor de  "the Mastering Delphi series", hará una  “Introducción a ExtJS para Delphi“
  • Ray Konopka, autor de “Developing Custom Delphi Components”, compartirá sus trucos sobre "Productividad del IDE“
  • Cary Jensen, autor de “Delphi in Depth: FireDAC”, hablará sobre "FIREDAC en profundidad: Creando y usando índices.
Estas son las sesiones ya programadas:

  • [Watch] On-Demand - Working with TlistView - raouf rahiche
  • [Watch] On-Demand - Some code to start building C++ applications - Francisco Muro A.
  • [Watch] On-Demand - Using templates in IntraWeb - Alexandre Machado
  • [Watch] On-Demand - OpenAPI/Swagger: Document and Test your REST API Server - Wagner Landgraf
  • [Watch] On-Demand - Deep Dive: Hospitality Survey App Template Developer Guide - Eli M
  • [Watch] On-Demand - How to develop a simple recommender system - Daniele Spinetti
  • [Watch] On-Demand - All you need know to developer for Windows 10 - Ricardo Boaro
  • [Watch] On-Demand - CAD with RAD, master your OOP skills for multi-plat development - Vsevolod Leonov (Seva)
  • [Watch] On-Demand - Free SSL certificates with Let's Encrypt - Wagner Landgraf
  • [Watch] On-Demand - Customising DataSnap Method Output - Bob Swart
  • [Watch] Tue Nov 7th at 6:00 AM CT - Integrating with Amazon DynamoDB using Delphi Enterprise CDATA Connector - Paweł Głowacki
  • [Watch] Tue Nov 7th at 7:00 AM CT - The Clean Coder - Robert C. "Uncle Bob" Martin
  • [Watch] Tue Nov 7th at 9:00 AM CT - InterBase 2017 ToGo Cross-Platform Development and Deployment - Al Mannarino
  • [Watch] Tue Nov 7th at 9:00 AM CT - Product Address - Sarina DuPont
  • [Watch] Tue Nov 7th at 10:00 AM CT - Storing Data in Amazon S3 with Delphi - Paweł Głowacki
  • [Watch] Tue Nov 7th at 10:00 AM CT - Zen and the Art of Software Extensibility - Bob Calco
  • [Watch] Tue Nov 7th at 11:00 AM CT - Introduction to Ext JS for Delphi Developers - Marco Cantu
  • [Watch] Tue Nov 7th at 12:00 PM CT - VCL Layout Techniques - Ray Konopka
  • [Watch] Tue Nov 7th at 12:00 PM CT - Migrating your C++Builder Projects to Unicode - Al Mannarino
  • [Watch] Tue Nov 7th at 1:00 PM CT - IDE Productivity Tips and Tricks - Ray Konopka
  • [Watch] Tue Nov 7th at 1:00 PM CT - Accessing AWS S3 platform from C++ Builder - Luca Zoller
  • [Watch] Tue Nov 7th at 2:00 PM CT - FMX Animations - Ray Konopka
  • [Watch] Tue Nov 7th at 2:00 PM CT - C++ Builder as a REST server, easy way to comunicate with Apps and SCB's - Dion Mai
  • [Watch] Tue Nov 7th at 3:00 PM CT - Directly Using the Android API - Brian Long
  • [Watch] Tue Nov 7th at 3:00 PM CT - InterBase 2017 Update - Sriram Balasubramanian
  • [Watch] Tue Nov 7th at 4:00 PM CT - FireDAC in Depth: Creating and Using Indexes - Cary Jensen
  • [Watch] Tue Nov 7th at 4:00 PM CT - Docker 101: Introduction to Docker - Jenny Fong, Docker
  • [Watch] Tue Nov 7th at 5:00 PM CT - Preventing and Fixing Coupled Code - Cary Jensen
  • [Watch] Tue Nov 7th at 5:00 PM CT - Matlab/Scilab scripting engine - Janez Makovsek
  • [Watch] Wed Nov 8th at 6:00 AM CT - FmxLinux - FireMonkey for Linux - Eugene Kryukov and Vsevolod Leonov (Seva)
  • [Watch] Wed Nov 8th at 6:00 AM CT - Simplify and speed-up application development with ORM for Delphi - Devart
  • [Watch] Wed Nov 8th at 7:00 AM CT - Creating JSON Wrapper Classes in Delphi - Andrew Sovtsov
  • [Watch] Wed Nov 8th at 7:00 AM CT - Programming Mazes in C++ and Delphi - David Millington
  • [Watch] Wed Nov 8th at 8:00 AM CT - CrossVcl (VCL for Linux and osX) Review - Eugene Kryukov and Vsevolod Leonov (Seva)
  • [Watch] Wed Nov 8th at 8:00 AM CT - Introducing FMXRTL-bringing Right To Left to FireMonkey - Ruhollah Akbarzadeh
  • [Watch] Wed Nov 8th at 9:00 AM CT - TMS Business Showcase: REST Server and ORM (XData and Aurelius) - Wagner Landgraf
  • [Watch] Wed Nov 8th at 9:00 AM CT - Getting Started with Linux using Ubuntu 16.10 , Installing Packages, and Connecting to Servers - Tom Lawrence, Lawrence Systems / PC Pickup
  • [Watch] Wed Nov 8th at 10:00 AM CT - Using PDF Forms as Data Entry User Interfaces in your Delphi Applications - Girish Patil
  • [Watch] Wed Nov 8th at 10:00 AM CT - Bash on Ubuntu on Windows - Kevin Remde
  • [Watch] Wed Nov 8th at 11:00 AM CT - Building mobile apps that connects to Salesforce and SAP/R3 - Fernando Rizzato
  • [Watch] Wed Nov 8th at 11:00 AM CT - Panel: Artificial Intelligence (Davos) - Moderated by Robert F. Smith
  • [Watch] Wed Nov 8th at 12:00 PM CT - Introduction to Sencha Products - Ext JS, Tools, Test, ExtReact, GXT - Sandeep Adwankar
  • [Watch] Wed Nov 8th at 12:00 PM CT - Managing Technical Debt - Steve McConnell
  • [Watch] Wed Nov 8th at 1:00 PM CT - Introduction to Linux Command Line - Steven Gordon
  • [Watch] Wed Nov 8th at 2:00 PM CT - Create SCADA Modbus Industrial Control applications, and Devices with ControlLab, and Visuino Pro - Boian Mitov
  • [Watch] Wed Nov 8th at 3:00 PM CT - Developing Your Own Visuino Components with Delphi - Boian Mitov
  • [Watch] Wed Nov 8th at 4:00 PM CT - Embedding a Chromium browser in a Delphi application - Alex Ruiz
  • [Watch] Wed Nov 8th at 4:00 PM CT - Learning Linux multitasking at the command-line - Tutorials and Training
  • [Watch] Wed Nov 8th at 5:00 PM CT - Integrating the Google Places API into a Delphi application - Alex Ruiz
  • [Watch] Wed Nov 8th at 5:00 PM CT - Create a Business Intelligence (BI) Web Site RAD Style with FireDAC, IntraWeb and UniGUI - Miguel Angel Moreno
  • [Watch] Thu Nov 9th at 6:00 AM CT - Delphi Application Migration  - Al Mannarino
  • [Watch] Thu Nov 9th at 7:00 AM CT - Modernizing your VCL application - Danny Wind
  • [Watch] Thu Nov 9th at 7:00 AM CT - IntraWeb 17 - The Webolution Begins - Chad Hower
  • [Watch] Thu Nov 9th at 8:00 AM CT - CrossTalk - Connecting Delphi and C++ to .NET - Chad Hower
  • [Watch] Thu Nov 9th at 8:00 AM CT - Implementing 2-Step Authentication - Nirav Kaku
  • [Watch] Thu Nov 9th at 9:00 AM CT - Demystifying OOP with RAD Studio and ORMBr - Juliomar Marchetti
  • [Watch] Thu Nov 9th at 9:00 AM CT - Unit Testing and User Interface - Ruhollah Akbarzadeh
  • [Watch] Thu Nov 9th at 10:00 AM CT - FixInsight: Finding Bugs with Static Code Analysis - Roman Yankovsky
  • [Watch] Thu Nov 9th at 10:00 AM CT - GitHub and Git Foundations - GitHub
  • [Watch] Thu Nov 9th at 11:00 AM CT - The Delphi Parser - Automatic Migration Tool - Oren Aviram
  • [Watch] Thu Nov 9th at 11:00 AM CT - Docker for Windows and Windows Containers - Michael Friis and Elton Stoneman, Docker
  • [Watch] Thu Nov 9th at 12:00 PM CT - New feature of Delphi's reporting with FastReport VCL 6 - Denis
  • [Watch] Thu Nov 9th at 12:00 PM CT - Panel: The Internet of Things Is Here (Davos) - Moderated by Robert F. Smith
  • [Watch] Thu Nov 9th at 1:00 PM CT - Single Sign-On and Two-Factor Authentication with Facebook and Google Authenticator - Olaf Monien
  • [Watch] Thu Nov 9th at 1:00 PM CT - Multi-thread CFD example in C++ Builder - Yilmaz Yoru
  • [Watch] Thu Nov 9th at 2:00 PM CT - Plurals, Genders and Abbreviated Numbers with Delphi - Jaakko Salmenius
  • [Watch] Thu Nov 9th at 2:00 PM CT - Microservices with RAD Server - Andrew Sovtsov
  • [Watch] Thu Nov 9th at 3:00 PM CT - C++ and Physics - Mary Kelly
  • [Watch] Thu Nov 9th at 3:00 PM CT - Design Consideration for Multi-Platform Applications - Sarina DuPont
  • [Watch] Thu Nov 9th at 4:00 PM CT - Fast and Furious IDE Tips and Tricks - Alister Christie
  • [Watch] Thu Nov 9th at 4:00 PM CT - InterBase Tips and Tricks - Mary Kelly
  • [Watch] Thu Nov 9th at 5:00 PM CT - Working with Linux Libraries in Delphi - Craig Chapman
  • [Watch] Thu Nov 9th at 5:00 PM CT - Understanding the BlockChain - Jim McKeeth
  • [Watch] Thu Nov 9th at 6:00 PM CT - OpenGL on Linux - Craig Chapman

Ejemplos de rutinas gráficas con Firemonkey

A continuación veremos ejemplos de código de algunas de las rutinas gráficas que incorpora Firemonkey:

Partimos de un componente TImage, lo primero que hago es establecer el tamaño del bitmap:

  Imagen1.bitmap.SetSize(Round(510), Round(510));
  Imagen1.bitmap.Clear(tAlphacolors.White);
 creo unas variables definidas de la siguiente forma:
VAR
  DstRect,SourceRect: TRectF;
  punto,p1,p2: TPointF;
  Opacidad, x, y: Double;

y quiero hacer lo siguiente:

- Dibujar un círculo de color sólido (con opacidad = 0.2) en la posición X, Y y con un borde de color rojo de 10 puntos de ancho
  

punto := TPointF.Create(x - 50, y - 50);

  //100 es el ancho y el alto
  DstRect := TRectF.Create(punto, 100, 100);

  Imagen1.bitmap.Canvas.BeginScene;
  Imagen1.bitmap.Canvas.fill.color := tAlphacolors.blue;

//Definimos el borde de la elipse (color y anchura)
  Imagen1.bitmap.Canvas.Stroke.Kind := TBrushKind.Solid;
  Imagen1.bitmap.Canvas.Stroke.color := tAlphacolors.black;
  Imagen1.bitmap.Canvas.StrokeThickness := 10;

//0.2 es la opacidad
//si es igual a 1: opacidad total
//si es igual a 0: la elipse es totalmente transparente
  Imagen1.bitmap.Canvas.FillEllipse(DstRect, 0.2);
  Imagen1.bitmap.Canvas.DrawEllipse(DstRect, 0.2);
  Imagen1.bitmap.Canvas.EndScene;

Resultado:

- Copiar imagen2 sobre imagen1 en la posición X,Y
  
  punto := TPointF.Create(x, y);
  DstRect := TRectF.Create(punto, imagen2.width, imagen2.height);
  SourceRect := Imagen2.bitmap.BoundsF;
  Imagen1.bitmap.Canvas.BeginScene;
  Imagen1.bitmap.Canvas.DrawBitmap(Imagen2.bitmap, SourceRect, DstRect, 1, false);
  Imagen1.bitmap.Canvas.EndScene;





- Dibujar un arco con un ancho de linea de 5 puntos de color rojo
  // Define el centro del arco
  p1 := TPointF.Create(x, y);
  // Define el radio del arco
  p2 := TPointF.Create(100, 100);
  Imagen1.Bitmap.Canvas.BeginScene;
  // establece el ancho y el color de la línea
  Imagen1.Bitmap.Canvas.fill.color := tAlphacolors.blue;
  Imagen1.Bitmap.Canvas.Stroke.Kind := TBrushKind.Solid;
  Imagen1.Bitmap.Canvas.Stroke.color := tAlphacolors.Red;
  Imagen1.Bitmap.Canvas.StrokeThickness := 5;
  Imagen1.Bitmap.Canvas.DrawArc(p1, p2, 90, 330, 20);
  Imagen1.Bitmap.Canvas.EndScene;

Resultado:
- Crear un thumbnail de 20x20 de una imagen 
var
  MyBitmap: TBitmap;
begin
  // Carga la imagen
  if OpenDialog1.Execute then
    MyBitmap := TBitmap.CreateFromFile(OpenDialog1.Files[0]);
  // Dibuja el bitmap
  Imagen1.Bitmap :=  MyBitmap.CreateThumbnail(20,20);

- Dibujar un rectángulo con diferentes tipos de bordes ( en este caso he seleccionadoTCornerType.InnerRound )
  MyRect := TRectF.Create(50, 40, 200, 270);
  Imagen1.Bitmap.Canvas.BeginScene;
  Imagen1.Bitmap.Canvas.Stroke.Kind := TBrushKind.Solid;
  Imagen1.Bitmap.Canvas.Stroke.color := tAlphacolors.Red;
  Imagen1.Bitmap.Canvas.StrokeThickness := 5;
  Imagen1.Bitmap.Canvas.DrawRectSides(MyRect, 40, 10, AllCorners, 30, AllSides, TCornerType.InnerRound);
  Imagen1.Bitmap.Canvas.EndScene;

Resultado:

- Dibujar una línea:
  p1 := TPointF.Create(0, 510);
  p2 := TPointF.Create(510, 0);
  Imagen1.Bitmap.Canvas.BeginScene;
  Imagen1.Bitmap.Canvas.Stroke.Kind := TBrushKind.Solid;
  Imagen1.Bitmap.Canvas.Stroke.color := tAlphacolors.Red;
  Imagen1.Bitmap.Canvas.StrokeThickness := 5;
  Imagen1.Bitmap.Canvas.DrawLine(p1, p2, 1);
  Imagen1.Bitmap.Canvas.EndScene;

Resultado:


- Dibujar un rectángulo con bordes redondeados:
  MyRect := TRectF.Create(50, 40, 200, 270);
  Imagen1.Bitmap.Canvas.BeginScene;
  Imagen1.Bitmap.Canvas.Stroke.Kind := TBrushKind.Solid;
  Imagen1.Bitmap.Canvas.Stroke.color := tAlphacolors.Red;
  Imagen1.Bitmap.Canvas.StrokeThickness := 5;
  Imagen1.Bitmap.Canvas.DrawRect(MyRect, 30, 60, AllCorners, 100);
  Imagen1.Bitmap.Canvas.EndScene;

Resultado:





Listar sesiones web activas con uniGUI

Hoy veremos cómo podemos obtener información sobre las sesiones activas de las aplicaciones web desarrolladas con el framework uniGUI.
Para los que no conozcan uniGUI, diríamos que quizás es la plataforma más avanzada del mercado para el desarrollo de aplicaciones web.
Utiliza la librería javascript Sencha Ext JS junto a toda la potencia de Delphi y permite crear, depurar y diseñar desde el IDE del Delphi  módulos ISAPI (dll) para Internet Information Server, Servicios Windows, o Servidores independientes (Standalone) y se puede utilizar desde Delphi 2006 hasta Delphi 10.2 Tokyo.
El que el código javascript se encapsule en componentes Delphi, no implica que no podamos inyectar nuestro propio código, ya que uniGUI dispone de funciones que nos permiten hacerlo, también dispone de módulos para hacer pruebas de stress para probar el funcionamiento de nuestra aplicación web en entornos de máxima concurrencia.
Soporta los principales navegadores del mercado desde IE9+, MIcrosoft Edge, Firefox, Chrome, Safari y Opera.
Tienen más información desde su página web.
Antes de iniciar la explicación supongo que han instalado uniGUI en su entorno Delphi favorito (les recomiendo el siguiente post de Emilio Pérez)
Volviendo al asunto de este artículo, vamos a ver cómo mostrar las sesiones activas cuando se ejecuta una aplicación web realizada con uniGUI.

- Abrimos Delphi y vamos a File-New-Other

-
Seleccionamos UniGUI for Delphi - Application Wizard y pulsamos OK
y en la siguiente pantalla

marcamos la opción "Standalone Server" y pulsamos OK
Si todo ha ido bien, habremos creado en la vista del proyecto tres units:
Main.pas, MainModule.pas, ServerController.pas

- Ahora tenemos que añadir componentes e insertar código.

Desde la unit Main.pas:

Añadimos dos componentes tuniButton y tuniListBox, y cambiamos las siguientes propiedades:
uniButton1.caption = 'Listar sesiones'
uniButton.Align = alTop
UniListBox1.Align = alClient
Nos quedará de la siguiente forma:


Ahora pasamos a insertar el código para el evento onclic del uniButton, que nos permita obtener información de las sesiones activas (id de sesión, ip, hora de último acceso y variable) que los guardaremos en una estructura tipo record llamada TInfoSesionesRec.

Para acceder a estos datos tenemos que hacerlo mediante el método SessionManager del ServerModule.

VAR
 S : TUniGUISessions;
...
  S := UniServerModule.SessionManager.Sessions;

Lo siguiente es fácil, hacemos un bucle y en cada vuelta leemos los datos de la sesión. Hay que tener en cuenta que estos datos se están actualizando constantemente por lo que tendremos que bloquear el acceso utilizando los métodos Lock / unLock y además este bloqueo tendrá que ser lo más corto posible:

...
type
  TInfoSesionesRec = record
    SesionID : string;
    IP : string;
    Variable : string;
    LastTime: TDateTime;
  end;
...
public
    ListaDeSesiones : array of TInfoSesionesRec;
end;
...

procedure TMainForm.UniButton1Click(Sender: TObject);
var
  S : TUniGUISessions;
  U : TUniGUISession;
  I : Integer;
begin
  S := UniServerModule.SessionManager.Sessions;
  S.Lock; //la utilización de Lock debe ser lo más corta posible
  try
    SetLength(ListaDeSesiones, S.SessionList.Count);
    UniListBox1.Clear;
    //Recorremos las sesiones activas
    for I := 0 to S.SessionList.Count - 1  do
    begin
      U := S.SessionList[I];
      ListaDeSesiones[I].SesionID := U.SessionId;
      ListaDeSesiones[I].IP := U.RemoteIP;
      ListaDeSesiones[I].LastTime := U.LastTimeStamp;
      if U.UniMainModule <> nil then // Comprobamos si el MainModule está activo
        ListaDeSesiones[I].Variable := (U.UniMainModule as TUniMainModule).MiString;
        WITH ListaDeSesiones[I] DO
          BEGIN
            UniListBox1.items.add(U.SessionID + ' # ' + U.RemoteIP + ' # ' + DateTimeToSTr(U.LastTimeStamp));
          END;
    end;
  finally
    S.Unlock; // liberamos el lock
  end;
end;

Recordar que hay que añadir en el USES la unit uniGUISessionManager y en el MainModule en el apartado PUBLIC la variable  MiString
Ahora sólo queda ir al menú RUN para compilar e iniciar nuestra aplicación web y si todo es correcto veremos en la esquina inferior derecha el siguiente icono
Lo pulsamos con el botón derecho del ratón y accedemos al menú RESTORE
A continuación abrimos nuestro navegador y y tecleamos en la url
localhost:8077
Para hacer pruebas he generado 3 pestañas y en todas ellas he puesto en la URL localhost:8077
con lo que al pulsar el botón "listar sesiones" de la aplicación nos aparecerán 3 líneas. 
vemos la siguiente imagen:

Cada línea corresponde a una de las 3 sesiones abiertas y para cada una de ellas nos muestra la cookie de sesión, la ip, y la hora en la que ha accedido.

Recordar que tendremos que ir al menú Shutdown del icono que está en la esquina inferior derecha de la pantalla para cerrar y en su caso volver a compilar una nueva versión de la aplicación.

Si no lo hacemos así tendremos un error (bind socket already use)

Espero que os haya sido útil, en próximos artículos veremos más utilidades de este framework.




Por qué elegí Delphi


Caja de la versión Delphi 1.0

Yo empecé en el mundo de la programación, creo que como todos los de mi generación, con Visual Basic, era el lenguaje que usábamos para hacer nuestros primeros programas, más tarde cuando llegué a la Universidad ya empecé con Delphi (Turbo Pascal),  C++, Assembler, etc... recuerdo en la materia de Algoritmos y Estructura de Datos como el profesor asociaba el pseudo-código de los diferentes algoritmos con las funciones y procedimientos de Delphi, parecía todo muy natural como si Delphi hubiese nacido a propósito para que los alumnos entendiésemos esa materia.
Más tarde en mi trabajo ya tuve que entrar en el mundo de la Web, HTML, Javascript, PHP, y aunque fue un gran cambio, no dejé de trabajar con Delphi.

Estos son algunos de los programas que he desarrollado:

Delphi para Windows:

-Software para gestión de Fundaciones.
-Software para gestión de Asociaciones.
-Generación y envío de recibos formato SEPA.
-Kinect (aplicaciones varias)
-Arduino - BasicX.
-Inteligencia Artificial con FANN aplicada al análisis del precio de las acciones.
-Bots de compra venta automática de acciones.
-Software de Videovigilancia.
-Creación de escenarios en 3D.
-Software para jugar al ajedrez.
-Servidor de correo POP3.
-Gestión de envío / recepción de mensajes SMS.
-Gestión de centralita telefónica (llamadas entrantes, salientes, cómputo).
-Gestión de redes (análisis de tráfico - sniffer - utilización de Whois)

Delphi para la Web:

-Software de Horarios para Centros Educativos.
-Generación de informes Tutoriales en Centros Educativos
-Software para concertar citas de entrevistas Alumno - tutor.
-Gestión de accesos con tarjetas RFID
-Software para Bibliotecas Escolares.
-Gestión del email vía web.
-Gestión de currículos.
-Gestión de servicio médico.

Delphi para dispositivos móviles:

-App detector de metales. (utiliza el magnetómetro del móvil)
-App educativa para aprender la señales de tráfico (utiliza SQLite y criptografía básica)
-App linterna (gestiona el acceso a la cámara del dispositivo)
-App para gestión de un GPS (Utiiza el sensor de orientación, localización y magnetómetro,
incorpora mapas de OpenStreetMap y Google Maps (tráfico, elevación del terreno, ruta entre 2 puntos), usa la Api de Google, base de datos SQLite y maneja la API de Android para ubicación de satélites del GPS, es hasta ahora mi mejor app)

Como veis, la experiencia que tengo en programación es tremenda y todo hecho con este magnífico lenguaje.
Muchos de los módulos anteriores los he implementado utilizando Intraweb en un entorno cliente-servidor bajo IIS7, casi cualquier proyecto que tengáis pensado se puede realizar con este lenguaje.
Últimamente estoy metido de lleno en programación para dispositivos móviles y ya cuento en la Play Store con varias apps con un gran número de descargas (no lo veo como negocio, sino como desarrollo profesional para ir mejorando un poco más cada día).

Una de las opciones que más valoro de este lenguaje es la PORTABILIDAD, es decir la capacidad de programar una vez y tener el código disponible en varias plataformas (Windows, Android, IOS, Linux con FMXLinux), si recordáis antes había que aprender Objective-C si querías hacer algo para Mac, o utilizar Eclipse si querías hacer algo para Android o Visual.Net o Visual Basic si querías programar en Windows y ahora con Delphi eso no es necesario, imagínate el tiempo que te ahorras, yo solamente por eso, creo que jamás dejaré de utilizarlo.

Seguramente te dirán ...¿ y para la web ? bien pues tienes a UNIGUI (utiliza unas librerías Javascript con Delphi) aquí tienes una demo o también Delphi para la Web (Intraweb) que es lo que yo he utilizado en mis proyectos (permite utilizar el lenguaje Pascal o incorporar tus propios módulos en javascript).

Delphi, no se queda parado en el tiempo, con cada nueva versión incorpora funciones y características de otros lenguajes (como los genéricos, funciones anónimas, etc...), la VCL (librería de componentes visuales) ha sido mejorada con la introducción de Firemonkey (es el entorno que permite generar aplicaciones multiplataforma) que por cierto, utiliza la GPU para renderizar los gráficos...es impresionante ver la fluidez del movimiento cuando haces animaciones.

En las últimas versiones incorpora la posibilidad de hacer programación en paralelo, con lo que puedes incrementar drásticamente la capacidad y velocidad de cálculo de tus programas.

Utiliza programación visual basada en componentes, lo que hace que sea sumamente sencillo y rápido iniciar / terminar un proyecto. Te puedo asegurar que con Delphi se hace un proyecto un 70% más rápido que con otros lenguajes.

Miles de aplicaciones se han desarrollado ya, aquí tienes un resumen, ¿por qué no lo pruebas ? aquí tienes una versión gratuita , ya te aseguro que no te vas a arrepentir.

Y tú, ¿por qué elegiste Delphi? Comparte tus comentarios en tu blog utilizando el hashtag #WhyIChooseDelphi













Ya está disponible Rad Studio 10.2 Tokyo - Release 1

Delphi Tokyo 10.2 Wallpaper


Ya está disponible para su descarga la Release 1 de Rad Studio 10.2 Tokyo, que es una actualización de Delphi 10.2 Tokyo, C++Builder 10.2 Tokyo y RAD Studio 10.2 Tokyo disponible para los clientes que tengan activa una Update Subscription.
Soluciona un número importante de problemas que han reportado los usuarios y añade nuevas mejoras respecto a la versión inicial.

Entre las mejoras hay que mencionar las siguientes:

- Mejoras en el rendimiento del servidor de Delphi Linux para RAD Server y DataSnap.
- Mejoras en Delphi y compilador C++ y actualizaciones del compilador que resuelven problemas de la carga de paquetes, especialmente al depurar en Windows 10 Creators Update que afectan a la forma en que el sistema operativo carga DLLs y paquetes Delphi (BPLs), que hacía que se repitiese la operación de carga varias veces, dificultando gravemente la depuración de aplicaciones con paquetes runtime.
- Soporte para las últimas versiones de iOS y Xcode (iOS 10.3 y XCode 8.3.3) .
- Compatibilidad con FireDAC para MSSQL 2012, 2014, 2016 y controlador ODBC 13.
- Mejoras significativas en el compilador C++ relacionadas con la vinculación de proyectos grandes.
- Correcciones y mejoras a la Biblioteca Runtime y VCL.
- Mejoras adicionales de Android en torno a renderización y rendimiento de control y correcciones para problemas de TEdit con Android N.
- Soporte de FireDAC para Interbase 2017 para el nivel de aislamiento exclusivo y tiempo de espera de transacción.
- Cambios en DataSize para los campos de tipo ftInteger y ftLongWord para evitar el uso de LongInt y LongWordtype dependientes de la plataforma (el cambio afecta sólo a las plataformas Linux de 64 bits y de 64 bits) y los cambios relacionados con SetFieldData y GetFieldData
- Correcciones para más de 140 problemas reportados por los clientes en Quality Portal.

La Release 1 se puede descargar desde aquí, bien como una ISO (iniciando el archivo install_RADStudio.exe) o para su instalación online:

Problemas conocidos:

Después de actualizar a 10.2.1 desde 10.2.0, es posible que vea el siguiente mensaje de error al instalar un componente IOT( Internet of Things ) desde el Administrador de Paquetes GetIt: "Problema al agregar el archivo dcliotReg.pas al proyecto."
Esto se debe a una falta de alineación entre el registro y el estado real de los paquetes.
Como solución, se recomienda quitar la carpeta C: \ Users \ \ Documents \ Embarcadero \ Studio \ 19.0 \ CatalogRepository \ dcliot-250 y volver a ejecutar GetIt para actualizar el componente.



Delphi Academy

DelphiAcademy
Vuelve Delphi Academy, que para los que aún lo conozcan, es un proyecto de Embarcadero que se creó para dar a conocer, sobre todo a los usuarios de habla hispana, las particularidades de Delphi, por medio de videotutoriales de unos 30 minutos (en español), personalmente echo en falta este tipo de proyectos en nuestro idioma ya que la mayoría del material que he podido encontrar (libros, webs, tutoriales, etc..) está inglés y desde luego es de agradecer para la Comunidad de programadores que se creen iniciativas de este estilo.

Tratan temas para todo tipo de usuarios, apto para aquellos que estén comenzando a programar en Delphi, como para los que llevan unos años y quieran profundizar en algunos temas (Linux, Firedac, programación paralela, DataSnap REST, Layouts, desarrollo Web, etc.) desde luego aquí tienen sin duda material de calidad.

La grabación de todos los episodios anteriores se pueden ver desde el canal de Youtube
y el código fuente de los ejemplos y diapositivas los podéis descargar desde aquí

Comienzan el próximo viernes 11 de Agosto con la siguiente agenda:
Delphi Academy ¡Anunciando nuevos episodios para el segundo semestre de 2017

Para inscribirse hay que ir a la siguiente página http://embt.co/AcademyLA






Cómo controlar los gestos en las aplicaciones

Rad Studio nos ofrece un componente llamado tGesture para detectar los movimientos de los dedos sobre la pantalla del dispositivo.
Utilizarlo es muy sencillo, sólo hay que abrir la Tool Palette y colocarlo en el Form principal del proyecto.
Después desde el Object Inspector hay que desplegar la propiedad Touch y asociarlo a GestureManager, con ello nos aparecerán dos nuevas propiedades: Gestures (gestos estándar) e InteractiveGestures.



En este link tenéis en detalle la descripción de todos los gestos que reconoce.
Desplegando en el árbol Gestures - Standard tendremos que hacer clic sobre el gesto que queramos reconocer (izquierda, derecha, arriba, abajo, etc...)

GESTURES:
Consta de más de 30 gestos, como  Left, Right, Scratchout, Circle, ChevronUp, etc...

INTERACTIVE GESTURES:
Son gestos Multi-touch que disparan el evento OnGesture cuando son detectados. El parámetro EventInfo da información adicional sobre la localización del punto de toque, el ángulo, la inercia del desplazamiento, etc...
Los InteractiveGestures pueden ser: "Zoom", "Pan", "Rotate", "Two Finger Tap", "Long Tap", "Double Tap", y  "Press And Tap".

Para obtener el gesto detectado en el evento OnGesture teclearemos:

procedure TForm1.FormGesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean);
var
  S: String;
begin
  if GestureToIdent(EventInfo.GestureID, S) then
    ShowMessage(S)
  else
    ShowMessage('Could not translate gesture identifier');
end;
--

Por otra parte también quería enseñaros otra forma menos utilizada para detectar los gestos sin necesidad de añadir componentes a la app, pero más sencilla si cabe, que es utilizar el evento OnTouch del Form, del siguiente modo:



//Autor:http://www.danielespinetti.it

var
    FStartingPoint: TPointF;
    FDeviceScale: Single;
    ScreenSvc: IFMXScreenService;
    FScreenWidth: Single;
    FScreenHeight: Single;
    previousTranslateX: Single;
    startX: Single;
    previousTranslateY: Single;
    startY: Single;
...

procedure TForm1.FormShow(Sender: TObject);
begin

  FStartingPoint := PointF(0, 0);
  if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService,
    IInterface(ScreenSvc)) then
  begin
    FDeviceScale := ScreenSvc.GetScreenScale();
    FScreenWidth := ScreenSvc.GetScreenSize().X;
    FScreenHeight := ScreenSvc.GetScreenSize().Y;
  end;

  Rectangle1.Width := FScreenWidth * 2;
  Rectangle1.Height := FScreenHeight * 2;
  Rectangle1.Position.X := 0;
  Rectangle1.Position.Y := 0;

end;

procedure TForm1.FormTouch(Sender: TObject; const Touches: TTouches;
  const Action: TTouchAction);
begin
  if Length(Touches) <> 2 then
    exit;
  case Action of
    TTouchAction.None:
      ;
    TTouchAction.Up:
      begin
        previousTranslateX := Rectangle1.Position.X;
        previousTranslateY := Rectangle1.Position.Y;
      end;
    TTouchAction.Down:
      begin
        startX := Touches[1].Location.X - previousTranslateX;
        startY := Touches[1].Location.Y - previousTranslateY;
      end;
    TTouchAction.Move:
      begin
        Rectangle1.Position.X := Touches[1].Location.X - startX;
        Rectangle1.Position.Y := Touches[1].Location.Y - startY;
      end;
    TTouchAction.Cancel:
      ;
  end;
end;

Para probarlo lo único que tenéis que hacer es colocar un rectángulo en el Form y colgando de él una imagen

compilar y ejecutar el proyecto y probar a mover el rectángulo utilizando dos dedos.





Quizás te pueda interesar:
App para mostrar moléculas en 3D

Integrar Whatsapp con Delphi

A continuación vamos a ver cómo enviar un texto desde vuestra app a la popular aplicación de mensajería.
Empezamos con nuestro RAD STUDIO XE, desde el menú File-New-Multi Device Application Delphi, para crear un nuevo proyecto que almacenaremos en una carpeta de nuestro PC


En la pantalla siguiente tenemos que elegir entre varias opciones, si queremos que aparezca un form en blanco, o si queremos uno con toolbars de cabecera y pie, etc... en nuestro caso seleccionamos el icono blank application




Después desde la "Tool Palette" seleccionamos dos objetos:

- tEdit ,  propiedad Name="Edit1"
- tButton,  propiedad Name="Button1"

En la propiedad Text del tEdit escribimos "Hola desde RAD STUDIO XE", y en la propiedad Text del tButton tecleamos "Enviar a Whatsapp" y nos quedará de la siguiente forma:



Por otra parte, recordar que al tratarse de un proyecto Android hay que añadir ciertas units, en el uses del proyecto.

implementation
{$R *.fmx}
uses
  FMX.Helpers.Android, Androidapi.Jni.GraphicsContentViewText,
  Androidapi.Jni.Net, Androidapi.Jni.JavaTypes, idUri, Androidapi.Jni,
  Androidapi.JNIBridge, Androidapi.Helpers;



Hacemos doble clic sobre el tButton para modificar el evento "onclic"  y añadimos el siguiente trozo de código:

procedure TForm2.Button1Click(Sender: TObject);
var
  Intent1 : JIntent;
 
begin
   
  Intent1 := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_SEND);
  Intent1.setType(StringToJString('text/plain'));
  Intent1.putExtra(TJIntent.JavaClass.EXTRA_TEXT,
      StringToJString(Edit1.text));
  Intent1.setPackage(StringToJString('com.whatsapp'));
  SharedActivity.startActivity(Intent1);
end;

Bien, pues ahora nos queda ejecutarlo y veremos cómo funciona perfectamente.
Al pulsar el botón se abre automáticamente Whatsapp y nos solicita que seleccionemos un contacto, para después mostrarnos dentro de su chat el texto "Hola desde RAD STUDIO XE"






También te puede interesar: