backspaceware

Al instalar la última actualización de Paint.NET me llamó poderosamente la atención el siguiente mensaje que apareció en el formulario de instalación del programa.

No soy seguidor del blog del creador de Paint.NET, pero si lo he leido alguna vez y recordaba haber leido por encima algo sobre una copia del programa. Revisando el blog encontré la entrada en cuestión y la lei con mas detenimiento. Resulta que un programador había cogido el código fuente de Paint.NET, le había quitado la información relativa al autor original, había añadido una serie de plugins al programa y había creado un nuevo instalador. Pero con el detalle de borrar la información relativa a los créditos de los autores del programa y atribuyéndose la autoría del mismo. El programa era el original, y los plugins sacados de los foros del programa. Esta nueva manera de hacer software es bautizada por el programador de Paint.NET como backspaceware, software hecho borrando lo que no interesa de un código disponible.El caso es que el reempaqueteador es bien conocido por esas prácticas, y ya ha hecho lo mismo con otros programas. Para mas guasa, el nombre dado al programa reempaquetado fue Creative Paint, lo cual refleja el espiritu creativo del sujeto este.En el debate que acompaña al post se pueden leer opiniones para todos los gustos. Desde los que acusan de ladrón al reempaquetador, hasta los que dicen que de acuerdo a la licencia de Paint.NET – que parece ser una licencia MIT – se puede derivar cualquier trabajo sin tener que reconocer el trabajo del desarrollador original. Ahí es nada.Tras el revuelo armado con el tema, el desarrollador de Paint.NET ha conseguido que el programa reempaquetado desaparezca de la mayoría de sitios de descargas de software, y ha cambiado la licencia de Paint.NET a una CreativeCommons-By-Nd que obliga a mantener la atribución del software a su autor original y prohibe hacer productos derivados del programa.

autocompletado en FWH

Prologo: Quitando comboboxes – hace seis años.

En el caso de campos que son claves ajenas sobre otras tablas, pienso que se debe combinar la facilidad de la introducción de los datos correctos con la capacidad para dar de alta valores nuevos en la tabla auxiliar de una manera directa, y esto último no se puede hacer con comboboxes. Para ello utilizo una combinación de cuadro de texto donde el usuario escribe el valor del campo, y un botón que muestra un formulario de selección de valores. Si el usuario quiere escribir el valor de la clave ajena lo puede hacer directamente y el programa lo valida sobre la tabla auxiliar. Si el valor no está dado de alta en la tabla auxiliar el programa pregunta si se quiere dar de alta, y en caso afirmativo presenta el formulario de alta de la tabla auxiliar. Si el usuario no quiere escribir el valor, puede usar el botón que muestra el formulario de selección y elegir un valor o darlo de alta.Esta manera de hacer las cosas está bien, pero no es perfecta. Como me han comentado varios usuarios de mis programas, lo correcto sería que funcionase un autocompletado del campo de texto sobre el campo que es clave ajena en el mismo. Teclear los valores cada vez es pesado y lleva a errores si no recuerdas como has dado de alta cada valor. Por otra parte el soltar el teclado para hacer click en el botón y seleccionar el valor es un engorro que te hace perder tiempo, sobre todo si tienes que dar de alta muchos registros.

Fisgoneando por los foros de Fivetech encontré una clase TAutoGet que hace precisamente esto, un autocompletado sobre un array donde previamente se han introducido los valores. Incorporar esta clase a un programa es muy sencillo, basta con cargar los valores de los arrays de autocompletado antes de editar el campo correspondiente. Los resultados son espectaculares. Conforme tecleas las primeras letras del valor, te van apareciendo los valores que coinciden coon ellas. Una vez tienes el valor que quieres, con un tab validas el nombre y saltas al siguiente campo. Es mucho más cómodo que soltar el teclado, hacer click en el botón de al lado y ponerte a buscar el valor que quieres introducir. Pocas veces una clase tan pequeña me ha dado unos resultados tan espectaculares. Pura dinamita.

Para los perezosos de visitar el foro de Fivetech dejo un fichero con la clase TAutoGet completa: código fuente, fichero de preprocesado y un pequeño ejemplo, todo sacado del foro. Tengo ya el autocompletado implementado en Findemes, y estará disponible en la próxima versión que vamos a publicar el breve. Ahora estoy pensando en si el autocompletado irá en la edición gratuita o unicamente en la registrada, pero eso es otra historia.

msgbox a la windows vista

En mis programas tengo los mensajes del sistema personalizados. De esta manera controlo que mis programas siempre muestren los típicos mensajes de confirmación, información, alerta y parada de la misma manera en todas las versiones de Windows. También uso mis propios iconos para los mensajes, sacados de las colecciones de iconexperience que uso también en mis programas. De esta manera consigo uniformidad en los programas.

En Windows Vista los mensajes del sistema presentan un aspecto distinto a las anteriores versiones de Windows. Además de los iconos característicos de la nueva versión de Windows, el formulario está visualmente dividido en dos zonas, la de arriba es blanca y contiene el icono y el texto del mensaje, mientras que la parte de abajo es del color habitual del formulario y contiene el botón o botones del mismo.Con FWH es fácil hacer un formulario de estas características usando el control Pages. No hay más que definir el formulario con un control pages donde va la zona blanca y luego crear otro formulario que se solapará encima del anterior. La definición del formulario principal en el fichero RC es de la siguiente manera:

UT_INFO DIALOG DISCARDABLE 29, 34, 206, 88
STYLE WS_POPUP|DS_MODALFRAME|WS_CAPTION|WS_SYSMENU
CAPTION "Cuaderno de Bitácora"
FONT 8, "Ms Sans Serif"
{
  CONTROL "&Aceptar", IDOK, "Button", BS_DEFPUSHBUTTON|WS_TABSTOP, 144, 66, 50, 16
  CONTROL "", 110, "Static", SS_WHITERECT, 0, 0, 206, 60
}

El control que va a contener el control page es el identificado con 110. La definición del formulario que va dentro del control Page del formulario principal es como sigue:

UT_INFO_PAGE DIALOG DISCARDABLE 77, 112, 203, 60
STYLE WS_CHILD|WS_CLIPCHILDREN
FONT 8, "MS Sans Serif"
{
  CONTROL "", 10, "Static", WS_GROUP, 48, 8, 142, 44
  CONTROL "", 111, "TBitmap", 0x00000000, 8, 4, 36, 36
}

El código de la función que muestra el formulario es el siguiente:

FUNCTION msginfo(cText, cCaption)
   LOCAL oDlgInfo, oPage
   LOCAL oBmp

   DEFAULT cCaption := oApp():cAppName+oApp():cVersion

   DEFINE DIALOG oDlgInfo RESOURCE "UT_INFO" TITLE cCaption
   oDlgInfo:oFont  := oApp():oFont

   REDEFINE PAGES oPage ID 110 OF oDlgInfo ;
      DIALOGS "UT_INFO_PAGE"
	oPage:oFont := oApp():oFont

   REDEFINE SAY PROMPT cText ID 10 OF oPage:aDialogs[1]
   REDEFINE BITMAP oBmp ID 111 OF oPage:aDialogs[1] RESOURCE "xpinfo" TRANSPARENT

   REDEFINE BUTTON ID IDOK OF oDlgInfo  ;
      ACTION oDlgInfo:End()

   ACTIVATE DIALOG oDlgInfo ;
      ON INIT oDlgInfo:Center( oApp():oWndMain )

RETURN Nil

con lo que conseguimos un formulario como el siguiente:

la cocina de Maetiare

Cuando te dedicas a vender software por internet te pueden pasar cosas curiosas. Una de ellas puede ser conocer personas que se vuelven usuarios entusiastas de tus programas y te animan constantemente a mejorarlo y a introducir nuevas funcionalidades a los mismos. Esto fue lo que me pasó con Esther P.S. y mi programa el Puchero. Esther hizo que el Puchero evolucionara de una manera tremenda gracias a su empeño y tenacidad en conseguir un programa mejor que el que utilizaba por entonces. El salto de calidad que dió el programa con la versión 4 fue en gran parte culpa suya, ya que participó activamente en su desarrollo junto con otros usuarios aportando ideas y testeando el programa.Esther tiene desde hace tiempo un blog sobre cocina, donde publica muchas de sus recetas. El blog tiene por nombre La cocina de Maetiare su nick en algunos de los foros de cocina en que participa. Además de publicar estupendas explicaciones de las recetas con imágenes incluidas en su blog, Esther tiene la consideración de publicar las mismas recetas en formato de el Puchero en el foro de cocina que tenemos en la web de alanit, de manera que la incorporación de sus recetas al programa es cosa de un click.