Mostrando entradas con la etiqueta 2-way conversor. Mostrar todas las entradas
Mostrando entradas con la etiqueta 2-way conversor. Mostrar todas las entradas

domingo, junio 15, 2014

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

Por: Fernando D. Bozzo

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

  • Algunos mensajes han sido convertidos al Inglés para permitir un uso Internacional más amplio
  • Actualizada la versión de FoxBin2Prg (solo el EXE) a la versión v1.19.24



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!

sábado, junio 07, 2014

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

Por: Fernando D. Bozzo

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

  • Agregado switch "nFlags" en los scripts vbs para Plastic, para poder mostrar un mensaje de finalización de proceso, muy útil cuando se procesan muchos archivos o cuando se procesan archivos pesados que tardan (activo por defecto)
  • Activado por defecto el mensaje de finalización de proceso en los scripts vbs para usar con el administrador de archivos de Windows
  • Actualizada la versión de FoxBin2Prg (solo el EXE) a la versión v1.19.23



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.23 de FoxBin2Prg (Arreglos y mejoras)

Por: Fernando D. Bozzo

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

  • Mejora: Los valores de los campos timestamp y uniqueid vuelven a los binarios. En los tx2 es configurable con los flags NoTimestamps y ClearUniqueID. En la v1.19.7 se introdujo la posibilidad de vaciar los timestamps de los binarios y tx2 con el switch NoTimespamt, y en la v1.19.10 se introdujo el flag ClearUniqueID para hacer lo mismo con los UniqueID. Desde esta versión esos campos se dejan con valor en los binarios siempre y los switch solo afectarán a los textos tx2 generados desde los mismos. El motivo es evitar diferencias innecesarias en los binarios, ya que si, por ejemplo, un proyecto PJX tiene estos campos vacíos y se abre el proyecto (con MODIFY PROJECT), aunque no se toque nada y se cierre, FoxPro completa varios de estos campos automáticamente, lo que produce diferencias que luego salen en el control de código como binario modificado.
  • Mejora: Agregado valor de sccdata por defecto. Este es otro campo que se dejaba vacío, pero que al abrir ciertos componentes con MODIFY, aunque no se modifiquen, FoxPro les rellena este campo con el valor por defecto. Desde esta versión los binarios regenerados tendrán este campo relleno con el valor por defecto, así FoxPro no lo rellena por su cuenta y se evitan diferencias en los binarios por este motivo.
  • Bug Fix: Arreglo de evaluación de la fecha para incluir los archivos ??T (vct, frt, mnt, sct, lbt). En la v1.19.21 se introdujo una mejora en la regeneración de archivos, controlada por el switch OptimizeByFilestamp (activa por defecto en foxbin2prg.cfg), en la que se optimizaba su creación dependiendo del timestamp de los archivos TX2 y de los archivos ??X. El problema es que si se modifica, por ejemplo, el backcolor de un form y se guarda, el archivo actualizado es el memo (SCT) y no el SCX, por lo que el archivo SC2 no se regeneraba, pudiendo perderse el cambio si se regeneraba el binario desde el mismo. Ahora se compara también el timestamp de los archivos .??T (memo), para evitar este problema. Esto solo afecta las instalaciones que tengan OptimizeByFilestamp = 1 en foxbin2prg.cfg
  • Bug Fix: Agregada propiedad faltante "BorderColor" en props_optiongroup.txt. No hubo ningún reporte de error por esto, pero faltaba en la lista y fue agregada.
  • Bug Fix: Agregada props Stretch en props_image.txt (Kenny Vermassen). La ausencia de esta propiedad en la lista de propiedades provocaba en ciertas situaciones que algunas imágenes se redimensionen mal, dependiendo del valor de la propiedad Stretch y del tamaño de la imagen. Esto solo afecta a los forms o clases que usen imágenes más grandes que el tamaño asignado al height/width del control image que las contiene.
  • Bug Fix: Agregada props Enabled en props_image.txt. No hubo ningún reporte de error por esto, pero faltaba en la lista y fue agregada.


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!

    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!

    domingo, febrero 02, 2014

    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

    viernes, enero 10, 2014

    FoxBin2Prg, el sucesor mejorado del scctext

    [18/04/2015: Actualizado hasta la versión v1.19.42]

    Por: Fernando D. Bozzo

    Creo que sería un buen comienzo empezar este blog con una nota sobre FoxBin2Prg, un proyecto Open Source actualmente hospedado en CodePlex dentro del proyecto VFPX y que comencé a fines de noviembre de 2013, por la necesidad de no solo generar vistas texto de los binarios de Visual FoxPro 9 como ya hace el scctext, sino de mejorarlo a tal punto que para el Desarrollador sea como el código mismo, y que además permita ser usado para hacer Diff, Merge y de paso Backup del código.


    Ventajas:

    • Genera archivos estilo "PRG" (no compilables), para comparación visual
    • Permite hacer cambios en la versión TEXTO tan fácil como modificar PRG
    • Todo el código de programa está en un solo EXE, para simplificar su copia y mantenimiento
    • Con las versiones TEXTO puedes regenerar los binarios originales, así que es útil como backup
    • Las extensiones usadas son configurables si se crea el archivo FOXBIN2PRG.CFG
    • Los métodos y propiedades de la versión TEXTO son ordenados alfabéticamente para acilitar su comparación
    • Tiene compatibilidad con el SccText(X) a nivel de parámetros, así puede ser usado como su sustituto con SourceSafe

    Actualmente se soporta la conversión de archivos PJX,SCX,VCX,FRX,LBX,DBC,DBF y MNX, para los que genera versiones Texto con extensión PJ2,SC2,VC2,FR2,LB2,DC2,DB2 y MN2 que pueden ser reconfiguradas para compatibilizar con SourceSafe.

    Ejemplo de archivo de configuración FOXBIN2PRG.CFG si necesita cambiar extensiones
    extension: SC2=SCA
    extension: VC2=VCA
    extension: PJ2=PJA
    ...


    Usando la versión "EXE": (útil para ser llamado por programas de 3ros)
    FOXBIN2PRG.EXE "<path>\file.scx" ==> Genera la versión TEXT con extensión sc2
    FOXBIN2PRG.EXE "<path>\file.sc2" ==> Regenera el binario con extensión scx


    Usando la versión "PRG":
    DO FOXBIN2PRG.PRG WITH "<path>\file.scx" ==> Genera la versión TEXT con extensión sc2
    DO FOXBIN2PRG.PRG WITH "<path>\file.sc2" ==> Regenera el binario con extensión scx


    Usando la versión "Objeto":
    LOCAL loCnv AS c_foxbin2prg OF "FOXBIN2PRG.PRG"
    loCnv = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG")
    loCnv.Ejecutar( <params> )


    El código generado


    Para cada tipo de binario Fox hay una vista personalizada, pensada para sacarle el mayor provecho a cada uno. Por ejemplo, para los DBFs y DBCs (tablas y bases de datos nativas) se generan vistas estilo XML



    y para el resto se genera código de programa y seudocódigo, que no compila, pero es tan fácil de leer como el código normal, con la ventaja de que en todos los casos se pueden hacer modificaciones que luego se trasladarán al binario regenerado.


    Estructura de clases



    Todo el código está en un único programa dividido en varias clases:
    • Una clase principal llamada c_foxbin2prg, de tipo session, que es la que recibe los parámetros
    • Una para el indicador de avance cuando se procesan varios archivos llamada frm_avance
    • Una para cada tipo de conversión específica, que es cargada por la clase principal y que están basadas o en c_conversor_bin_a_prg o en c_conversor_prg_a_bin
    • Unas cuántas de soporte basadas en cl_col_base y cl_cus_base para poder completar los datos de cada unidad o subunidad de información.
    Por ejemplo, el conversor de DBF a texto, además de la clase conversora principal, utiliza:
    • Una clase para la información del DBF (cl_dbf_table)
    • Una clase para la información de campos (cl_dbf_field)
    • Una clase para la información de índices (cl_dbf_index)
    • 2 clases de colección (cl_dbf_fields y cl_dbf_indexes)

    Funcionamiento


    Cuando se pide convertir un VCX a VC2, ocurre lo siguiente:
    • La clase c_foxbin2prg recibe los parámetros de entrada en el método execute(), siendo el primero de ellos el nombre y ruta del archivo a convertir. En este paso también se hacen algunas validaciones
    • A continuación se llama al método convert(), que selecciona el conversor a utilizar de acuerdo al tipo de archivo pasado, en este caso es c_conversor_vcx_a_prg, se instancia la clase, se le pasan los datos necesarios y se invoca a su método Convertir()
    • El método Convertir() abre la librería VCX como una tabla en modo SHARED NOUPDATE con alias TABLABIN y a partir de allí se recorren todos los registros, invocando a métodos intermedios específicos para tipo de dato del VCX que irán analizando los datos del registro e irán generando cada uno su parte de información de texto, como la definición de la clase, el ordenamiento alfabético y definición de las propiedades al inicio, el ordenamiento alfabético y definición de los métodos, etc.
    En los distintos métodos se va obteniendo, formateando y escribiendo trozos de código, y todo el código/texto generado se va guardando en una variable pública llamada C_FB2PRG_CODE, que al finalizar se escribe en el archivo VC2.

    Cuando se pide regenerar un binario desde el VC2, ocurre lo siguiente:
    • Se realizan los dos primeros pasos del proceso antes descripto, pero instanciando la clase c_conversor_prg_a_vcx
    • En el método convert() se invoca a identifyExclusionBlocks() que analiza el código del VC2 buscando los #IF .F. y los TEXT..ENDTEXT, para saber que dentro de esos bloques no debe analizar nada
    • Se llama al método identifyCodeBlocks() que a su vez llama a los distintos métodos analyze que se encargan de analizar secciones específicas de código como los ADD_OBJECT, DEFINED_PAM (las propiedades, arrays y métodos definidos por el usuario), HIDDEN, INCLUDE, METADATA y demás secciones del código, cada una de las cuáles realiza un parseo específico para completar las propiedades del objeto de datos que le corresponde
    • Finalmente se invoca al método writeBinaryFile() que recorre toda la información recolectada antes y escribe el binario

    Control de errores


    El control de errores se basa en Try/Catch, donde cada método controlado se encarga de 2 cosas:
    1. Tratar el error, generar la información de Log necesaria y limpiar el entorno modificado (garbage collect)
    2. Relanzar el error hacia el nivel superior, que llegará finalmente hasta la capa más externa que es la clase principal, donde dependiendo del modo de llamada de foxbin2prg (EXE, PRG u Objeto) devolverá un tipo de información u otro.
    Por ejemplo, en modo EXE se devuelve un código de error 1 como resultado de ejecución, valor que puede ser leido por un BAT o un script VBS con ERRORLEVEL para tomar alguna decisión o realizar alguna acción.


    Parámetros


    Finalmente, los distintos parámetros de entrada permiten configurar cómo se desea que funcione y actúe ante ciertas situaciones:
    • tc_InputFile: Nombre completo del archivo de entrada a convertir
    • tcType_na: Mantenido por compatibilidad con SourceSafe. Por ahora sin uso.
    • tcTextName_na: Mantenido por compatibilidad con SourceSafe. Por ahora sin uso.
    • tcGenText_na: Mantenido por compatibilidad con SourceSafe. Por ahora sin uso.
    • tcType_na: Mantenido por compatibilidad con SourceSafe. Por ahora sin uso.
    • tcDontShowErrors: Un "1" indica que no se quiere mostrar errores si llegaran a ocurrir. Esto es útil en un procesamiento batch, donde no se quiere que los errores interrumpan el proceso ya que se loguean a un archivo .LOG o .ERR que se puede revisar luego
    • tcDebug: Un "1" indica habilitar el modo de depuración, que solo se usa en modo desarrollo cuando se ejecuta el PRG y que permite que se abra una ventana de DEBUG para depurar el error en el mismo sitio donde ocurrió, inspeccionar las variables y ver lo que sea necesario. En tiempo de ejecución (EXE) solo habilita el modo de generación de LOG, que también se puede habilitar creando un archivo FoxBin2Prg.log junto al EXE
    • tcDontShowProgress: Un "1" indica que no se quiere mostrar una barra de progreso cuando se procesa un lote de archivos. Para un único archivo no se muestra esta barra de progreso.
    • tcOriginalFileName: Este parámetro fue uno de los últimos agregados, y está especialmente pensado para trabajar con herramientas SCM, donde la mayoría de las veces se generan los archivos en ubicaciones temporales (c:\temp) y con nombres temporales (fffds-44343-ffds5-fsdfe.vcx). Gracias a este parámetro el conversor sabe el nombre original del archivo y lo puede utilizar en sitios donde queda registrado, como la cabecera de los TX2 y algunas propiedades importantes. Por ejemplo el PJ2 tiene unas cuántas referencias a su nombre en distintas propiedades, que sin este parámetros tendrían un nombre temporal que impediría regenerar el binario con el nombre correcto.
    • tcRecompile: Indica si se debe recompilar, o no. Por defecto, desde la v1.19.4 ya no recompila, salvo que se indique '1' para recompilar desde el directorio del binario (como hacía antes) o un 'Path' para recompilar desde el mismo. Lo mejor es undicar el Path del proyecto PJX, ya que siempre que se usa un proyecto, los componentes que se agreguen se compilan desde esa ubicación relativa, y todos los arhivos se vinculan de forma relativa, como los Include (..\include\foxpro.h), que se se compilaran desde otra ubicación darían errores de compilación, que es lo que ocurría con el funcionamiento anterior de FoxBin2Prg cuando se referenciaban archivos externos de forma relativa.

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

    Conclusión

    Omití varios detalles para no hacer el post muy largo, pero quería explicar un poco por encima el funcionamiento de este programa y su estructura. Probablemente en próximos posts hable sobre algunas particularidades más específicas y de algunas técnicas de programación utilizadas.

    Hasta la próxima!


    Artículos relacionados:
    FoxBin2Prg: Detalle de vistas, datos de uso, configuraciones y más