mejora en la fuente de mis programas

Un tema que para mi ha sido un dolor de cabeza continuo es el tema de la fuente que utilizo en mis programas. El problema lo llevaba arrastrando muchos años y es el siguiente: en Windows los programas de 32bits se ven borrosos al utilizar fuentes grandes o un escalado del tamaño de fuentes en la pantalla. En mi caso utilizo escalado de fuentes tanto en un monitor de 24″ y en un portátil que utilizo habitualmente. Hasta hora en mis programas utilizaba la fuente del sistema tal como expliqué en una entrada anterior.

El caso es que hace poco estuve revisando la carpeta samples de FWH y algunos de sus programas, como FiveDBU, se veían tremendamente bien, sin fuentes borrosas. La manera de definir la fuente era algo tan sencillo como esto:

  DEFINE FONT ::oFont  NAME "Calibri" SIZE 0, -14 

y como decía un conocido programador ¡listo el pollo!. Increíble. Con la de vueltas que le he dado yo a este tema y la solución era la más sencilla posible. Esta solución tenía un pero, y es que tuve que adaptar algunos controles para que la letra elegida se mostrase correctamente. Como los formularios que utilizo en mis programas los genero desde recursos también tuve que adaptar todos los formularios a la nueva letra. Los formularios son ahora un poco más grandes que antes pero el trabajo ha merecido la pena.

En la siguiente imagen muestro mi Cuaderno de Bitácora, a la izquierda con el nuevo tipo de letra y a la derecha con el antiguo. La claridad y legibilidad del programa ha mejorado bastante.

A la izquierda el nuevo tipo de letra y a la derecha el antiguo.

generación de pdf de listados

Hace poco he descubierto una cosa bastante curiosa sobre la generación de PDF de los listados de mis programas y que es aplicable a todos ellos. Cuando se genera un listado en cualquiera de mis programas aparece la siguiente ventana de previsualización y lo que aparece en la parte derecha es una imagen con la previsualización del listado.

Para generar un PDF con el listado normalmente pulsaba en el botón de Acrobat marcado con (2) en la imagen superior, pero se me ocurrió hacerlo seleccionando la impresora ‘Microsoft print to PDF’ que aparece en el menú desplegable bajo el icono de la impresora (1). El caso es que el resultado parece similar pero es totalmente distinto.

A la izquierda está el PDF generado con ‘Microsoft print to PDF’ y a la derecha el generado con la opción de PDF de FWH. El PDF de la izquierda es texto, se puede seleccionar, copiar texto, etc., mientras que el de la derecha es una imagen y no se puede hacer nada con el texto, simplemente porque no hay texto, hay una imagen con el texto.

En resumen, si tienes que generar un PDF a partir de uno de mis programas mira a ver si tienes disponible la impresora ‘Microsoft print to PDF’ y genera el PDF a través de ella.

organizando referencias de fotografía

En los talleres de fotografía a los que asisto a menudo se hace referencia a trabajos de fotográfos que, por un motivo u otro, el ponente introduce cuando habla de un tema concreto. Suelo anotar estas referencias a autores y trabajos en la libreta que utilizo para estos talleres y hace pocos días me planteé la manera de organizar todas estas referencias.

La primera idea fue utilizar Notion, que es una aplicación que utilizo de vez en cuando pero a la que no consigo extraer su supuesto potencial. Así que me creé una base de datos de autores y otra de trabajos, tal como lo siguiente:

Tabla de fotógrafos en Notion
Tabla de trabajos de fotógrafos en Notion

El caso es que no me acababa de gustar cómo quedaba y estuve dándole vueltas a la manera de mejorarlo. Hasta que caí que tenía algo así hecho en Cuaderno de Bitácora, en el apartado de gestión de documentos. Llevaba mucho tiempo sin utilizar esta parte del programa, que es la integración de Azeta, y que es donde tengo guardados los artículos que utilizaba en mis tiempos de profesor asociado de la Universidad de Alicante y también de temas relacionados con programación. Así que me puse a ver si la gestión de documentos me permite almacenar las referencias de fotografía y creo que sí.

La manera de hacerlo consiste en guardar los fotógrafos como autores de documentos y los sitios web donde estan los artículos o los canales de YT con los videos como publicaciones. Cierto es que tengo que darle una pensada y simplificar un tanto la gestión de documentos y de publicaciones, quizás con versiones exprés de los formularios de mantenimiento tanto de documentos como de publicaciones, pero de tal manera que no pierda la información que te ahora mismo tengo metida en el programa. Pero creo que sí me va a servir.

Ejemplo de referencia de fotografía almacenada en Cuaderno de Bitácora

Así que voy a comenzar una actualización del programa, llevando cuidado de mantener la compatibilidad con versiones anteriores del programa, pero modificándolo para su nueva funcionalidad.

cuaderno de bitácora 8.50

Ya puedes descargar la versión 8.50 de Cuaderno de Bitácora,  mi organizador de libros, discos, videos y direcciones de internet. La principal novedad de esta versión es la incorporación de galerías con las imágenes de las portadas de libros, discos y videos. Los mantenimientos de estas colecciones incorporan una nueva opción llamada ‘Galería de portadas’ que permite mostrar un formulario con todas las portadas de los ejemplares de la colección. En caso de tener un filtro activo solo se muestran las portadas de los ejemplares filtrados que se ordenan por la ordenación vigente en la colección. Al hacer dobleclick sobre una portada se edita el ejemplar correspondiente.

Galería de portadas de libros con filtro por materia y ordenados por fecha de compra.

El número de portadas que aparecen en cada fila de la galería se puede personalizar en la opción de Configuración del programa, dentro de la pestaña ‘Valores por defecto’.

Además he añadido otras nuevas funcionalidades y he corregido todos los errores reportados por los usuarios. Las demás novedades de la versión son las siguientes:

  • Añadido el cantante a cada canción en el fichero de canciones
  • Añadida la opción ‘Ver discos’ a la gestión de canciones
  • Añadido autocompletado en el titulo de la canción y compositor al editar una canción de un disco.

cómo hacer una galería de imágenes con FWH

Esta entrada se publicó originalmente en Harbour Magazine, mi publicación sobre el lenguaje de programación Harbour.

Desde hace mucho tiempo he querido incorporar una galería de imágenes a algunos de mis programas. Esto data de mis tiempos de fanboy de Apple, cuando quedé prendado de un programa llamado Delicious Library al que me referí en esta entrada.

El caso es que hace poco estaba dándole vueltas a la cabeza en la manera de hacerlo y pregunté en el foro de FWH. La primera intención fue crear una clase a medida dentro de una ventana, pero esa solución no me valía porqué el flujo del programa es muy complicado de controlar pues las ventanas quedan independientes. Hubo otra propuesta de clase basada en diálogo utilizando la clase TPanel de FWH, y buscando ejemplos de esta clase me topé con la clase TScrollPanel que no conocía y de la que apenas hay documentación. Utilizando esta clase y el código que Mr. Rao había realizado para la clase TAlbum fue muy sencillo implementar la galería de imágenes.

Esta galería de imágenes la puedo utilizar, por ejemplo, para crear una galería de portadas de libros.

Ejemplo de galería de portadas de libros

Lo bueno de esta galería es que muestra las portadas en el orden de la rejilla de libros y si hay algún filtro activo la galería muestra unicamente los libros que aparecen en el filtro.

El código que he utilizado para crear la galería es el siguiente:

Function LiGaleria()
   LOCAL cAlias  := "LI"
   LOCAL nRecno  := ( cAlias )->( RecNo() )
   LOCAL nOrder  := ( cAlias )->( ordNumber() )
   local aImages := {}
   local aLabels := {}
   local aRecno  := {}
   local oDlgAlbum, oAlbum

   LI->(DbGoTop())
   WHILE ! LI->(EOF())
      IF ! Empty(Rtrim(LI->LiImagen))
         AAdd(aImages, Rtrim(LI->LiImagen))
         AAdd(aLabels, Rtrim(LI->LiTitulo))
         AAdd(aRecno, LI->(Recno()))
      ENDIF
      LI->(DbSkip())
   ENDDO
   LI->(DbGoTo(nRecno))

   DEFINE DIALOG oDlgAlbum SIZE oApp():oGrid:nWidth, oApp():oGrid:nHeight PIXEL TRUEPIXEL ;
      TITLE "Galería de portadas de libros - dobleclik para editar un libro"
   oDlgAlbum:SetFont(oApp():oFont)
   //
   oAlbum := TScrollPanel():New( 20, 20, oApp():oGrid:nHeight-50, oApp():oGrid:nWidth-20, oDlgAlbum, .f. )
   oAlbum:SetColor(CLR_WHITE, CLR_WHITE)
   oAlbum:SetFont( oDlgAlbum:oFont )

   @ oApp():oGrid:nHeight-40, oApp():oGrid:nWidth-96 BUTTON "Aceptar" ;
      SIZE 76, 24 PIXEL OF oDlgAlbum ACTION oDlgAlbum:End()

   ACTIVATE DIALOG oDlgAlbum ;
      ON INIT ( LiAlbum( oAlbum, aImages, aRecno, oDlgAlbum ), oDlgAlbum:Center( oApp():oWndMain ) )

   RETURN NIL  

function LiAlbum( oPanel, aPhotos, aRecno, oDlgAlbum )
   local nImgPerRow  := 8
   local nImgWidth   // := 180
   local nImgHeight  // := Int( nImgWidth * 4 / 3 )
   local nHGutter    := 10
   local nVGutter    := 20
   local nCols       := nImgPerRow 
   local nRows, nRow, nCol, x, y, nImage, xMax, nImages := Len( aPhotos )
   local oImage, oSay

   // el ancho del scrollbar es 16
   nImgWidth := INT((oPanel:nWidth-16-(nImgPerRow+1)*nHGutter)/nImgPerRow)
   nImgHeight:= Int( nImgWidth * 4 / 3 )
   nRows    := Ceiling( nImages / nCols )
   xMax     := nCols * ( nImgWidth * nHGutter )
   y        := nVGutter
   nImage   := 1
   do while nImage <= nImages
      x     := nHGutter
      nCol  := 1
      do while nCol <= nCols .and. nImage <= nImages
         // llamo a una funcion para conseguir detached locals
         LiAlbumImage(y, x, nImgWidth, nImgHeight, oPanel, aPhotos, aRecno, nImage, nVGutter, oDlgAlbum)
         nImage++
         nCol++
         x  += ( nImgWidth + nHGutter )
      enddo
      y  += ( nImgHeight + nVGutter )
   enddo
   //::nImgCols  := nCols
   // ::nHeight   := y
   oPanel:SetRange() // call this after defining all controls

return nil

Function LiAlbumImage(y, x, nImgWidth, nImgHeight, oPanel, aPhotos, aRecno, nImage, nVGutter, oDlgAlbum)
   local oImage, oSay, nLiRecno
   nLiRecno := aRecno[nImage]
   @ y, x XIMAGE oImage SIZE nImgWidth, nImgHeight OF oPanel NOBORDER
   oImage:SetSource( If( HB_ISARRAY( aPhotos[ nImage ] ), aPhotos[ nImage, 1 ], aPhotos[ nImage ] ) )
   oImage:nUserControl := 0
   oImage:lBmpTransparent := .f.
   oImage:bLDblClick := { || ( LiForm( oApp():oGrid, "edt", , nLiRecno, oDlgAlbum )) }

   //@ y+nImgHeight+(nVGutter/2), x SAY oSay PROMPT nLiRecno FONT oApp():oFont ;
   //   COLOR CLR_BLACK, CLR_WHITE ;
   //   SIZE nImgWidth, 2*nVGutter CENTER PIXEL OF oPanel
return NIL

En este código estoy utilizando tres funciones:

  • LaGaleria que recorre el fichero de libros para crear 3 arrays donde guardo las portadas, los títulos y los número de registro a que se refiere cada portada. Aquí creo el diálogo y el ScrollPanel.
  • LiAlbum donde recorro el array de imágenes para crear las imágenes dentro del ScrollPanel. Como luego quiero acceder a cada imagen para editar el libro haciendo doble click tengo que crear las imágenes en otra función utilizando la técnica de ‘detached locals’.
  • LiAlbumImage que es donde creo cada una de las imágenes, este código lo realizó Mr. Rao en el foro de FWH.

En una próxima actualización de Cuaderno de Bitácora incluiré galerías con las portadas de libros, discos y videos.

maneras de codificar libros

Tengo todos mis libros catalogados en Cuaderno de Bitácora y hace poco estaba reflexionando sobre la manera de codificar los libros. Antes de continuar diré que no soy experto en catalogación de libros, simplemente utilizo mi programa para catalogar mi propia colección de libros.

Resulta que tengo algunos libros catalogados secuencialmente por la materia, es decir, una abreviación de la materia y un número secuencial, como aparece en la imagen de abajo. La ventaja de esta manera de catalogar es que sabes cuantos libros tienes de cada materia a simple vista. Aunque el programa te permite verlo en la gestión de materias o mediante un filtro por materia, el tener el código secuencial por materia añade una funcionalidad importante y es conocer el orden de catalogación de los libros, que debería coincidir con el de compra si cada vez que compramos un libro lo catalogamos. De esta manera puedes ver qué libro compraste antes que otros o cual ha sido tu evolución en la compra de libros de una determinada materia.

Catalogación de libros por materia y número correlativo

La segunda manera en que tengo catalogados otros libros consiste en un código formado por la abreviatura de la materia, el autor y un número correlativo. Creo que esta manera de catalogar es más académica y parecida al que se utiliza en las bibliotecas. Con este sistema tengo los libros agrupados por materia y autor, pero no tengo una secuencia de libros en el orden que los compré reflejada en el códigos de los libros.

Catalogación de libros por materia, autor y número correlativo

¿ Qué manera es la correcta ? Pues la verdad es que no lo sé. Yo prefiero la primera opción aunque sigo manteniendo los libros catalogados con la segunda con ese código.

Si utilizas alguna otra manera de catalogar tus libros o estás más a favor de una manera o de la otra agradeceré tu comentario.

cuaderno de bitácora 8.40.a

Está disponible para descargar la versión 8.40.a de Cuaderno de Bitácora, mi organizador de libros, discos, videos y direcciones de internet. En esta versión he modificado los formularios de edición de libros, discos, videos y software para hacer más grande la imágen de la portada o carátula, lo que ha hecho que algunos campos se hayan tenido que reubicar en las pestañas de los correspondientes formularios. También he modificado el sistema de préstamos, de manera que ahora el programa almacena un historial de préstamos de cada una de las colecciones. Esta modificación la he hecho a petición de mis amigos del Grup Fotogràfic de Petrer que querían tener un historial de préstamos de su excelente biblioteca.

Los formularios de edición han quedado de la siguiente manera:

Formulario de edición de libros
Formulario de edición de discos
Formulario de edición de videos
Formulario de edición de software

En cuanto al sistema de préstamos, en los formularios de edición hay una pestaña de préstamos donde se pueden anotar:

Subformulario de edición de préstamos

Cuando se anota una devolución el préstamo no se elimina, sino que queda guardado un histórico de préstamos de cada libro/disco/video/software. El histórico de préstamos de todos los ejemplares se puede revisar en la opción Préstamos de cada una de las colecciones.

Histórico de préstamos de libros

La actualización está disponible en la página de descargas.

código de alanit en GitHub

Esta entrada se publicó originalmente en Harbour Magazine, mi publicación sobre el lenguaje de programación Harbour.

He publicado en Github el codigo fuente de algunos de los programas disponibles en mi sitio web https://alanit.com. Estos programas están hechos con Harbour y FiveWinHarbour y creo que constituyen un buen punto de partida para cualquier programador que quiera iniciarse o profundizar en el conocimiento de estos lenguajes.

En el blog de mi web personal hay cientos de artículos sobre programación https://alanit.com/category/programacion y de aspectos relacionados con mis programas https://alanit.com/category/alanit/ que he ido publicando desde el año 2003.

Cuaderno de Bitácora

Imagen de Cuaderno de Bitácora

el Puchero

Findemes

Imagen de Findemes

El código fuente de Colossus, mi programa de gestión de contraseñas, también se encuentra publicado desde hace tiempo en https://github.com/JoseluisSanchez/colossus

nuevas funcionalidades en las ediciones gratuitas

Autocompletado de valores desde tablas auxiliares.

Hasta ahora las diferencias entre las ediciones gratuitas y registradas de los programas eran las detalladas en la siguiente entrada: diferencias entre las ediciones de los programas.

A partir de septiembre de 2018 he eliminado las restricciones de las ediciones gratuitas, que unicamente traen un mensaje de recordatorio de registro que se muestra periódicamente. De esta manera, las diferencias entre las ediciones registrada y gratuita son el nombre del ususario registrado en los distintos listados del programa y el mensaje recordatorio. Nada más.

Por esto, todas las versiones gratuitas añaden desde ahora las siguientes funcionalidades:

  • Selección de claves desde tablas auxiliares. Cuando tienes que introducir una clave desde una tabla auxiliar simplemente haz click en el botón marcado con […] que aparece al lado del campo, selecciona el valor que quieras y se introducirá en el campo.
  • Selección de claves desde tablas auxiliares.

  • Autocompletado de claves auxiliares. Otra manera de completar las claves desdes una tabla auxiliar es simplemente escribiendo en el campo el valor a introducir. Al hacerlo, el programa te mostrará una lista con los posibles valores de las claves que contienen la cadena tecleada y podrás seleccionar el valor que quieras con las flechas de cursor y pulando INTRO.
  • Autocompletado de valores desde tablas auxiliares.
    Autocompletado de valores desde tablas auxiliares.

  • Consulta de ejemplares desde tablas auxiliares. Desde cualquier tabla auxiliar podrás ves los ejemplares de la tabla principal que contienen esa clave, por ejemplo los libros de una materia o las recetas de un cocinero.

Todas las descargas de ediciones gratuitas de los programas se han actualizado con estas nuevas funcionalidades.

Quizá te preguntes ¿ para que quiero registrar el programa si la edición registrada no ofrece más funcionalidades que la edición gatuita del programa ? Pues una respuesta es que te quitas el mensaje recordatorio que aparece cada cierto tiempo, y la segunda es que con tu contribución estás apoyando la existencia de programas que se adaptan a tus necesidades o a tus gustos.

como incorporar los datos de azeta a cuaderno de bitácora

Configuración de datos de Azeta en Cuaderno de Bitácora.

Este post está dirigido a los usuarios de Azeta que van a recibir la nueva versión de Cuaderno de Bitácora y para usuarios de las dos aplicaciones que con la nueva versión de Cuaderno de Bitácora van a poder gestionar también sus documentos con este programa. Voy a explicar la manera de incorporar los datos de Azeta a Cuaderno de Bitácora.

    1. Copiar los datos de Azeta en una carpeta dentro de la carpeta de Cuaderno de Bitácora. Los datos de Azeta están por defecto en la carpeta c:\azeta\datos y se deben copiar en una carpeta dentro de Cuaderno de Bitácora, por ejemplo c:\bitacora\azeta.
    2. Descargar la nueva versión de Cuaderno de Bitácora y copiar el ejecutable en la carpeta del programa.
    3. Arrancar la aplicación e ir a la configuración del programa, que está en la pestaña ‘Configuración’ e indicar la ruta de las carpeta de datos de Azeta, de ZIP para copias de seguridad de Azeta y de PDF de listados de Azeta. La carpeta datos de Azeta deberá ser la carpeta donde hemos copiado los archivos, en mi caso c:\bitacora\azeta
    4. Configuración de datos de Azeta en Cuaderno de Bitácora.
      Configuración de datos de Azeta en Cuaderno de Bitácora.

    5. A continuación reindexar los ficheros de la aplicación desde la misma pestaña de utilidades. Durante el proceso de instalación el programa adapta los archivos de Azeta para ser usados dentro de Cuaderno de Bitácora.