Delphi XE2/XE3 – Creando aplicaciones VCL con estilo

A partir de Delphi XE2 y ahora también en XE3, las aplicaciones Delphi contienen un nuevo motor de Temas y Estilos.

Esto significa que podemos hacer una aplicación visualmente más atractiva sin prácticamente ningún esfuerzo, y también que podemos añadir nuestro propio estilo personalizado a las aplicaciones.

Por hoy, veremos de manera rápida cómo realizar una aplicación con un estilo diferente en Delphi, cómo podemos interrogar a la propia aplicación sobre los estilos disponibles y cómo podemos, en tiempo de ejecución, cambiar de estilo.

Pero, primero, veamos el resultado de compilar nuestra sencilla aplicación Demo y ejecutarla:

Formulario con estilo

Continuar leyendo «Delphi XE2/XE3 – Creando aplicaciones VCL con estilo»

es.StackOverflow alcanza la etapa de compromiso

La primera etapa de la propuesta para la creación de es.StackOverflow se ha completado hoy, y hemos entrado a la etapa de compromiso.

¿Cómo me comprometo?

Esta es la parte sencilla. Debes visitar la página de la propuesta y hacer clic en el link commit (como se muestra en la figura).

Esto te presentará un formulario donde debes firmar tu compromiso. En realidad no firmas en el sentido tradicional, sino que colocas tu nombre (que se hará público), tu dirección de correo (que no se hará pública), la calidad en la que participarás en el sitio y un comentario adicional que se publican junto a tu nombre.

Una vez firmas, tu nombre será incluido en la lista de comprometidos del sitio:

¿A que me comprometo?

Al hacerlo, te comprometes a participar en el sitio una vez este alcance la fase beta. Tu compromiso se considera cumplido si publicas al menos 10 entradas (preguntas o respuestas) durante dicha fase beta del sitio.

No me había enterado hasta ahora, ¿aún puedo comprometerme?

¡Claro!, también invita a tus amigos, publica en tu blog y en tus redes sociales, pues si logramos completar la fase de definición con 168 seguidores, vamos a necesitar muchos más para completar esta etapa.

¿Que hay que lograr para cambiar de etapa?

La red StackExchange pide que se cumpla con tres parámetros de comprometidos para que el sitio llegue a la fase beta.

  • No menos de 200 personas comprometidas con el sitio
  • No menos de 100 personas con al menos 200 de reputación en algún otro sitio de la red
  • Alcanzar 500 puntos de puntuación de compromiso, que se calcula a partir de qué tan activos son los usuarios comprometidos en otros sitios de la red.

Hay casos donde se ha requerido de más de 800 usuarios para completar esta fase, pero soy optimista que tratándose la audiencia del sitio de programadores, tendremos un buen número de participantes ya activos en StackOverflow o en El idioma español y su Uso, y por tanto nuestros números serán similares a los de StackOverflow en portugués.

¡El compromiso envejece!

Hablando de la puntuación de compromiso, el algorítmo del cálculo toma en cuenta la edad del compromiso, por lo que a medida que van pasando las semanas y los meses, nuestro compromiso aporta cada vez menos a la puntuación. Para evitar esto, basta simplemente con visitar de nuevo la página de la propuesta (con la sesión iniciada), pues esto renueva nuestro compromiso.

¡Pasa la voz!

Este es el momento de pasar la voz sobre la propuesta del sitio. Invita a tus colegas, amigos, compañeros de estudio o de trabajo. Publica en tu blog y en tus redes sociales sobre esta propuesta.

La clase TIdMessageBuilderHtml y el envío de correos HTML desde Delphi

Hay muchas formas de enviar correos con Delphi.

Mi preferida desde hace tiempo es hacerlo vía SMTP con la clase TIdSMTP, que es flexible y poderosa.

Hoy, a raíz de que mi estimado amigo, Edgar Ramírez, publicara su artículo Enviar correo con imágenes incrustadas con Delphi he recordado que hace tiempo me gustaría iniciar una serie de artículos sobre el uso de INDY y la comunicación TCP/IP con Delphi.

A manera de respuesta a la publicación citada, quiero mostrar cómo realizar el envío de un correo similar —con una imagen incrustada— haciendo uso de la clase auxiliar TIdMessageBuilderHtml, que en mi opinión no solo facilita las cosas sino que nos deja una solución mucho más elegante y fácil de entender en el código.

La parte relevante del envío de correo es:

<br>
procedure TfrmCorreo.EnviaCorreoImagen(const FileName: string);<br>
var<br>
  Builder: TIdMessageBuilderHtml;<br>
  Msg: TIdMessage;<br>
  SMTP: TIdSMTP;<br>
begin<br>
  Builder := TIdMessageBuilderHtml.Create;<br>
  try<br>
    Builder.Html.Add('&lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;Una imagen para ti&lt;/TITLE&gt;&lt;/HEAD&gt;&lt;BODY&gt;');<br>
    Builder.Html.Add('&lt;p&gt;&lt;strong&gt;Una imagen para ti&lt;/strong&gt;&lt;/p&gt;');<br>
    Builder.Html.Add('&lt;div&gt;');<br>
    Builder.Html.Add('  &lt;img border="0" src="cid:laimagen" &gt;');<br>
    Builder.Html.Add('&lt;/div&gt;');<br>
    Builder.PlainText.Add('Este correo contiene una imágen para ti. '<br>
      + 'Debes usar un visor HTML para verla');<br>
    Builder.HtmlFiles.Add(FileName, 'laimagen');<br>
    Msg := Builder.NewMessage();<br>
    try<br>
      Msg.Recipients.EMailAddresses := eRecipients.Text;<br>
      Msg.From.Name := eFromName.Text;<br>
      Msg.From.Address := eFromEmail.Text;<br>
      Msg.Subject := 'Una imagen para ti';<br>
      SMTP := TIdSMTP.Create;<br>
      try<br>
        SMTP.Host := eSMTPHost.Text;<br>
        SMTP.Username := eSMTPUser.Text;<br>
        SMTP.Password := eSMTPPass.Text;<br>
        SMTP.Connect;<br>
        try<br>
          SMTP.Send(Msg);<br>
        finally<br>
          SMTP.Disconnect;<br>
        end;<br>
      finally<br>
        SMTP.Free;<br>
      end;<br>
    finally<br>
      Msg.Free;<br>
    end;<br>
  finally<br>
    Builder.Free;<br>
  end;<br>
end;<br>

Como puede observarse, la instancia de TIdMessageBuilderHtml se encarga de los detalles sobre adjuntar los archivos. De lo que debemos asegurarnos es de proveer un cid diferente para cada imagen incluida en el HTML de nuestro correo, y que estos identificadores se correspondan con los archivos incluidos posteriormente en la llamada al método HtmlFiles.Add, que recibe como parámetros el nombre del archivo y el cid correspondiente.

Aclaración: En mi opinión cualquier método con más de 25 líneas de código es demasiado grande y debe considerarse su refactorización. Es el caso del código publicado, sin embargo he preferido mantener un solo método para no enredar al lector con tener que seguir mentalmente las llamadas entre ellos. Como se ve, el método se encarga de todo el envío del correo, lo cuál conceptualmente también puede ser mucho para un solo método. En algo para producción, esto probablemente sería dividido en 3 distintos métodos: armar el correo HTML, configurar el mensaje y finalmente la conexión/envío/desconexión.

Editado el 1/7/2021

La unidad a incluir en la cláusula uses es IdMessageBuilder. Lo agrego aquí, porque sin querer he omitido la información en la entrada y hay varios comentarios de algunas personas que no encuentran la clase. La unidad está en la carpeta Protocols de Indy.

Marco Cantù llega como nuevo Product Manager de Delphi

El día de hoy (ayer), durante la primera sesión de CodeRage 7 ha sido anunciado a Marco Cantù como nuevo Delphi Product Manager, Más tarde el mismo Marco ha hecho replica de la noticia en twitter y en su blog, mientras por su parte JT le daba oficialmente la bienvenida a Embarcadero.

Marco es una prominente figura de la comunidad global, uno de los más conocidos autores y conferencistas del mundo de Delphi, por lo que seguramente es conocido por la gran mayoría de usuarios de la herramienta y por tanto no necesita presentación. Sus libros han sido leídos por muchos —incluyéndome— y sus conferencias, eventos y presentaciones son siempre de las más concurridas.

En lo que a mi respecta, como siempre, espero que esta incorporación traiga un mayor acercamiento a las necesidades de los usuarios y visión para encarar el futuro de Delphi.

Go Delphi y Go Marco!