Archivo de la categoría: Como hacer …

Exprimiendo el FOR EACH de Harbour

La cláusula FOR EACH que Harbour incorporó al lenguaje CA-Clipper fue una gran mejora, pero hay mucha gente que sólo lo utiliza de su forma más básica:

FOR EACH value IN aValues
  ? value
NEXT

Sin embargo ofrece multitud de posibilidades. Vamos a enumerar unas cuantas:

  • Iterar sobre más de una variable:
    FOR EACH a, b, c IN aVal, cVal, hVal
      ? a, b, c
    NEXT
  • Establecer orden descendente:
    FOR EACH a IN aVal DESCEND
      ? a
    NEXT
  • Asignar caracteres de una cadena de forma directa: (atención a la @)
    s := "abcdefghijk"
    FOR EACH c IN @s
      IF c $ "aei"
        c := Upper( c )
      ENDIF
    NEXT
    ? s // AbcdEfghIjk
  • Control por POO sobre las variables de iterador:
    • :__enumIndex() retorna el actual ordinal en la iteración. El equivalente a nFor
    • :__enumIsFirst() retorna si es el primer elemento en la iteración
    • :__enumIsLast() retorna si es el último elemento en la iteración
    • :__enumBase() retorna la variable base que está siendo procesada. Útil cuando se procesan más de una variable.
    • :__enumValue() retorna el valor de la variable que está siendo procesada. Útil cuando se procesan más de una variable.
      FOR EACH a IN aVal
        ? a:__enumIndex()
      NEX

Harbour incluso permite modificar como se debe de recorrer la iteración utilizando los métodos :__enumStart(), :__enumSkip() y :__EnumStop(). Tenéis un ejemplo de uso en el fichero \harbour\tests\foreach2.prg.

Espero que os haya sido de utilidad.

Un saludo

Centrado de ventanas

Estimados usuarios de Xailer,

Los formulario de Xailer tienen una propiedad de nombre lCentered que permite indicar si la ventana ha de mostrarse centrada o no.  El centrado se produce con la totalidad de la pantalla y si el usuario tiene dos monitores, se centro en el monitor donde se está ejecutando la aplicación. No obstante, están proliferando monitores cada vez más grandes y sobre todo más anchos y la visualización centrada en el monitor puede no ser la correcta.

Os vamos a mostrar un pequeño truco,  -que además servirá para entender algo más la sobrecarga de clases de Xailer-, para centrar la ventana sobre su formulario padre. Este es el código:

CLASS TForm FROM XForm
  METHOD Show( nCmdShow, lCenter )
END CLASS

METHOD Show( nCmdShow, lCenter ) CLASS TForm
   LOCAL nDifW, nDifH
   DEFAULT lCenter TO ::lCentered
   IF lCenter .AND. ::oParent:IsKindOf( "TForm" )
     nDifW := Max( (::oParent:nWidth - ::nWidth) / 2, 0 )
     nDifH := Max( (::oParent:nHeight - ::nHeight) / 2, 0 )
     ::nLeft := ::oParent:nLeft + nDifW
     ::nTop := ::oParent:nTop + nDifH
   ENDIF
   ::Super:Show( nCmdShow, .f. )
RETURN Nil

Basta con poner este código en cualquier parte de su código y a partir de entonces los formularios que tengan la propiedad lCentered a verdadero se mostrarán centrados respecto a su formulario padre y no con respecto al monitor.  Espero que os haya gustado.

Un saludo

 

Cómo Crear Citas en Google Calendar desde Xailer

Hace unos días me vi  en la necesidad de implementar a uno de mis clientes acceso a google maps y a la creación de eventos en google calendar. El tema de los mapas lo pude resolver fácilmente gracias a la estupenta aportación que Bingen hizo en su momento.

Para integración del calendario no me quedó más remedio que calzarme las botas de explorador y ponerme a investigar cómo podía hacerlo. Un ratico en google y en seguida me di cuenta de que atacar a la mayoría de los servicios de google (calendario, contactos, youtube, etc..) es francamente fácil… siempre y cuando utilices  .net

Xailer por un lado, .net  por el otro, ¿Cómo resolverlo?
En un principio pensé en crear una aplicación de consola en VB y hacer una llamada con ShellExecute, pasándole los datos como parámetros. Lo probé y funcionaba, pero fui incapaz de hacer que el programa en VB le devolviera a Xailer si la operación había tenido éxito o no.

Necesitaba una forma en que los dos programas se comunicaran entre sí… Una especie de cliente servidor básico… ¡¡Los Sockets!!

A partir de un artículo de José Alfonso en chochurro, me puse a investigar cómo establecer comunicación entre distintas aplicaciones y aquí está el resultado.

Sigue leyendo

Browses elásticos

En Xailer, cuando usamos la propiedad nAlign o nAnchors a un browse, éste se ajusta dinámicamente a las dimensiones del formulario, pero no pasa lo mismo con su contenido, las columnas del browse.

Nunca me ha gustado mucho este comportamiento, así que tenía dos opciones: o quejarme amargamente porque no funcionaba como yo quería, o remangarme y cambiar su funcionamiento.

Y.. bueno… digamos que me quejo poco.

Sigue leyendo

Multivisor: Cómo ver 500 formatos de archivos usando 90 líneas de código

En mi ya larga experiencia usando xailer, siempre he tenido dos espinitas clavadas que se me habían resistido especialmente:

La integración de controles ActiveX en mis programas y la posibilidad de visualizar limpiamente archivos pdf dentro de un formulario sin tener que recurrir a trucos con el explorer que se empeña en que me aparezcan las barras de herramientas de acrobat cada vez que intento visualizar un documento.

Pues bien, hoy vamos a matar dos pájaros de un tiro y ver cómo hacer ambas cosas.

Hace un tiempo, gracias a un plugin para total commander descubrí la tecnología Outside in de Oracle que nos permite acceder, transformar y controlar el contenido de cerca de 500 formatos de ficheros.

Imaginaros mi sorpresa al ver que además disponía de un control activex para acceder a esa maravilla. Total, que no me pude resistir, y aquí está el resultado.

Sigue leyendo