Mostrando entradas con la etiqueta vfpx. Mostrar todas las entradas
Mostrando entradas con la etiqueta vfpx. Mostrar todas las entradas

domingo, mayo 18, 2014

Nueva versión v1.19.22 de FoxBin2Prg (Arreglo de bugs, mejoras y optimizaciones)

Por: Fernando D. Bozzo

Está liberada la versión v1.19.22 de FoxBin2Prg con los siguientes cambios:

  • Bug Fix scx/vcx: La propiedad Picture de una clase form se pierde y no muestra la imagen. No ocurre con la propiedad Picture de los controles (Fidel Charny). Este problema ocurre cuando se ordenen las propiedades internas del form de cierta forma. FoxPro las necesita en cierto orden --que no está documentado-- para que funcionen correctamente. Regenerando el binario desde el tx2 existente se soluciona el problema.
  • Bug Fix scx/vcx: Algunas opciones del optiongroup pierden el width cuando se subclasan de una clase con autosize=.T. (Miguel Duran). Este problema está relacionado con el anterior, ya que también depende del orden de las propiedades internas, por lo que he realizado un estudio más a fondo de todas las propiedades de todas las clases de VFP 9 (ver Excel en directorio TESTS del proyecto) y las he agrupado para poder obtener un orden de propiedades con las ubicaciones más habituales. Para disminuir la posibilidad de conflictos, hay un segundo order que va por clase, donde se usa el orden exacto que usa VFP 9. El mejor caso es aquel donde cada clase se programan sus propiedades de una sola vez (aquí se usa el ordenamiento exacto por clase), y el peor caso es cuando se subclasa un contenedor de controles y en la subclase se redefinen las propiedades de los mismos (aquí se usa la lista genérica porque no se sabe qué propiedad corresponde a qué clase, ya que FoxPro guarda todo como una gran lista).
  • Agregado soporte de evaluación de propiedades desde archivo externo (props_*.txt). Todo lo anterior, y también por motivos de performance y mantenimiento, ha motivado la creación de listas de propiedades en archivos de texto independientes, uno por cada clase y uno genérico que las contiene a todas.
  • Bug Fix scx/vcx: La detección incorrecta de PROCEDURE/ENDPROC/TEXT/ENDTEXT puede causar pérdida de algunos métodos en determinadas circunstancias (Andres Mendoza). Si por alguna casualidad, en el código hay alguna variable que comience por "TEXTxxx", esto ocasiona que el parser la confunda con la estructura TEXT/ENDTEXT y considere todo lo posterior como si fuera parte del mismo método. El efecto visual en el tx2 es la pérdida de la indentación y la duplicación de los métodos antes agrupados como métodos vacíos. Si se conserva este tx2 se puede recuperar el binario original regenerándolo con esta versión, pero si se usó la versión defectuosa (v1.19.21 y anteriores) para regenerar el binario, en el peor caso podrían perderse métodos y ser necesario restaurar desde un backup previo.
  • Mejoras en Tests Unitarios de comparación de bitmap de pantallas antes/después (se compara contra regenerado de regenerado por si hubiera algún cambio). Estos han sido unos tests costosos de montar, ya que el objetivo era probar todos los controles visuales de FoxPro en distintas configuraciones (control y subclase de control), como así también la comprobación de que se siguen ejecutando correctamente algunos eventos como Access, Assign y programmaticChange, para tener más seguridad de los cambios realizados en el ordenamiento de las propiedades.
  • Agregado Unit Testing de la configuración por defecto, por archivo y por parámetros. Se han agregado tests automatizados para los tres tipos de configuración, donde el orden de prioridad es: 1-Parámetros, 2-foxbin2prg.cfg, 3-Valores por defecto
  • Agregado Unit Testing para comprobar generación de clases, forms, reportes y menús. De varios componentes se han guardado las versiones texto para poder compararlas con las que se regeneren desde los binarios, y así poder saber si algún cambio futuro provoca algún cambio en la generación de los tx2.
  • Agregado nuevo switch OptimizeByFilestamp (activo por defecto) que permite desactivar la optimización de regeneración de archivos según el timestamp, en el caso de querer regenarar siempre. Desde la versión v1.19.21 hay una optimización sugerida por Matt Slay, en la que si el archivo a regenerar (ej: un binario) tiene una fecha/hora más nueva que el archivo base (ej: un tx2), significa que no es necesario volver a regenerar porque el archivo a generar (destino) es más nuevo que el archivo origen. Igualmente, como siempre pueden haber casos especiales donde este no sea el comportamiento deseado y se requiera regenerar siempre el destino, hay un nuevo switch, tanto en el archivo de confguración foxbin2prg.cfg como por parámetro, llamado OptimizeByFilestamp, donde se puede inhabilitar asignándole "0".
  • Optimización en garbage collect en todo el código. Se han hecho muchos cambios para mejorar la recolección de basura (liberación de objetos y referencias de objetos principalmente), lo que ha mejorado perceptiblemente la estabilidad durante la ejecución de los tests automatizados.


Como actualizar el FoxBin2Prg existente:
Con descargar el zip y reemplazar los archivos en el sitio que los hayan puesto antes es suficiente.


Link  de descarga:
https://vfpx.codeplex.com/releases/view/116407


 Saludos!

jueves, mayo 01, 2014

Nueva versión v1.19.21 de FoxBin2Prg (Mejoras y Optimizaciones)

Por: Fernando D. Bozzo

Está liberada la versión v1.19.21 de FoxBin2Prg con los siguientes cambios:

    • Agregado soporte para convertir a texto o binario todos los archivos de un proyecto desde pjx o pj2 (Matt Slay). Gracias al feedback en el foro Google de Thor (Proyecto VFPx), me comentaron que sería útil poder pasar todos los archivos de un proyecto PJX a texto (y viceversa), por lo que se agregó esa posibilidad. Para hacerlo, se debe ejecutar desde la ventana de comandos: DO foxbin2prg WITH "<path>\proyecto.pjx", "*" . El último asterisco hace la diferencia entre el proyecto solo o todos los archivos del proyecto.
    • Optimización de búsqueda del programa de capitalización al procesar proyectos. Junto al nuevo soporte anterior, hay una optimización para no buscar una y otra vez por cada archivo escaneado si existe el programa de capitalizaciones, lo que implica un acceso extra al disco, por lo que ahora se cachea en memoria al inicio del escaneo.
    • Agregado AGAIN a la apertura SHARED de las tablas, para permitir concurrencia (Jim Nelson).
    • Agregada optimización basada en la la fecha/hora de modificación de los archivos para regerenar solo los archivos binarios y tx2 modificados (Matt Slay). Esta optimización puede mejorar mucho los tiempos de generación de los archivos binarios o tx2 de un proyecto o directorio, ya que solo se generarán los que hayan cambiado desde la última generación. Esto se hace comparando los timestamps de cada binario y su tx2, y fue sugerido por Matt Slay en el foro de Thor.
    • Agregada traducción al inglés en foxbin2prg_en.h del mensaje de LOG para la nueva optimización
    • Simplificación de la sección <DefinedPropArrayMethod>: Los métodos y arrays ya no requieren los símbolos * y ^ delante. Hasta ahora, en esta sección los métodos llevaban "*" por delante, y los arrays llevaban "^", ya que así es como está guardado en la tabla. Desde esta versión ya no requieren llevar esos símbolos por delante, y tampoco se generarán en los tx2, solo se generarán al actualizar los binarios. Esto mejora y simplifica el mantenimiento de este bloque. Igualmente se mantiene la compatibilidad con los archivos tx2 existentes que tengan esos símbolos.


    Como actualizar el FoxBin2Prg existente:
    Con descargar el zip y reemplazar los archivos en el sitio que los hayan puesto antes es suficiente.


    Link  de descarga:
    https://vfpx.codeplex.com/releases/view/116407


     Saludos!

    jueves, abril 17, 2014

    Nueva versión v2.4.14 de las herramientas Visual FoxPro 9 para PlasticSCM (Incluye FoxBin2Prg.exe v1.19.20)

    Por: Fernando D. Bozzo

    Está liberada la versión v2.4.14 de las herramientas Visual FoxPro 9 para PlasticSCM, con los siguientes cambios:

    - Actualizada la versión de FoxBin2Prg (solo el EXE) a la versión v1.19.20



    Estas herramientas son un grupo de scripts vbs y programas Visual FoxPro 9 que se configuran dentro de PlasticSCM para poder invocar a FoxBin2Prg (incluye solo el EXE) desde dentro de la interfaz de Plastic.

    El README.txt explica como se configura en Inglés y Español.

    Nota: Los fuentes de FoxBin2Prg están en CodePlex, en el link indicado arriba en la versión.


    Como actualizar las existentes:
    Con descargarlas y reemplazar los archivos en el sitio que los hayan puesto antes es suficiente.


    Link de descarga:
    https://github.com/fdbozzo/foxpro_plastic_diff_merge


    Saludos!

    Nueva versión v1.19.20 de FoxBin2Prg (Mejoras)

    Por: Fernando D. Bozzo

    Está liberada la versión v1.19.20 de FoxBin2Prg con los siguientes cambios:

    • Nuevo: Relativización del path de los CDX dentro de los DB2. Hasta ahora, cuando se generaba el DB2 de un DBF, el CDX se generaba con una ruta absoluta, lo que es un problema si 2 personas tienen la misma tabla sin cambios pero en distintos directorios, porque al hacer checkin en un SCM se generan cambios que no son reales ni importantes. Ahora estas diferencias no se general.
    • Nuevo: Recompilación del EventsFile del DBC, si existe, para evitar errores al regenerar el DBC. Si el DBC tiene un archivo PRG de eventos asociado, se genera el DB2 y se cambia a otro directorio, al regenerar el DBC desde el nuevo directorio, puede dar errores de que no se encuentra el archivo PRG de eventos, aunque esté copiado allí. Lo que se hace ahora es recompilar ese PRG y luego regenerar el DBC desde el DB2, lo que evita el error.

    Como actualizar el FoxBin2Prg existente:
    Con descargar el zip y reemplazar los archivos en el sitio que los hayan puesto antes es suficiente.


    Link  de descarga:
    https://vfpx.codeplex.com/releases/view/116407


     Saludos!

    miércoles, abril 02, 2014

    Nueva versión v1.19.19 de FoxBin2Prg (Nuevo Hook)

    Por: Fernando D. Bozzo

    Está liberada la versión v1.19.19 de FoxBin2Prg con los siguientes cambios:

    • Nuevo: Hook para DBFs que permite intercalar un proceso personalizado entre la creación del DBF y la creación de sus índices (ejemplo "tests\demo_hook_dbf.prg" incluido). Este agregado le puede servir a quienes usen FoxBin2Prg como objeto por programa. El Hook consiste en la creación de un encganche donde se puede lanzar una rutina personalizada, por ejemplo de carga de datos, entre la creación de la tabla y la creación de los índices cuando se procesa un archivo DB2.

    Como actualizar el FoxBin2Prg existente:
    Con descargar el zip y reemplazar los archivos en el sitio que los hayan puesto antes es suficiente.


    Link  de descarga:
    https://vfpx.codeplex.com/releases/view/116407


     Saludos!

    martes, marzo 25, 2014

    Nueva versión v1.19.18 de FoxBin2Prg (arreglos)

    Por: Fernando D. Bozzo

    Está liberada la versión v.1.19.18 de FoxBin2Prg con los siguientes cambios:

    • Arreglo bug scx/scx: Los controles imagen con imagenes estrechadas, se redimensionan a su tamaño original (Arturo Ramos). Si, por ejemplo, se usa un control imagen con una imagen de 32x32 pixels y se redimensiona a 16x16, al regenerar el binario se pierde la nueva dimensión y se restablece a la original. Regenerando el binario desde el vc2/sc2 existente se soluciona el problema.
    • Arreglo bug vcx/scx: Los comentarios a nivel de librería no se mantienen (Ryan Harris). Si se usan comentarios a nivel de librería (hasta donde sé, solo desde el Class Browser se pueden modificar), estos no se exportan al vc2/sc2 y por lo tanto tampoco al binario al regenerarlo. Ya se exportan estos comentarios

    Como actualizar el FoxBin2Prg existente:
    Con descargar el zip y reemplazar los archivos en el sitio que los hayan puesto antes es suficiente.


    Link  de descarga:
    https://vfpx.codeplex.com/releases/view/116407


     Saludos!

    martes, marzo 18, 2014

    PlasticSCM: ¿Qué es el Merge?

    27/09/2014 - Actualizadas algunas partes de "Qué son los conflictos de un merge"
    16/09/2014 - Actualizado con explicación de "Qué son los conflictos de un merge"
    02/04/2014 - Actualizado con explicación de la opción "Proteger los cambios a otra rama..."

    Por: Fernando D. Bozzo

    El Merge es la operación que permite "mezclar" el código correspondiente a dos modificaciones simultáneas hechas en paralelo a un mismo programa.

    Para quienes vienen de usar SourceSafe con FoxPro, esto es algo casi desconocido, porque con SourceSafe se usaba el scctext.prg que venía de serie y que sólo permitía hacer Diff. Algunos más aventurados puede que hayan intentado usar TwoFox para generar vistas XML de las clases e intentar hacer un merge manual, pero quienes lo hayan usado sabrán el cuidado que había que tener con no tocar ningún tag XML que nada tenía que ver con la programación y que dificultaba bastante entender lo que se estaba tocando.

    La vida con SourceSafe era: o toco yo, o toca él, pero los dos no! La única excepción eran los PRG, que al ser texto sí que permitían más libertad, pero para todo lo demás, los checkout eran exclusivos, lo que significa que si un desarrollador bloqueaba una librería, nadie más podía modificarla hasta que ese desarrollador finalizara sus cambios, ¡y qué problemas se generaban si se enfermaba o se iba de vacaciones y la dejaba así! Claro que siempre se podía recurrir al truco de quitar el atributo de read only del archivo y modificarlo, pero subir los cambios al proyecto era imposible, y esto a muchos proyectos los bloqueaba literalmente, o como mínimo los retrasaba.


    Volviendo al presente, las cosas cambiaron en FoxPro, y ahora con FoxBin2Prg un mismo programa, como clases, forms, menús, etc, puede ser modificado por varios desarrolladores de forma simultánea, cada uno en su equipo, y al momento de subir esas modificaciones al control de código se puede hacer el merge, en algunos casos de forma automática (para el primero en llegar: ¡siempre es automático!:) y en otros casos de forma manual.


    [27/09/2014 - 16/09/2014 - Actualizado >>]

    ¿Qué son los conflictos de un Merge?


    Cuando se hacen modificaciones sobre un mismo componente pero en distintas ramas, al tener que mezclar los cambios es probable que haya que resolver (seleccionar/mezclar) las diferencias entre 2 modificaciones realizadas al mismo form, clase, etc, de forma que tanto los cambios de una rama como de la otra queden incluidos.

    Las ramas a mezclar pueden ser, por ejemplo, distintas características hechas por uno o más desarrolladores trabajando en paralelo, como una rama para cambiar el aspecto visual y otra rama para cambiar la funcionalidad de un botón de comando, lo que permite que al final se pueda seleccionar la característica o funcionalidad que se quiere incorporar individualmente y mezclarlas para obtener el resultado completo final.

    Al trabajar en funcionalidades en ramas paralelas, es probable que se modifique algo en común, como una propiedad o un método, lo que provocará un conflicto al hacer el merge, que podrá ser automático o manual dependiendo de la calidad del algoritmo de la herramienta y de las características del código (si está bien estructurado, encapsulado y normalizado, será más fácil)

    La idea de generar código estilo PRG con FoxBin2Prg, es justamente para que a la hora de hacer un merge sea casi tán fácil como hacerlo con un PRG de verdad, y dado que conocemos el lenguaje, ver el código de esta forma nos facilita la tarea lo más posible, ya que no hay que lidiar con códigos o símbolos extraños, sino sólo con el PRG y con los metadatos que se muestran como comentarios, donde suele ser muy poco lo que debe hacerse.

    Obviamente, es necesario entender qué hace el código antes de realizar esta operación, y en eso ayuda bastante usar la nomenclatura de objetos y variables que dan una idea conceptual de para qué sirve cada cosa y qué tipo de dato maneja.
    [<<]

    Para los que les toque hacerlo de forma manual, los SCM traen herramientas para realizar la tarea, que suele mostrar las dos versiones del programa a unificar en dos paneles izquierdo-derecho. En la siguiente imagen se puede ver un ejemplo de WinMerge, un programa para Windows gratuito que permite ver diferencias entre archivos:



    Este tipo de vista es muy útil cuando comparamos dos momentos de la historia del mismo archivo, como la versión de ayer y las modificaciones de hoy, pero no sirve cuando se quieren comparar 3 archivos, donde uno es la base, o sea, de donde partieron los otros dos archivos, el segundo es el mismo archivo base, pero modificado por un desarrollador y el tercero es el mismo archivo base, pero modificado por otro desarrollador.

    En esta situación se requiere un visualizador de 3 vías, que muestre la base y los 2 cambios, y el programa que incorpora Plastic para esta tarea es increíble:


    En la imagen puede verse en el panel izquierdo (Source, u Origen) los cambios que hizo Dev-2, que agregó Los métodos pagCalculos.Activate y cmdCalcular.Click (abajo se ve el nombre entero), pero resulta que mientras él estaba programando este cambio, Dev-1 terminó el suyo antes y lo mergeó primero (panel derecho, que es Destination o Destino) donde se ve que agregó en el mismo form el método pagDatos.Activate, seguramente con un merge automático en el que no tuvo que hacer nada.

    En el panel central se ve el código original (Base) antes de que ambos hicieran sus cambios, que si bien en este caso no muestra cambios en sí mismo, cuando los muestra lo hace coloreado en amarillo.


    En la cabecera de los tres paneles, los títulos coloreados Source, Base y Destination, además son selectores de cambios:



    donde al clickearlos sus cambios se activan o desactivan en el panel inferior que muestra el resultado. En este caso están habilitados los cambios de ambos desarrolladores en el panel izquierdo de Dev-2 y en el derecho de Dev-1, por lo que aquí se muestra cómo quedaría la mezcla de los mismos:


    Algo que también se puede ver, aunque no resulte evidente, es que esta mezcla se muestra bien y con lógica coherente porque la nomenclatura usada le permite a los algoritmos internos de la herramienta diferenciar ambos cambios y gracias a eso no es necesario modificar nada a mano.

    Esto último lo comento porque puede darse el caso de que, incluso con una buena nomenclatura, dada la complejidad de los cambios puedan presentarse varias diferencias que puedan no ser coherentes para quien las esté mirando, y que requieran modificar o mover manualmente líneas o bloques de código para terminar de ajustar el merge, que también consiste en eso. Este panel inferior permite hacer dichas modificaciones manuales.

    Por ejemplo, uno de los casos que puede requerir modificación manual, es cuando se trabaja con un pageframe y mientras otro desarrollador agrega una página y hace checkin, nosotros modificamos algo en la actual y hacemos checkin. Como nosotros teníamos una página de menos, podría ser necesario actualizar el PageCount manualmente.
    Quice hacer esta prueba para hacerles una captura, pero resulta que Plastic me hizo este cambio de forma automática y me dejó sin nada que hacer ;-)

    Igualmente hago la captura para que lo vean: La zona horizontal del medio es donde está el PageCount, el panel izquierdo tiene mis cambios, que en esta parte del código no tengo, en el medio está el origen del que partí y donde se vé que había 2 páginas, y el de la derecha es el destino, o sea, donde estoy intentando hacer el merge, y automáticamente desactivó los cambios 1 (Origen) y 2 (Base) y seleccionó el del panel 3 (Destino), además se puede observar en la parte superior izquierda el título:

    "Tipo de conflicto: Automático. No es necesaria la intervención del usuario"... =D


    También puede verse en la cabecera, que de los 10 cambios detectados, solo 1 no es automático!, o sea que los otros 9 los resolvió automáticamente por los algoritmos internos, y yo debo resolver el restante, que en este caso es este:


    Observen que el selector de cambios (izquierda) y el selector de cambios no automáticos (derecha) tienen botones de navegación independientes, lo que permite navegar por todos los cambios o solo por los cambios no automáticos (1 en este caso). Revisar todos los cambios es buena idea, aunque sea para asegurarse de que la parte automática fue bien resuelta.

    Solo para que vean como resolví este cambio manual, desactivé los cambios del lado izquierdo, ya que pueden verse que un poco más arriba (imagen de abajo), aunque en este caso daba igual, porque con el lado izquierdo activo ya los marcaba tachados antes, lo que significa que no se iban a incluir esas líneas, pero que igualmente requería nuestro visto bueno.

    El caso anterior se podía resolver de dos formas:
    1. Desmarcando el Origen y dejando solamente la Base y el Destino (fue como lo hice)
    2. Eligiendo el botón superior que en la captura anterior decía "Marcar como resuelto", ya que las líneas tachadas iban a excluirse de todas formas
    Nota: Es importante comprobar siempre todos los cambios, y si la activación o desactivación de los paneles superiores no ofrece el resultado esperado, siempre se puede recurrir al 4 panel (el inferior, de resultado) donde se puede modificar manualmente.


    Así quedó la resolución del conflicto anterior, donde desmarqué el origen:


    Finalmente, se guardan los cambios de este merge con el botón superior izquierdo, lo que cerrará esta ventana y puede que muestre otros merges para hacer.

    Hay 3 cosas importantes que se deben conocer y recordar en esta etapa:

    1. Que si se necesita dejar esto para luego, se puede cerrar la ventana de merge "sin guardar cambios". Si hubiera muchos archivos por resolver, al cerrar la ventana se puede ver brevemente el botón "Cancelar" en la principal, al que hay que darle rápido antes de que aparezca una nueva ventana de merge. Parece un juego, pero es algo que deberían mejorar en la interfaz :D
    2. Que una vez guardados los cambios del merge, quedarán todavía los binarios de FoxPro, los cuales se deben seleccionar e ignorar, ya que luego deberán regenerarse en la siguiente ventana de Cambios Pendientes, ya que el merge en Plastic tiene 2 etapas: Procesar Merge, donde se resuelven los conflictos, y Regeneración de binarios y Checkin en la ventana de Cambios Pendientes.
    3. Que una vez se esté en la ventana de Cambios Pendientes, se debe recordar que por haber hecho un Merge con las versiones texto ¡los binarios que hay allí no sirven y hay que regenerarlos!

    Comento un poco más estas opciones, ya que cuando hagan merge será vuestro día a día.

    En el ejemplo anterior yo cancelé el merge porque solo quería mostrarles la pantalla, así que "cerré sin guardar cambios" (o sea, hice el paso 1)

    El paso 2 implica seleccionar todos los binarios que se muestran en esta ventana de Merge y descartarlos, lo que significa dejar los que ya existen en el workspace (también llamado Destino), ya que han quedado desactualizados porque los cambios reales del Merge los hicimos en las versiones texto, como vemos en la siguiente imagen:


    Nota: Si hubiera confirmado los cambios del merge, esta ventana no mostaría ahora las versiones de texto de los archivos, ya que hubieran pasado a la ventana de Cambios Pendientes.

    El paso 3 ya se realiza en la ventana de Cambios Pendientes, pero a diferencia de lo que venimos haciendo cuando modificamos un binario en el IDE de FoxPro (generar texto y luego binario), en este caso solo debemos regenerar el binario, ya que es el texto el que estuvimos modificando. Si no lo hacemos así, perderemos todos los cambios del merge y nos estaremos quedando con los archivos binarios del workspace y en el peor caso también con las versiones texto mezcladas que ya no corresponderán a esos binarios!

    Lo repito para remarcar: Luego de un Merge, mandan siempre las versiones texto, ya que es con lo que se ha trabajado en esta operación, por lo que sólo se deben regenerar los binarios usando el script de "Cambios Pendientes: Regenerar Binarios".

    Y luego se hace el checkin para guardar todo.

    Les dejo un video de ejemplo con explicación incluida:
    http://youtu.be/ytMpWP69YMo


    [02/04/2014 - Actualizado >>]
    Respecto al checkin hay una opción que debemos conocer, y que es "Proteger los cambios a otra rama...", y la verdad es que es una opción muy útil que me ha tocado usar más de una vez.

    Imaginemos que abrimos FoxPro en el workspace y comenzamos a trabajar, hacemos algunos cambios, algunas pruebas y vamos a Plastic para guardar los cambios, pero nos encontramos con que, sin quererlo, estábamos trabajando en la rama principal (esa en la que no se deben hacer cambios directamente, sino solo merge :-) y nos olvidamos de crear una rama nueva para trabajar. ¡Por Dios! ¿qué hacemos ahora? Fácil: usamos esta opción y creamos el changeset en una nueva rama, todo en un mismo paso:


    Se nos pregunta el nombre de la rama y al confirmar nuestros cambios irán directamente a ella, dejando la rama principal como estaba.

    En esta pantalla donde nombramos la nueva rama además tenemos otra opción interesante, que es un checkbox que nos permite pasar los cambios a la nueva rama, pero sin hacer checkin (por defecto hace checkin), lo que viene muy bien si solo queremos pasar nuestros cambios aún sin terminar a la nueva rama para hacer más tarde el checkin nosotros cuando realmente hayamos acabado los cambios:



    [<<]


    Como nota final, es interesante saber que este programa de merge se puede usar por separado, o sea, viene con Plastic y está un su directorio de instalación, pero se puede ejecutar por separado. Se llama "mergetool.exe" y tiene una opción dedicada en le menú de Windows, dentro del menú "Client Tools" de Plastic.

    Nada más por hoy.

    Hasta la próxima entrada! :D




    domingo, marzo 16, 2014

    Nueva versión v1.19.17 de FoxBin2Prg (arreglos)

    Por: Fernando D. Bozzo

    Está liberada la versión v.1.19.17 de FoxBin2Prg con los siguientes cambios:

    • Arreglo bug frx/lbx: Las expresiones con comillas corrompen el fx2/lb2 (Ryan Harris). Si dentro de una campo, por ejemplo Comment, Tooltip u otro, contiene expresiones combinadas con cadenas entrecomilladas (ej: "este dato" + " este otro"), el archivo fx2/lb2 generado es inválido. Regenerando el fr2/lb2 se corrige
    • Arreglo bug frx/lbx: La propiedad Comment se pierde si es multilínea (Ryan Harris). En los reportes hay una parte de las propiedades del generador que permite escribir comentarios y tooltips multilínea. Normalmente no se usan, pero si se usan y además se escribe alguna línea con <CR>, el archivo fr2/lb2 generado es inválido. Regenerando el fr2/lb2 se corrige
    • Arreglo bug frx/lbx: Si la condición de impresión de un campo contiene una expresión con <CR>, se corrompe el archivo fr2 y luego el binario. Los reportes y etiquetas permiten indicar una condición para imprimir, o no, según devuelva True o False. Si de alguna forma se logra saltear la validación del editor de expresiones para poner un <CR>, el archivo fr2/lb2 generado es inválido. Regenerando el fr2/lb2 se corrige
    • Mejora de tag2 en frx/lbx para que muestre el valor real y no el codificado b64. El campo tag2 de los frx/lb2 puede contener información en texto limpio, como los tooltips, o información binaria y por eso siempre los codifiqué en base 64. Desde esta versión distingo si el campo se usa para tooltips o no, y si contiene texto plano no lo codifico para que se pueda leer en claro. Regenerando el fr2/lb2 se codificará como se indicó. Están afectados los archivos fr2/lb2 anteriores que usen tooltips y siguen codificados en b64
    • Arreglo bug mnx: Los comentarios multilínea en los Bars/Pads corrompen el MN2 y el MNX regenerado (Ryan Harris). Mismo problema que lo comentado para los frx/lbx, y aplicable solo si se han usado comentarios multilínea. Regenerando el mn2 se corrige
    • Arreglo bug mnx: Algunos procedimientos no se generan correctamente (Ryan Harris). Esto realmente tiene que ver con condiciones mal formadas o hacks raros en los archivos MNX, pero igualmente algunos valían la pena prevenirlos para evitar errores. Regenerando el mn2 se corrige
    • Correcciones al archivo de traducción al Inglés foxbin2prg_en.h (Ryan Harris). Agradezco a Ryan el haberme enviado el archivo de traducción al inglés con las correcciones de sintaxis.
    • Arreglo bug vcx/scx: Si la propiedad Dataenvironment se guarda en minúsculas, no se calcula el valor de Reserved2. Esto tiene que ver con una de las últimas mejoras de capitalización de nombres de clase y de objetos para evitar diferencias en las herramientas SCM, pero los vcx/scx parece que funcionan igual. Regenerando el vc2/sc2 se corrige
    • Adaptaciones en algunos tests unitarios FoxUnit para permitir diferencias de capitalización en algunos campos
    • Arreglo bug mnx: Usar comillas en el prompt de una opción genera un mn2 inválido (Ryan Harris). Esto tiene que ver con hacks raros en los nombres de las opciones. Regenerando el mn2 se corrige

    Como actualizar el FoxBin2Prg existente:
    Con descargar el zip y reemplazar los archivos en el sitio que los hayan puesto antes es suficiente.


    Link  de descarga:
    https://vfpx.codeplex.com/releases/view/116407


     Saludos!

    lunes, marzo 10, 2014

    Nueva versión v1.19.16 de FoxBin2Prg (arreglos)

    Por: Fernando D. Bozzo

    Está liberada la versión v.1.19.16 de FoxBin2Prg con los siguientes cambios:

    • Arreglo bug vcx/scx: las propiedades pierden la visibilidad hidden/protected cuando no tienen valor asignado (Ryan Harris). Afecta a los binarios que tengan definidas propiedades así.
    • Arreglo bug vcx/scx: valor character con longitud >255 en propiedad de addobject, se regenera con tag <fb2p_value> incluido (Ryan Harris). Difícilmente se encuentren propiedades con esta longitud de valor asignado en tiempo de diseño, pero si las hay, se estaban restaurando con un tag <fb2p_value> incluido como parte del valor. Afecta a los binarios que tengan definidas propiedades así.
    • Arreglo bug vcx/scx: Al regenerar binario con procedimiento vacío hace que se cuelgue FoxPro al intentar modificar
    • Arreglo bug scx/vcx: Si la clase tiene un comentario multilínea, el binario generado se puede corromper (Tested on: Ffc\_frxcursor.vcx). Otra rareza encontrada en uno de los archivos de las FCC que vienen con Fox, una librería con una clase cuyo comentario es multilínea (tiene un pedazo de documentación pegado dentro!). Afecta a los archivos tx2 generados, y a los binarios regenerados desde éstos.
    • Arreglo bug: Si _memberdata contiene CR entre sus valores, esos valores pueden perderse al regenerar el tx2. Caso encontrado en un par de librerías de las FFC que vienen con Fox. Afecta a los archivos tx2 generados, y a los binarios regenerados desde éstos.
    • Arreglo bug: Los valores de las propiedades con espacios a la derecha pierden esos espacios Caso encontrado en un par de librerías de las FFC que vienen con Fox. Afecta a los archivos tx2 generados, y a los binarios regenerados desde éstos.
    • Arreglo de bug: cuando 2 o más métodos contienen el mismo nombre (ej: met y met2) se genera mal el tx2 (Ryan Harris). Afecta a librerías o forms que usen nombres de métodos contenidos dentro de otros nombres, por ejemplo, "mimetodo" esta contenido dentro de "mimetodo1" y dentro de "mimetodo2". Afecta a los archivos tx2 generados, y a los binarios regenerados desde éstos.

    Como actualizar el FoxBin2Prg existente:
    Con descargar el zip y reemplazar los archivos en el sitio que los hayan puesto antes es suficiente.


    Link  de descarga:
    https://vfpx.codeplex.com/releases/view/116407


     Saludos!

    miércoles, marzo 05, 2014

    Nueva versión v1.19.15 de FoxBin2Prg (3 arreglos, 1 mejora)

    Por: Fernando D. Bozzo

    Está liberada la versión v.1.19.15 de FoxBin2Prg con los siguientes cambios:

    • Arreglo bug información OLE que se borra cuando se procesa un TX2 legacy. Los archivos tx2 generados con versiones anteriores a la v1.19.7 ponían la información de objetos OLE en la cabecera del archivo y otra parte en el objeto que lo usaba. Al procesar esos archivos con las versiones posteriores del programa, la información OLE no se guardaba en el binario. Cualquier binario que use objetos OLE que se regenere con esta versión partiendo de un tx2 antiguo, ya queda bien.
    • Arreglo bug valor por defecto de NoTimestamp = 0 (ahora es 1, como debe ser). Este es un valor que inicialmente se respetaba, hasta descubrir que Fox no lo usa para nada, por lo que por defecto se limpia automáticamente para minimizar diferencias en los SCM.
    • Arreglo bug tablas que pierden el backlink cuando se regenera el DBC (Ryan Harris). Un descubrimiento respecto de esto: Si se regenera un DBC con CREATE DATABASE <nombre> y el DBC existía, se limpian todos los backlinks a las tablas hijas, lo que no está documentado y queda solucionado borrando primero el DBC.
    • Mejora: Capitalización a minúsculas del nombre de archivo que se muestra en el header de los archivos tx2 para evitar diferencias por este dato. En la cabecera de los archivos tx2 se generan unos comentarios de aviso y un par de datos extra, la versión de FoxBin2Prg y el nombre de archivo original. Ahora se genera este nombre siempre en minúsculas para evitar que surjan diferencias al comparar con uno anterior y distinta capitalización.


    Link  de descarga:
    https://vfpx.codeplex.com/releases/view/116407


     Saludos!

    sábado, marzo 01, 2014

    Nueva versión v1.19.14 de FoxBin2Prg (arreglos, optimizaciones)

    Por: Fernando D. Bozzo

    Está liberada la versión v.1.19.14 de FoxBin2Prg con los siguientes cambios:

    • Optimizada la carga de la configuracion (foxbin2prg.cfg) una única vez en un proceso masivo de múltiples conversiones. Mientras solucionaba un problema reportado en los scripts, encontré que cuando se hacen procesos masivos usándolos con el método de "Enviar A", el archivo de configuración era cargado por cada archivo procesado. Ahora se carga una sola vez y mantiene la configuración en memoria hasta finalizar el proceso, evitando un acceso a disco y lectura de archivo por cada archivo procesado.
    • Modificados los scripts .vbs para respetar la configuración del soporte de conversiones definido en el archivo de configuración foxbin2prg.cfg. Estos scripts los había hecho al inicio del proyecto y contenían algunas evaluaciones hardcodeadas que fueron creadas antes del archivo de configuración foxbin2prg.cfg, pero a partir de haber potenciado este archivo no había vuelto a modificarlos hasta ahora, donde los actualicé para respetar la configuración de tipos de conversión soportados para no generar errores, por ejemplo, si se configura que no se desea regenerar los DBFs y se procesa un directorio que contiene DBFs.
    • Agregadas 2 funciones para mejorar y encapsular la evaluación del soporte de conversiones de forma externa (requiere EvaluarConfiguracion() previamente). Usado en los scripts .vbs. Estas nuevas funciones encapsulan la evaluación del soporte de conversión bidireccional para cada extensión soportada, lo que permite reutilizarlas externamente en los scripts o automatizaciones externas, ahorrando bastante código del lado externo. Se puede comprobar como se han reducido los scripts adjuntos.
    • Arreglo bug Regresión en ExtraBackupLevels: cuando no se define valor, no se genera backup. En la versión anterior se introdujo la capacidad de desactivar los backups, y en esa mejora se introdujo el bug de dejarlos desactivados por defecto.Ahora se restablece la generación de los backups por defecto.
    • Nuevo valor por defecto ClearUniqueID = 1 configurado en foxbin2prg.cfg para minimizar diferencias en el SCM. Hasta la versión anterior este era un seteo experimental, pero para los que trabajan con herramientas SCM esta pasa a ser una configuración totalmente necesaria y por eso se habilita por defecto. Este cambio solo podría afectar a quienes usen herramientas que usen para algo el UniqueID de los registros de los binarios de FoxPro. Lo mismo se aplica al Timestamp. En ambos casos se puede forzar su activación en el archivo foxbin2prg.cfg

    A qué afecta:- Los bugs no afectan la generación de binarios ni textos.


    Link  de descarga:
    https://vfpx.codeplex.com/releases/view/116407


     Saludos!

    miércoles, febrero 26, 2014

    Nueva versión v1.19.13 de FoxBin2Prg (arreglos, mejoras)

    Por: Fernando D. Bozzo

    Está liberada la versión v.1.19.13 de FoxBin2Prg con los siguientes cambios:

    • Arreglo de bug: Si se cambia la configuración de NoTimestamp en foxbin2prg.cfg se toma el seteo opuesto (Reportado por Ryan Harris) 
    • Encapsulado del archivo de configuración foxbin2prg.cfg para poder testearlo con FoxUnit
    • Cambio interno de l_UseTimestamps por l_NoTimestamps
    • El seteo ExtraBackupLevels del archivo de configuración foxbin2prg.cfg ahora permite desactivar los backups si se le pone 0 (propuesto por Ryan Harris)
    • Quitada la verificación de la existencia del archivo foxbin2prg.log, solo se puede usar el archivo de configuración con Debug=1 para activar el log (de paso se evita un acceso a disco innecesario)
    • En el header de los TX2 mostrar el archivo sin ruta, ya que generarlo de sitios distintos genera diferencias innecesarias (propuesto por Ryan Harris)
    • Creados un montón de casos de prueba de FoxUnit para verificar todas las configuraciones de foxbin2prg.cfg


    A qué afecta:
    - Si se usa el archivo de configuración por defecto, no afecta a nada. Pero si se ha cambiado la configuración de NoTimestamps, entonces se estará usando el valor opuesto al elegido, que afecta a versiones texto y binarios (no es para preocuparse, tiene que ver con vaciar o no el campo Timestamp)


    Link  de descarga:
    https://vfpx.codeplex.com/releases/view/116407


     Saludos!

    domingo, febrero 23, 2014

    Nueva versión v1.19.12 de FoxBin2Prg (Mejoras para SC2/VC2)

    Por: Fernando D. Bozzo

    Está liberada la versión v.1.19.12 de FoxBin2Prg con los siguientes cambios:

    • Generación de VC2/SC2 con nuevo header metadata <OBJECTDATA>. Esta es una mejora propuesta por Ryan Harris para centralizar el UniqueId, el Timestamp y el ZOrder y reducir bastante las diferencias en un diff/merge. Un ejemplo: Si se tiene un form con 100 controles y se agrega o quita uno intermedio, antes se podía ver como el ZOrder de cada control cambiaba (se renumeraba), generando en el peor de los casos hasta 100 diferencias (en este ejemplo), una por cada ZOrder en cada control, y ahora se generarían hasta 2 diferencias!, una en el nuevo bloque centralizado en la definición de la clase y una en el control agregado o quitado.
    • Mejora estética en presentación en cabecera VC2/SC2. Es un detalle visual, pero permite ver mejor y más claro la información de la cabecera de las clases y forms
    • Arreglo de casos de prueba FoxUnit para contemplar la nueva funcionalidad
    • Limpieza, refactorización y optimización de código


    A qué afecta:
    - A la generación de versiones texto, pero es compatible con los anteriores ya generados. Si se está usando para Diff/Merge, conviene regenerar los SC2 y VC2 que tengan componentes visuales.


    Link  de descarga:
    https://vfpx.codeplex.com/releases/view/116407


     Saludos!

    jueves, febrero 13, 2014

    Nueva versión v1.19.11 de FoxBin2Prg (Optimizaciones / Correcciones)

    Por: Fernando D. Bozzo

    Está liberada la versión v.1.19.11 de FoxBin2Prg con los siguientes cambios:

    • Optimizaciones WITH/ENDWITH con una ganancia de velocidad de conversión de hasta un 16% más rápido.
    • Arreglo bug: Solo se contemplaba un nivel de #IF, dando un error si se enidaban más niveles. Me toco un ejemplo de código donde se tiene la norma de anidar bloques de código con #IF/#ENDIF (práctica que no recomiendo, por cierto) y que fallaba por tener varios de estos #IF anidados
    • Arreglo bug: Al regenerar el PJX no siempre se establece el directorio por defecto correctamente. En ocasiones esto puede provocar que al abrir el  proyecto luego de regenerado pregunte si se quiere prefijar el directorio actual como predeterminado. No es importante, pero si molesto.
    • Agregado test unitario de FoxUnit para comprobar el arreglo del #IF anidado


    A qué afecta:
    - A la generación de binarios y versiones texto


    Link  de descarga:
    https://vfpx.codeplex.com/releases/view/116407


     Saludos!

    domingo, febrero 09, 2014

    Nueva versión v1.19.10 de FoxBin2Prg (ClearUniqueID, config.Tipo Conversión)

    Por: Fernando D. Bozzo

    Está liberada la versión v1.19.10 de FoxBin2Prg con los siguientes cambios:

    • Agregada parametrización para el soporte de conversión permitido por cada tipo de archivo (0=Ninguno, 1=Solo TX2, 2=TX2 y Binarios) en foxbin2prg.cfg. Esto permite habilitar o deshabilitar ciertos tipos de conversión. Por ejemplo, si se quisiera habilitar la generación de DBFs, además de permitir la de DB2 (versión texto), se debe poner DBF_Conversion_Support = 2 (por defecto ahora es 1 para evitar la pérdida accidental de datos). Sirve para lo mismo que NoTimestamps, para minimizar las diferencias entre archivos al comparar.
    • Arreglo de seteo NoTimestamps por defecto
    • EXPERIMENTAL: Nuevo parámetro de configuración "ClearUniqueID" en foxbin2prg.cfg para borrar el UniqueID de los binarios y versiones texto. Funciona bien y aparentemente FoxPro no hace uso del UniqueID, pero requiere más pruebas. Para usarlo se debe poner ClearUniqueID = 1 en el foxbin2prg.cfg
    • Ajuste de algunos casos de prueba FoxUnit



    Nota: En el archivo foxbin2prg.cfg están documentados los parámetros permitidos.


    A qué afecta:
    A la generación de binarios y de versiones texto.


    Link  de descarga:
    https://vfpx.codeplex.com/releases/view/116407

    Saludos!

    sábado, febrero 08, 2014

    Nueva versión de FoxBin2Prg v1.19.9 (configuración, parametrización, info depuración)

    Por: Fernando D. Bozzo

    Está liberada la versión v1.19.9 de FoxBin2Prg con los siguientes cambios:


    • Nuevos items de configuración en foxbin2prg.cfg (ver info en el mismo)
    • Bug en Localización: Al recompilar con el archivo de localización foxbin2prg_en.h renombrado a foxbin2prg.h daba errores de sintaxis
    • Mejorada la información de depuración de los archivos LOG cuando está habilitado (Debug=1)
    • Nueva parametrización de la cantidad de backups, ahora por defecto en un solo .BAK (antes era de 10)
    • Habilitado el archivo de configuración foxbin2prg.cfg por defecto
    • Cambio funcional por defecto: Ahora los timestamps están desactivados por defecto. Esto se puede cambiar en el archivo foxbin2prg.cfg


    A qué afecta:
    A la generación de binarios y de versiones texto.


    Link  de descarga:
    https://vfpx.codeplex.com/releases/view/116407

    Saludos!

    martes, febrero 04, 2014

    Nueva versión v1.19.8 de FoxBin2Prg (bug PageFrame / Scripts vbs)


    Por: Fernando D. Bozzo

    Está liberada la versión v1.19.8 de FoxBin2Prg con los siguientes cambios:

    - Arreglo bug PageFrame: Daba un error de ActivePage cuando se intentaba ejecutar un scx/vcx regenerado que usa PageFrame

    - Nuevo test unitario para comprobar la solución del bug

    - Parámero cNoTimestamps='1' agregado a scripts de conversión batch


    A qué afecta:
    Solo a la generación de binarios. Las versiones texto son válidas.


    Link  de descarga:
    https://vfpx.codeplex.com/releases/view/116407

    Saludos!

    domingo, febrero 02, 2014

    Nueva versión v1.19.7 de FoxBin2Prg (OLE, Timestamps)

    Por: Fernando D. Bozzo

    Acabo de liberar la versión v1.19.7 de mantenimiento, con los siguientes cambios:

    - Encapsulados los campos OLE en un solo sitio (antes estaban en 2, cabecera y objeto)

    - Ajustado el Blocksize de los binarios generados: Esto hace que el tamaño de los mismos sea algo menor, más coincidente con los binarios originales

    - Nuevo parámetro cNoTimestamps: Indicando '1' en el nuevo parámetro, se generan todos los timestamps vacíos. Útil para minimizar diferencias en operaciones de Diff y Merge


    Link de descarga:
    https://vfpx.codeplex.com/releases/view/116407


    Les agradezco el feedback por correo y en los comentarios.

    Saludos!

    FoxBin2Prg: Detalle de Vistas, datos de uso, configuraciones y más

    [2018/09/12 - Agregadas algunas enumeraciones de valores para menúes] 
    [2015/05/10 - Actualizado con todas las mejoras hasta FoxBin2Prg v1.19.43] 
    Nota: Si ya leíste el artículo, podés leer solo los cambios buscando la fecha de modificación


    Por: Fernando D. Bozzo

    En esta ocasión vamos a profundizar en el uso de FoxBin2Prg, sus parámetros, para qué sirve cada uno y en qué casos conviene usarlos, también veremos detalladamente las distintas vistas disponibles, los motivos de haberlas elegido y varios datos técnicos y configuraciones que serán muy útiles para sacarle el mayor provecho, sobre todo para el Diff y el Merge, que son las operaciones más importantes de la revisión y integración de código.


    Introducción


    FoxBin2Prg se creó como consecuencia de la necesidad de poder contar con algo más potente que el SccText/X.prg que viene con FoxPro, ya que el scctext genera vistas de texto de los binarios (scx, vcx, etc) que son bastante útiles, pero que también contienen información que para el desarrollador es irrelevante y dificulta en cierta medida poder tener un panorama más amplio del código que se está viendo, además de que está limitado a solo comparar código.

    En esta época y con la cantidad de herramientas disponibles para casi todas las necesidades y lenguajes desde hace ya un buen tiempo, este era uno de los puntos flojos de Fox y asignatura pendiente, que ya requería una revisión donde se contemplara la integración del código (merge) de distintos desarrolladores de una forma más natural que le permitiera al desarrollador o integrador poder concentrarse más en el código y que evitara tener que mirar en una ventana las diferencias mientras en otra sesión se abren las clases y forms para copiar, pegar y adaptar el código, donde en ocasiones se pueden cometer errores graves.

    Casi todo el código generado se puede modificar, siempre que se tenga la precaución necesaria con los metadatos, cuyo significado y uso iré comentando en este artículo.
    Los cambios hechos se propagarán al binario generado, quedando en el mismo de forma permanente.

    En general los objetos, los métodos y las propiedades están ordenados de forma alfabética, para evitar que se generen diferencias por el reordenamiento que a veces ocurre en el código de las tablas y que puede complicar mucho saber qué cambió realmente.


    [2015/04/18 - Actualizado >>]

    Configuración inicial en el sistema


    Para usar FoxBin2Prg desde el Explorador de archivos, puede crear tres accesos directos a FoxBin2Prg.exe y moverlos a la carpeta "SendTo" en el directorio de su perfil de Windows, así luego puede seleccionar un archivo (pjx,pj2,etc) o directorio con click-derecho y elegir "Enviar a" la opción FoxBin2Prg que desee, y así hacer conversiones al vuelo, luego renombre y edite esos accesos directos como se indica a continuación (asegúrese de que puede ver las extensiones de los archivos):


    Nombre----------------------  Right-click/Propiedades/destino-------------
    FoxBin2Prg - Binary2Text.lnk  <path>\foxbin2prg.exe "BIN2PRG-SHOWMSG"
    FoxBin2Prg - Text2Binary.lnk  <path>\foxbin2prg.exe "PRG2BIN-SHOWMSG"
    FoxBin2Prg.lnk                <path>\foxbin2prg.exe "INTERACTIVE-SHOWMSG"
    

    • Con las opciones "BIN2PRG" o "PRG2BIN" se pueden procesar directorios o archivos individuales, pero para el tipo de conversión seleccionado
    • Con solamente FoxBin2Prg.exe se pueden procesar directorios o archivos individuales para cualquier tipo de conversión
    • Con la opción "INTERACTIVE" se mostrará un cuadro de diálogo al procesar un directorio usando solamente el destino FoxBin2Prg sin las opciones BIN2PRG o PRG2BIN, preguntando qué tipo de conversión se quiere hacer. Esta opción, de hecho, hace innesesarias las dos opciones previas BIN2PRG y PRG2BIN
    • Con la opción "SHOWMSG" se mostrará un mensaje de estado al finalizar la conversión
    [<<]


    Las Vistas


    Uno de los puntos principales a mejorar era las vistas y la mayor cobertura de binarios, y por eso en FoxBin2Prg hay dos tipos de vistas:
    • Una vista de tipo código, pensada para los binarios con programación dentro (clases, forms, menus), donde lo más importante es el código en sí
    • Una vista de tipo XML, pensada para los binarios que contienen datos (DBFs, DBCs) o metadatos (Reportes y Etiquetas) y donde el código no existe o no es lo principal
    Las vistas pueden cotener tags especiales con metadatos que son fundamentales para FoxBin2Prg y que no molestan al desarrollador porque figuran como comentarios y se ignoran fácil, pero que al conversor le permite rehacer la información que no puede presentarse como código normal y que es necesaria para poder regenerar una parte de los binarios. Esta información suele ser datos como el timestamp de un registro, o el tipo de archivo referenciado o el orden Z en el caso de algunas clases visuales, pudiendo modificarse en la mayoría de los casos, pero que bajo ninguna condición debe eliminarse, porque causaría la corrupción del binario generado o un error de programa.


    Vista de un proyecto (PJ2)


    Esta es una vista tipo código, ya que es la que mejor representa el contenido de un proyecto, y tiene algunas secciones que de esta forma se ven y entienden mejor.

    La sección <DevInfo> contiene la información de desarrollo que se pone en las pantallas de "Project Info" (con click derecho sobre el proyecto) y "Version", que aparece al pulsar el botón "Build" y luego "Version"



    Si hay clases definidas como OLEPUBLIC, entonces también habrá una sección <ServerHead> seguida de tantas secciones <ServerData> como clases OLEPUBLIC se hayan definido. Esta información es fundamental para la registración de los componentes en Windows (objetos COM+ o DLLs) y para permitir que estos sean visibles para todas las aplicaciones del Sistema.



    Luego está la parte donde se definen los archivos del proyecto con ADD(archivo) y notar el tag FileMetadata, que contiene información importante del archivo, como el tipo (type), el CodePage (Cpid), la marca de modificación (timestamp) y algunos otros metadatos necesarios de uso interno del binario.




    Las siguientes tres secciones secciones son <FileComments>, donde se guardan los comentarios de los archivos, <ExcludedFiles>, donde se indican los archivos excluidos del proyecto (típicamente los archivos .H) y <TextFiles>, donde van los archivos que el proyecto de FoxPro no reconoce correctamente como archivos de texto, aunque realmente lo son, como el config.fpw y algún otro, y que FoxBin2Prg pone automáticamente aquí para que se reubiquen en el apartado de archivos de texto.Esta "reconfiguración" permite que se puedan editar ciertos archivos de texto, que de otra forma FoxPro no permite si se encuentra en la categoría "Otros".





    Finalmente está la sección de <ProjectProperties> con las propiedades del proyecto, como el programa principal (SetMain), el icono, el check de "Debug" para habilitar la información de depuración y de "Encripted" para encriptar el código, y el ProjectHook si se definió una clase Hook para el proyecto.
    Los tres datos que figuran como comentarios (CmnStyle, NoLogo y SaveCode) son metadatos del proyecto que no tienen una opción en la interfaz, pero que se generan en la tabla PJX.
    Probablemente "NoLogo" sea para que al ejecutar un EXE no muestre el logo (ventana de inicio) que suele mostrar mientras carga, aunque no lo comprobé.





    Vista de las librerías de clases (VC2) y los Forms (SC2)


    Estas vistas son de código, ya que el 99% de la información contenida en la tabla es código.

    Estructuralmente los forms y las librerías de clases son casi iguales, y la diferencia principal es que los forms tienen solo dos clases: DataEnvironment y Form.

    Aunque el archivo SC2 generado ordena las clases alfabéticamente, luego al ensamblar el binario ubica primero a la clase DataEnvironment, ya que así es como FoxPro lo requiere.

    Por lo demás, este archivo tiene las mismas consideraciones que las librerías de clases.


    Aunque en los ejemplos siguientes algunos tags salen repartidos en algunas líneas por limitaciones de espacio, realmente ocupan una sola línea en el fichero.

    [2014/02/28 - Actualizado >>]
    En este caso puse parte del código generado de una librería de clases que contiene una clase ActiveX RichText y que corresponde al primer tag "OLE". La parte de la información OLE (campo "value") se codifica en base 64. En el ejemplo pueden verse algunos metadatos encapsulados dentro del propio objeto, en la etiqueta END OBJECT. En versiones anteriores a v1.19.7 esta información estaba repartida en 2 campos, aquí y en la cabecera del TX2, pero luego se centralizó en el objeto para poder copiar todo junto en una sola operación. [<<]





    En esta vista el código está agrupado en clases, de la misma forma que se haría una librería de clases dentro de un PRG. Si la clase tiene algún comentario, éste se pondrá a la derecha del DEFINE CLASS para hacer que su lectura sea natural.

    Dentro de los DEFINE CLASS hay un tag de metadata llamado CLASSDATA con información sobre la clase, como la clase de base (BaseClass), el timestamp, la unidad de la escala (Pixels/Foxels) y el ID





    Si la clase tiene propiedades o métodos de usuario, sus nombres irán dentro del tag <DefinedPropArrayMethod>, comenzando por una letra (p=property, a=array, m=method) seguido de dos puntos ":", el nombre de la propiedad/array/método y opcionalmente un comentario, si tuviera.

    Luego está la definición de las propiedades y valores por defecto

    [2014/02/28 - Actualizado >>]
    A continuación un ejemplo de clase OLEPUBLIC, donde puede observarse en la cabecera varios tags OBJECTDATA. Estos tags contienen los nombres de los objetos, el ID y el Timestamp y el orden de los mismos determina el ZOrder de los objetos en el form, como se indica en el comentario interno:




    Notar que al final de la definición del ADD OBJECT hay un tag END OBJECT con metadatos. Este tipo de tags terminan de definir la clase del objeto agregado, su librería y algunos datos más [<<]

    Al final de los objetos, están los procedimientos de la clase con su código.






    La diferencia fundamental entre el código de programa "compilable" y el generado por FoxBin2Prg, y que el desarrollador atento habrá podido notar, es que el código no es compilable porque contiene algunos valores que darían error de sintaxis, aunque se entienden igualmente, como ser la propiedad BackColor o Picture de más arriba.

    El motivo de asignar algunas propiedades de esta forma y no de la forma correcta se debe a que internamente FoxPro guarda en las tablas los valores de una forma u otra dependiendo si el valor es un valor por defecto, o un valor creado o modificado por el usuario.

    Inicialmente había comenzado a hacer una conversión de los valores para que queden de la forma correcta, pero tuve que dejarlo porque los casos especiales eran cada vez más y el desarrollo se hubiera eternizado.

    Lo importante es que el desarrollador tenga en cuenta estas particularidades y mantenga el formato por defecto, ya que el objetivo es que se entienda y se pueda rehacer el binario y no que compile. La compilación correcta ya se hará cuando se regenere el binario nuevamente. Este es solo un formato intermedio.



    Vista de los Reportes (FR2) y Etiquetas (LB2)

    Estas vistas contienen principalmente metadatos (muchos) y muy poco código, por lo que la mejor visualización que pude encontrar es en pseudo-XML. Dentro del mismo hay valores que por no ser interesantes para leer están puestos como propiedades de tag en una sola línea, como Platform, UniqueId, timestamp, etc, y hay otros que por ser más útiles de leer o por tener valores largos o algún bloque de código o de configuración multilínea, están puestos en tags independientes, como picture, tag, tag2, expr y otros.

    En este caso se hace un ordenamiento de objetos por vpos y hpos, que son las coordenadas donde se posicionan los distintos objetos en el reporte, como los textbox, líneas, etc. Solo se exceptúan de este ordenamiento los registros especiales, como lo son la cabecera y el entorno de datos, que van al principio y al final respectivamente.

    Captura_de_FR2



    Para  facilitar la lectura de algunos valores que podrían tener algún interés, también se usan algunas configuraciones de acomodamiento y codificación de datos.

    Por ejemplo, el campo <tag2> en este ejemplo tiene información sobre la impresora seleccionada para el reporte, pero como además del texto legible hay códigos de control (chr(0) al 31), se optó por codificarlos usando llaves {}, de forma que un chr(8) se convierte en {8}, así ocupa menos espacio y se puede leer.

    En el caso de los campos binarios, la única solución fue codificarlos en base 64 y ponerlos en una sola línea para que ocupen el menor espacio posible y no den problemas con las herramientas de control de código.

    En todos los casos, los valores más útiles de leer están puestos al principio, para permitir poder echarles un vistazo rápido y evitar en lo posible el scroll horizontal, y hacia la derecha y fuera del alcance visual están los valores menos útiles para leer.



    Vista de los Menús (MN2)


    Al igual que las clases y los forms, los menús son casi todo código y muy pocos metadatos.

    La estructura generada está inspirada en la que genera FoxPro para los archivos MPR, pero con algunas cosas mejoradas para facilitar su lectura.

    Los tags iniciales definen el tipo de menú (MenuType) y su ubicación (MenuLocation), luego está el código de setup delimitado por el tag <SetupCode> y el código del menú, delimitado por <MenuCode>

    [2018/09/12 - Actualizado >>]
    Valores de MenuLocation: REPLACE, APPEND, BEFORE, AFTER

    Valores de MenuType:
    1 - Default
    2 - BAR or POPUP
    3 - Option
    4 - Shortcut
    5 - MenuBar on top

    Respecto de los comandos para generar los menúes, la sintaxis usada es la propia de Visual FoxPro, por lo que la ayuda de VFP puede ser de ayuda para entender cuando usar MENU, POPUP, PAD, MENUBAR, etc.

    Lo que hay que tener en cuenta, si se requiere modificar esta información manualmente, es que la forma lógica de anidar los menúes es específica de FoxBin2Prg para mejorar el entendimiento y claridad de las opciones, y agruparlos de forma jerárquica.

    Si no se mantiene la agrupación jerárquica, podría generarse un menú inválido o incompleto.
    [<<]

    Se puede observar como las opciones anidadas dentro de otras están indentadas más adentro y además con una línea de rayas por encima, para separar la opción de las demás y resaltar su ubicación relativa a las anteriores. No es como ver el menú en directo, pero para ser solo código esta disposición visual ayuda bastante.





     Finalmente están los apartados de procedimientos, delimitados por el tag <Procedures> y el código cleanup, delimitado por el tag <CleanupCode>

    Los procedimientos están indentados también para facilitar su lectura.

    Un dato útil: la cláusula #NAME que se puede usar en los menús para indicar un nombre específico y evitar que FoxPro le asigne uno temporal (como _GGJJSSFGG66), son respetados por FoxBin2Prg al generar los procedimientos, lo que facilita más su lectura.




    Vista de las Tablas (DB2)  y Bases de Datos (DC2)


    Lógicamente estas vistas no podían ser de código, ya que son metadatos puros, por lo que XML era la mejor opción. Tanto las tablas como las bases de datos tienen una estructura similar.

    [2015/04/18 - v1.19.42 >>]
    Las tablas tienen un tag principal <TABLE> que engloba todos los apartados de metadatos de la tabla, como los campos e índices y las propiedades de la tabla al inicio.

    También hay hay un tag <FIELD_ORDER> que mantiene el ordenamiento original de los campos de la tabla o vista, ya que los nombres de los campos de los tags <FIELD> de tablas y vistas se ordenan alfabéticamente para facilitar el ver las diferencias cuando se hacen cambios. [<<]

    En el ejemplo, la tabla pertenece a una base de datos, por lo que tiene información complementaria como datos de validación, triggers, etc.





    Las Bases de Datos usan el tag principal <DATABASE> con sus propiedades específicas, y bajo el cual engloba el resto de apartados, como conexiones, tablas, vistas y procedimientos almacenados. A su vez cada apartado contiene su información específica, por ejemplo las tablas contienen sus campos, índices y relaciones y las vistas lo mismo.





    Nota: Se debe tener especial cuidado al convertir las tablas y Bases de Datos, ya que FoxBin2Prg no preguntará si se desea realizar la operación, y la hará directamente. En el caso de las tablas, solo se regenerará la estructura de las mismas y sus índices, pero no los datos.


    [2015/04/18 - v1.19.42 >>]
    Una característica muy útil de las vistas texto de los DBC, de cara a las comparaciones con versiones anteriores, es que todos los miembros se ordenan alfabéticamente, manteniendo esta estructura:
    • Conexiones: Van primero y se ordenan alfabéticamente.
    • Tablas: Van segundo y se ordenan alfabéticamente. Dentro de las tablas, los campos, índices y relaciones también se ordenan alfabeticamente.
    • Vistas: Van tercero y se ordenan alfabéticamente. Dentro de las vistas, los campos también se ordenan alfabeticamente.
    • Stored Procedures: Van al final
    [<<]


    Consideraciones comunes de las vistas


    Todas las operaciones de FoxBin2Prg son seguras, ya que antes de generar un archivo crea un backup del mismo, y en caso de no poder hacerlo se cancela la operación.

    En las librerías de clases, los forms y los reportes y etiquetas, el ordenamiento de los objetos se hace para facilitar las comparaciones de código, ya que durante el desarrollo muchos objetos cambian de lugar aunque no se hayan modificado, y eso complicaría demasiado las cosas para el integrador o el desarrollador. Cualquiera que haya trabajado con el SccText.prg que viene por defecto con FoxPro seguramente habrá experimentado estos problemas y sabrá el dolor de cabeza y el tiempo que lleva descubrir las diferencias reales entre bloques de código que se muestran en distintos lugares como diferentes.

    Las marcas de timestamp son las más cambiantes y las que más diferencias provocan, y esto se nota especialmente en los reportes, clases o forms con cierta complejidad.

    Para evitar esto FoxBin2Prg está configurado por defecto para que las deje vacías, al igual que el UniqueID. En ambos casos se pueden habilitar si se desea.



    Parámetros de entrada


    La siguiente tabla muestra los parámetros de entrada de FoxBin2Prg, con lo que se pueden cambiar algunas características del funcionamiento.

    Donde <params> son:(!=Requerido | ?=Opcional) (@=por referencia | v=por valor), (IN/OUT)
    c_InputFile(v! IN ) Ruta absoluta o relativa del archivo a convertir
    cType(v? IN ) Para compatibilidad con el SCCTEXT.PRG, indica el tipo de archivo (d=DBC, D=DBF, K=Form, B=Label, M=Menu, R=Report, V=Class)
    cTextName(v? IN ) Para compatibilidad con el SCCTEXT.PRG, es el nombre del archivo de Texto a generar
    lGenText(v? IN ) Para compatibilidad con el SCCTEXT.PRG, .T.=Generar Texto, .F.=Generar Binario
    cDontShowErrors(v? IN ) '1' para NO mostrar errores con MESSAGEBOX
    cDebug(v? IN ) '1' para depurar en el punto del error (solo modo desarrollo)
    cDontShowProgress(v? IN ) '1' para NO mostrar la barra de progreso
    cOriginalFileName(v? IN ) Para los casos en los que inputFile es un nombre temporal y se necesita el nombre correcto original (por ejemplo: dentro de los archivos PJ2 y de las cabeceras TEXTO)
    cRecompile(v? IN ) Si se indica un Path, recompilará el binario desde el mismo. Si se invoca desde SCCAPI, será Verdadero por defecto y si no será Falso por defecto
    cNoTimestamps(v? IN ) '1' para limpiar los Timestamps en texto y binarios. Util para minimizar las diferencias en operaciones de Diff y Merge

    c_InputFile es el único parámetro obligatorio, donde se especifica la ruta del archivo de entrada y en base al cual se generará el de salida. Si la entrada es un binario, la salida será texto y viseversa.

    Los parámetros del 2 al 4 (cType, cTextName y lGenText) son para usar solamente por SourceSafe y están implementados desde la versión v1.19.6

    Si ocurriera algún error se genera un archivo .ERR y se muestra un mensaje avisando de ello, pero podría suceder que en un proceso batch no se quiera esto, sino solo generar un LOG, en cuyo caso hay dos seteos que se pueden usar: cDontShowErrors y cDebug

    cDontShowErrors = '1' hará que no se muestren mensajes de error que requieren la intervención del usuario, y cDebug solo conviene usarlo para depurar, ya que genera un archivo .LOG con información de depuración algo más detallada.

    La generación del LOG también se puede habilitar creando un archivo foxbin2prg.log en el mismo directorio donde se haya puesto el PRG o el EXE de FoxBin2Prg

    Algunas herramientas SCM (de control de código fuente) copian los archivos a los que se está haciendo Diff o Merge en ubicaciones temporales o con nombres temporales, lo que puede hacer que FoxBin2Prg genere algunos nombres de archivo mal. Por ejemplo, todas las vistas texto tienen una cabecera de este tipo:



    El nombre del archivo se toma del parámetro c_InputFile, si éste fuera temporal (ej: c:\temp\_frrdde77dd.mnx), entonces eso quedará reflejado en la cabecera también.

    En el caso de los proyectos (PJ2) es peor, ya que el nombre del proyecto se usa en varias partes dentro del archivo, lo que incluso puede hacer que lo generado sea inválido.

    En ambos casos la única solución posible pasa por usar el parámetro cOriginalFileName, pasando el nombre y ruta que realmente tendría el archivo en su ubicación original, y este parámetro FoxBin2Prg lo usa para arreglar todas las referencias internas a los nombres del archivo.

    El parámetro cRecompile sirve para desactivar la compilación luego de la regenerecación del binario, o bien para indicar la ruta desde la que se debe recompilar.

    El motivo de este parámetro es permitir optimizar la velocidad de regeneración de binarios, ya que si se tiene automatizado el proceso de generación del ejecutable y previamente se regeneran los binarios desde sus versiones texto, entonces ya se estarán compilando los binarios para hacer el EXE, por lo que se podría desactivar la compilación de FoxBin2Prg y ganar todo el tiempo que implica recompilar estos archivos nuevamente.




    [2015/05/10 - v1.19.43 >>]

    Configuración


    En el directorio de instalación hay un archivo de configuración llamado foxbin2prg.cfg.txt donde están detallados los valores por defecto en Inglés y Español, y más abajo están las configuraciones modificables.
    Este archivo, si se le quita la extensión .txt (foxbin2prg.cfg), se puede usar como modelo para crear configuraciones personalizadas por directorio, aprovechando la herencia de CFGs entre directorios padre/hijo.

    FoxBin2Prg.cfg - Si no se proporcionan valores, estos son los predeterminados Detalle y valores soportados
    extension: xx2 Las extensiones por defecto de FoxBin2Prg terminan en '2'
    ShowProgressbar: 1 1=Mostrar barra de progreso por defecto en procesamiento multi-archivo, 0=No mostrar PB
    DontShowErrors: 0 Mostrar mensajes de error por defecto
    NoTimestamps: 1 Vaciar Timestamps por defecto para minimizar diferencias
    Debug: 0 No Activar <archivo>.Log por defecto
    ExtraBackupLevels: 1 Por defecto 1 BAK es creado. Con esto puede crear más .N.BAK, o ninguno si indica 0.
    ClearUniqueID: 1 0=Mantener UniqueID, 1=Borrar Unique ID. Util para Diff y Merge
    OptimizeByFilestamp: 0 1=Optimizar la regeneración de archivos dependiendo del timestamp de archivo, 0=No optimizar (más seguro si se usa para merge o para editar el tx2)
    ClearDBFLastUpdate: 1 1=No mantener la fecha LastUpdate de los DBFs, 0=Mantenerla
    RemoveNullCharsFromCode: 1 1=Quitar NULLs del código fuente, 0=Dejar los NULLs en el código
    RemoveZOrderSetFromProps: 1 1=Quitar ZOrderSet de las propiedades, 0=Dejar ZOrderSet en las propiedades
    Language: (auto) Lenguage de los mensajes mostrados y Logs. EN=Inglés, FR=Francés, ES=Español, DE=Alemán, No definido = AUTOMATICO [DEFAULT]
    XXX_Conversion_Support: N 0=Sin soporte, 1=Generar solo TXT (Diff), 2=Regenerar BINARIOS (Merge), 4=Generate TXT with DATA for DIFF (DBF only)
    PJX_Conversion_Support: 2 Ver XXX_Conversion_Support
    VCX_Conversion_Support: 2 Ver XXX_Conversion_Support
    SCX_Conversion_Support: 2 Ver XXX_Conversion_Support
    FRX_Conversion_Support: 2 Ver XXX_Conversion_Support
    LBX_Conversion_Support: 2 Ver XXX_Conversion_Support
    MNX_Conversion_Support: 2 Ver XXX_Conversion_Support
    DBC_Conversion_Support: 2 Ver XXX_Conversion_Support
    DBF_Conversion_Support: 1 Ver XXX_Conversion_Support >> FoxBin2Prg tiene soporte bi-direccional para convertir DBF, pero no mantiene los datos. Usar con cuidado.
    DBF_Conversion_Included: * Si DBF_Conversion_Support:4, se pueden indicar múltiples máscaras de archivo: www,fb2p_free.dbf
    DBF_Conversion_Excluded: Si DBF_Conversion_Support:4, se pueden indicar múltiples máscaras de archivo: www,fb2p_free.dbf
    UseClassPerFile: 0 0=Una archivo librería tx2, 1=Múltiples archivo.clase.tx2, 2=Múltiples archivo.clasebase.clase.tx2, incluyendo DBCs y sus miembros
    RedirectClassPerFileToMain: 0 0=No redireccionar a archivo.tx2, 1=Redireccionar a archivo.tx2 cuando se seleccione archivo.clase.tx2
    ClassPerFileCheck: 0 0=No verificar la inclusión de archivo.clase.tx2, 1=Verificar la inclusión de archivo.clase.tx2


    [<<]


    Configuración de extensiones


    Por defecto, las extensiones de FoxBin2Prg terminan en 2 (pj2, sc2, vc2, etc), pero si fuera necesario que la extensión fuera otra, se puede configurar usando el archivo foxbin2prg.cfg (en el zip se adjunta uno renombrado con guión bajo al final), e indicando la equivalencia de extensiones requeridas.

    La reconfiguración de extensiones se hace con estas líneas dentro del archivo cfg (ejemplo para SourceSafe):

    extension: vc2=vca
    extension: sc2=sca
    extension: pj2=pja
    ...(otras)


    Hay otros parámetros configurables descriptos dentro de este archivo de configuración, somo ser:

    DontShowProgress => Para no mostrar la barra de progreso
    DontShowErrors => Para no mostrar mensajes de error
    NoTimestamps => Por defecto ya está desactivado internamente
    Debug => Permite generar un LOG para saber que se hace
    ExtraBackupLevels => Cantidad de backups a hacer (max:9) Por defecto 1 internamente
    ClearUniqueID => Permite dejar vacío el ID de los registros (se recomienda poner en 1 para minimizar diferencias)
    XXX_Conversion_Support => Permite cambiar el soporte a distintos tipos de archivo. 0=Sin soporte, 1=Solo texto (como scctext), 2=bidireccional (regenera binario), 4=Generar DB2 con DATOS para DIFF (sólo DBFs)


    Nota importante:
    El soporte por defecto de los DBFs está configurado en 1 (generar solo texto) para evitar pisar las tablas de datos por error al regenerar todos los binarios.
    Para activar la regeneración del DBF y sus índices, se debe descomentar la línea DBF_Conversion_Support = 1 y cambiarle el valor a 2 para que quede DBF_Conversion_Support = 2.



    [2015/04/18 - Actualizado >>] 

    Exportación de datos para Diff


    Si se quieren exportar los datos de tablas pequeñas para poder ver los cambios entre distintas versiones, se puede poner DBF_Conversion_Support: 4 en el archivo de configuración, y para que esta configuración no afecte a todas las tablas, ya que algunas pueden tener muchos datos, es mejor moverlas a otro directorio --o subdirectorio de DATOS-- y ponerles su propio CFG, aprovechando la capacidad de multi-configuración introducida en la versión v1.19.25 


    Cuando se exportan datos de tablas para poder llevar un control de sus diferencias, típicamente tablas chicas de configuración o similar, puede ser muy útil establecer un ordenamiento de esos datos, para minimizar las diferencias al comparar y que no aparezcan registros mezclados como si se hubieran hecho muchos cambios. Para esto se puede crear un archivo de configuración individual por tabla, con la nomenclatura nombretabla.dbf.cfg, con los siguientes valores dentro:

    DBF_Conversion_Order: <C_Expression>  Indica una expresión válida de Fox para ordenar los campos. Por ejemplo: DBF_Conversion_Order: cust_no
    DBF_Conversion_Condition: <C_Expression> Indica una expresión válida de Fox para filtrar los campos. Por ejemplo: DBF_Conversion_Condition: cust_no > 10

    [<<]


    Nota:
    Dentro del foxbin2prg.cfg están todas las configuraciones con los valores por defecto y el detalle de cada una.



    Capitalización de nombres de archivo


    En el zip de FoxBin2Prg se incluye un programa para normalizar la capitalización de los nombres de archivo llamado filename_caps.exe
    Si este programa y su archivo de configuración filename_caps.cfg se copian junto a FoxBin2Prg.exe, se utilizará automáticamente y se usarán las reglas de capitalización que se hayan indicado en su configuración.

    La configuración por defecto es la siguiente:

    *---------------------------------------------------------------------------------
    * FILENAME_CAPS.CFG
    *
    * FORMATO DE MÁSCARAS:
    * --------------------
    * filemask=Filename.Ext:FilenameCAP.ExtCAP
    *     Donde:  Filename    ==> Es el nombre del archivo
    *             Ext         ==> Es la extensión
    *             FilenameCAP ==> (U)ppercase, (L)owercase, (P)roper, (M)atch, (N)one
    *             ExtCAP      ==> (U)ppercase, (L)owercase, (P)roper, (M)atch, (N)one
    *
    * EJEMPLOS DE MÁSCARAS:
    * ---------------------
    * filemask=*.PDF:U.L    ==> Convierte los archivos PDF a <NOMBREARCHIVO.pdf>
    * filemask=*.DOT:L.U    ==> Convierte los archivos DOT a <nombrearchivo.DOT>
    * filemask=*.PRG:C.L    ==> Convierte un archivo específico a <Nombrearchivo.ini>
    * filemask=EJEMPLO.ini:C.U ==> Convierte un archivo específico a <Ejemplo.INI>
    *
    * IMPORTANTE:
    * -----------
    * LAS CONVERSIONES SE REALIZAN EN EL ORDEN QUE SE PONGAN, COMENZANDO POR ARRIBA.
    *---------------------------------------------------------------------------------
     

    filemask=*.*:N.L

    Lo que hace por defecto es respetar la capitalización del nombre de los archivos y pasar las extensiones a minúsculas.

    Este programa es bastante básico y sencillo, pero las opciones disponibles permiten una configuración suficiente para la mayoría de los casos. Además se puede usar en solitario para otras herramientas, como CVS u otras herramientas SCM, antes de hacer el checkin, ya que ayuda a evitar los errores posteriores que suelen ocurrir cuando se intenta hacer checkin, diff o merge de archivos con distinta capitalización.
    SourceSafe es uno de los que no es afectado por esto, ya que es solo para Windows, pero para las herramientas SCM multiplataforma sí es un problema.



    Palabras finales


    El zip de FoxBin2Prg contiene algunas herramientas relacionadas, hechas para mejorar la productividad cuando se requiere tratar muchos archivos con pocos clicks, lo que incluye 4 scripts vbs (Convert_VFP9_PRG_2_BIN.vbs, Convert_VFP9_BIN_2_PRG.vbs, Normalize_FileNames.vbs y VFP9_FoxBin2Prg.vbs) a los que se les puede crear un acceso directo y poner estos accesos en la carpeta "SendTo" del directorio del perfil del usuario (c:\Documents and settings\usuario\SendTo), lo que permitirá seleccionar directorios o archivos y usar el click derecho para enviarlos al programa o script elegido.



    En una próxima nota hablaré sobre la integración y configuración de FoxBin2Prg con algunas herramientas SCM.


    Hasta la próxima!


    Artículos relacionados:
    FoxBin2Prg, el sucesor mejorado del scctext
    FoxBin2Prg: Guía rápida de uso y configuración
    FoxBin2Prg: Descarga de VFPx