Archivo de la categoría: Trucos

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

Múltiples escritorios de Windows 10

Estimados usuarios de Xailer,

Tan sólo quiero compartir con vosotros una pequeña herramienta que acabo de descubrir. Siempre he echado en falta en Windows la posibilidad de tener varios escritorios virtuales, y de hecho probé varias aplicaciones, que no me gustaron, antes de que por fin con Windows 10 los incluyese. La solución aportada por Windows 10 funciona muy bien, pero de forma inconcebible se les ha olvidado incluir algo que para mi es esencial que consiste en saber que escritorio virtual estoy en cada momento. Manias de uno 😉

Pues bien, si alguno tenéis manías como las mías, existe una pequeñísima utilidad que hace el trabajo poniendo un pequeño icono en la barra de tareas que además permite cambiar el fondo de pantalla cuando cambiemos de escritorio. Su nombre es VirtualDesktopManager y lo podéis descargar de aqui: https://github.com/m0ngr31/VirtualDesktopManager/releases. Como veis es un enlace un proyecto en GitHub, por lo que incluso está todo el código fuente del proyecto.

¡Espero que os guste!

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

 

FormWizard una pequeña utilidad para Xailer.

Una de las mejores cosas que tenemos a nuestra disposición en Xailer, es poder diseñar nuestros Form con acceso a una base de datos usando DataControls de una forma muy sencilla.

Pero comentando el otro día, en la taberna entre dos vinos como hacemos los de Bilbao, el amigo David Marina me comentaba que le parecía curioso que no hubiera, como en otros IDEs de programación, algunos Wizard para hacer cosas elementales como un form con todos los campos de una tabla y tenía razón, así que le animé a que lo hiciera como ejercicio práctico y así comenzó esta pequeña historia que entre ambos hemos montado.

FormWizard es una utilidad que permite tomar un DBF (lo siento de momento no sabemos de SQL) y con todos sus campos o los indicados y en el orden deseado, mas otras florituras, genera un formulario con su PRG y XFM que guardaremos en la carpeta Source del proyecto en el que estamos y listo. Asigna los DataControl al control más lógico, los autoajusta al tamaño necesario, etc.

A continuación simplemente añadimos el recién creado PRG al proyecto (Proyecto – Añadir fichero al proyecto o el Icono correspondiente) y listo. Pulsando F12 podremos ver el formulario y modificarlo al gusto si nos apetece, ya que es lo mismo que si lo hubiéramos hecho a mano desde cero con el IDE.

Si además queremos usarlo con mas facilidad lo mejor es meter el ejecutable en la carpeta que queramos (yo lo he puesto en C:XailerBin) añadirlo al menú herramientas mediante la opción “Configurar herramientas” con los siguientes datos:

Herramienta FormWizard

Aunque no es una ayuda bárbara, esperamos que os guste y le saquéis provecho a nuestro regalo navideño. Proyecto FormWizard

Messages Un conjunto de utilidades para Xailer

Agradezco a Xailer.info la posibilidad de colaborar aportando mi primer granito de arena: Messages

Este fue mi primer ejercicio práctico en Xailer a principios del 2006 y en realidad consta de un único PRG que podemos enlazar con nuestras aplicaciones con un conjunto de pequeñas utilidades/trucos pero que nos resuelven algunas cosillas del día a día en nuestros programas.

Consta de un completo manual en castellano y ejemplo práctico de cada una de las funciones, asi que probarlo y ver lo que hace no os costará nada.

Que lo disfrutéis.

Controles nativos de Vista en Xailer

Vista introduce un nuevo tipo de control llamado CommandLink que se comporta como un botón estándar, pero pretende hacer más agradable la experiencia del usuario.

Veamos una imagen:

CommandLink

Se puede apreciar cómo el control muestra una imagen, un texto principal y una breve descripción de su cometido.

Para entender cómo funciona, nada mejor que un poco de código que crea un TCommandLink como el que se ve en la imagen anterior:

WITH OBJECT TCommandLink():New( oForm )
   :cText := "CommandLink"
   :cNote := "This is the new TCommandLink control"
   :lShield := .T.
   :Create()
END

En el archivo vistacommandlink.zip está todo el código fuente del control, tan sólo hay que compilarlo y añadir el OBJ al proyecto en el que se quiera utilizar.

Un saludo.