diff --git a/TESTS/DATOS_READONLY/fb2p_frm_1.sct b/TESTS/DATOS_READONLY/fb2p_frm_1.sct
new file mode 100644
index 0000000..5324983
Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_frm_1.sct differ
diff --git a/TESTS/DATOS_READONLY/fb2p_frm_1.scx b/TESTS/DATOS_READONLY/fb2p_frm_1.scx
new file mode 100644
index 0000000..0391e14
Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_frm_1.scx differ
diff --git a/TESTS/DATOS_READONLY/fb2p_frm_2.sct b/TESTS/DATOS_READONLY/fb2p_frm_2.sct
new file mode 100644
index 0000000..803343d
Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_frm_2.sct differ
diff --git a/TESTS/DATOS_READONLY/fb2p_frm_2.scx b/TESTS/DATOS_READONLY/fb2p_frm_2.scx
new file mode 100644
index 0000000..d52cd12
Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_frm_2.scx differ
diff --git a/TESTS/DATOS_READONLY/fb2p_test.pjt b/TESTS/DATOS_READONLY/fb2p_test.pjt
new file mode 100644
index 0000000..bedf8f9
Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_test.pjt differ
diff --git a/TESTS/DATOS_READONLY/fb2p_test.pjx b/TESTS/DATOS_READONLY/fb2p_test.pjx
new file mode 100644
index 0000000..bcbff62
Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_test.pjx differ
diff --git a/TESTS/DATOS_READONLY/fb2p_test.vct b/TESTS/DATOS_READONLY/fb2p_test.vct
new file mode 100644
index 0000000..b6b2a60
Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_test.vct differ
diff --git a/TESTS/DATOS_READONLY/fb2p_test.vcx b/TESTS/DATOS_READONLY/fb2p_test.vcx
new file mode 100644
index 0000000..c44d4b3
Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_test.vcx differ
diff --git a/TESTS/fxu_lib_objetos_y_funciones_de_soporte.prg b/TESTS/fxu_lib_objetos_y_funciones_de_soporte.prg
new file mode 100644
index 0000000..f12c2be
--- /dev/null
+++ b/TESTS/fxu_lib_objetos_y_funciones_de_soporte.prg
@@ -0,0 +1,135 @@
+*-- Módulo: fxu_lib_objetos_y_funciones_de_soporte.PRG
+*-- Autor: Fernando D. Bozzo - 30/11/2013
+*-- Detalle: LIBRERÍA DE SOPORTE DE LOS TESTS PARA OBJETOS Y FUNCIONES DE FOXBIN2PRG
+*----------------------------------------------------------------------------------------
+
+
+DEFINE CLASS CL_FXU_CONFIG AS CUSTOM
+ #IF .F.
+ LOCAL THIS AS CL_FXU_CONFIG OF 'fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+
+ _MEMBERDATA = [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + []
+
+
+ cOldPath = ''
+ cPath = 'FOXUNIT;TESTS;TESTS\DATOS_TEST'
+ cPathDatosReadOnly = 'TESTS\DATOS_READONLY'
+ cPathDatosTest = 'TESTS\DATOS_TEST'
+ cSetDate = ''
+
+
+ *----------------------------------------------------------------------------------------
+ PROCEDURE INIT
+ THIS.cSetDate = SET("Date")
+
+ SET DATE TO YMD
+ SET HOURS TO 24
+ SET SAFETY OFF
+ SET TABLEPROMPT OFF
+ SET TALK OFF
+
+ THIS.cOldPath = SET("Path")
+ SET PATH TO (THIS.cPath)
+ ENDPROC
+
+
+ *----------------------------------------------------------------------------------------
+ PROCEDURE DESTROY
+ SET PATH TO (THIS.cOldPath)
+ SET DATE (THIS.cSetDate)
+ ENDPROC
+
+
+ *----------------------------------------------------------------------------------------
+ PROCEDURE SETUP_COMUN
+ ERASE (FORCEPATH( '*.*', THIS.cPathDatosTest ) )
+ ENDPROC
+
+
+ *----------------------------------------------------------------------------------------
+ PROCEDURE TEARDOWN_COMUN
+ USE IN (SELECT("TABLABIN"))
+ ENDPROC
+
+
+ *----------------------------------------------------------------------------------------
+ PROCEDURE copiarArchivosParaTest
+ LPARAMETERS tcFileSpec
+
+ COPY FILE (FORCEPATH( tcFileSpec, THIS.cPathDatosReadOnly )) TO (FORCEPATH( tcFileSpec, THIS.cPathDatosTest ))
+ ENDPROC
+
+
+ *----------------------------------------------------------------------------------------
+ FUNCTION mejorarPresentacionCaracteresEspeciales
+ LPARAMETERS tcText
+ RETURN STRTRAN( ;
+ STRTRAN( ;
+ STRTRAN( ;
+ STRTRAN( ;
+ STRTRAN( ;
+ STRTRAN( tcText, CHR(13)+CHR(10), '' ) ;
+ , CHR(13), '' ) ;
+ , CHR(10), '' ) ;
+ , CHR(9), '' ) ;
+ , ' ', '·' ) ;
+ , '', ''+CHR(13)+CHR(10) )
+ ENDFUNC
+
+
+ *----------------------------------------------------------------------------------------
+ PROCEDURE prepararObjetoReg_SCX
+ LPARAMETERS toReg, tcClass, tcParent, tcObjName
+
+ toReg = CREATEOBJECT("EMPTY")
+ ADDPROPERTY( toReg, 'Class', tcClass )
+ ADDPROPERTY( toReg, 'Parent', tcParent )
+ ADDPROPERTY( toReg, 'objName', tcObjName )
+ ADDPROPERTY( toReg, 'Reserved1', '' )
+ ADDPROPERTY( toReg, 'Reserved2', '' )
+ ADDPROPERTY( toReg, 'Reserved3', '' )
+ ADDPROPERTY( toReg, 'Reserved4', '' )
+ ADDPROPERTY( toReg, 'Reserved5', '' )
+ ADDPROPERTY( toReg, 'Reserved6', '' )
+ ADDPROPERTY( toReg, 'Reserved7', '' )
+ ADDPROPERTY( toReg, 'Reserved8', '' )
+ ADDPROPERTY( toReg, 'Properties', '' )
+ ADDPROPERTY( toReg, 'Protected', '' )
+ ADDPROPERTY( toReg, 'Methods', '' )
+ ENDPROC
+
+
+ *----------------------------------------------------------------------------------------
+ PROCEDURE prepararObjetoReg_VCX
+ LPARAMETERS toReg, tcClass, tcParent, tcObjName
+
+ toReg = CREATEOBJECT("EMPTY")
+ ADDPROPERTY( toReg, 'Class', tcClass )
+ ADDPROPERTY( toReg, 'Parent', tcParent )
+ ADDPROPERTY( toReg, 'objName', tcObjName )
+ ADDPROPERTY( toReg, 'Reserved1', '' )
+ ADDPROPERTY( toReg, 'Reserved2', '' )
+ ADDPROPERTY( toReg, 'Reserved3', '' )
+ ADDPROPERTY( toReg, 'Reserved4', '' )
+ ADDPROPERTY( toReg, 'Reserved5', '' )
+ ADDPROPERTY( toReg, 'Reserved6', '' )
+ ADDPROPERTY( toReg, 'Reserved7', '' )
+ ADDPROPERTY( toReg, 'Reserved8', '' )
+ ADDPROPERTY( toReg, 'Properties', '' )
+ ADDPROPERTY( toReg, 'Protected', '' )
+ ADDPROPERTY( toReg, 'Methods', '' )
+ ENDPROC
+
+
+ENDDEFINE
diff --git a/TESTS/ut__foxbin2prg.prg b/TESTS/ut__foxbin2prg.prg
new file mode 100644
index 0000000..34ab5b3
--- /dev/null
+++ b/TESTS/ut__foxbin2prg.prg
@@ -0,0 +1,362 @@
+DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg
+
+ #IF .F.
+ LOCAL THIS AS ut__foxbin2prg OF ut__foxbin2prg.prg
+ #ENDIF
+
+ #DEFINE C_FB2P_VALUE_I ''
+ #DEFINE C_FB2P_VALUE_F ''
+ #DEFINE CR_LF CHR(13) + CHR(10)
+ #DEFINE C_CR CHR(13)
+ #DEFINE C_LF CHR(10)
+ #DEFINE C_TAB CHR(9)
+ #DEFINE C_PROC 'PROCEDURE'
+ #DEFINE C_ENDPROC 'ENDPROC'
+ #DEFINE C_TEXT 'TEXT'
+ #DEFINE C_ENDTEXT 'ENDTEXT'
+ #DEFINE C_IF_F '#IF .F.'
+ #DEFINE C_ENDIF '#ENDIF'
+ #DEFINE C_DEFINE_CLASS 'DEFINE CLASS'
+ #DEFINE C_ENDDEFINE_CLASS 'ENDDEFINE'
+ icObj = NULL
+
+
+ *******************************************************************************************************************************************
+ FUNCTION SETUP
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ *LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ SET PROCEDURE TO 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ oFXU_LIB = CREATEOBJECT('CL_FXU_CONFIG')
+ oFXU_LIB.setup_comun()
+
+ *THIS.icObj = NEWOBJECT("c_conversor_base", "FOXBIN2PRG.PRG")
+ *loObj = THIS.icObj
+ *loObj.l_Test = .F.
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION TearDown
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+ THIS.icObj = NULL
+
+ IF VARTYPE(oFXU_LIB) = "O"
+ oFXU_LIB.teardown_comun()
+ oFXU_LIB = NULL
+ ENDIF
+ RELEASE PROCEDURE 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Evaluate_results
+ LPARAMETERS toEx AS EXCEPTION, tnCodError_Esperado, tc_OutputFile, tcParent, tcClass, tcObjName, toReg_Esperado
+
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+
+ IF PCOUNT() = 0
+ THIS.messageout( "* Support method, not a valid test." )
+ RETURN .T.
+ ENDIF
+
+
+ LOCAL lnCodError, lcTipoBinario, toReg ;
+ , loModulo AS CL_CLASE OF "FOXBIN2PRG.PRG" ;
+ , loCnv AS c_foxbin2prg OF "FOXBIN2PRG.PRG"
+
+ *-- TEST
+ TRY
+ lcTipoBinario = UPPER( JUSTEXT( tc_OutputFile ) )
+
+ IF FILE(tc_OutputFile)
+ SELECT 0
+ USE (tc_OutputFile) SHARED NOUPDATE ALIAS TABLABIN
+ ELSE
+ ERROR 'No se encontró el archivo "' + tc_OutputFile + '"'
+ ENDIF
+
+ IF EMPTY(tcParent) AND EMPTY(tcClass) AND EMPTY(tcObjName)
+ DO CASE
+ CASE lcTipoBinario = 'SCX'
+ LOCATE FOR PLATFORM=="COMMENT " AND UniqueID=="Screen "
+ CASE lcTipoBinario = 'VCX'
+ LOCATE FOR PLATFORM=="COMMENT " AND UniqueID=="Class "
+ ENDCASE
+ IF NOT FOUND()
+ ERROR 'No se encontró el registro de cabecera "' + UniqueID + '"'
+ ENDIF
+ ELSE
+ LOCATE FOR CLASS==tcClass AND PARENT==tcParent AND objName==tcObjName
+ IF NOT FOUND()
+ ERROR 'No se encontró el registro para CLASS=="' + tcClass + '" AND PARENT=="' + tcParent + '" AND objName=="' + tcObjName + '"'
+ ENDIF
+ ENDIF
+
+ SCATTER MEMO NAME toReg
+
+ CATCH TO toEx
+ FINALLY
+ USE IN (SELECT("TABLABIN"))
+ ENDTRY
+
+
+ IF ISNULL(toEx)
+ LOCAL laPropsAndValues(1,2), lnPropsAndValues_Count, laPropsAndValues_Esperado(1,2), lnPropsAndValues_Count_Esperado ;
+ , lnPropsAndComments_Count, lnPropsAndComments_Count_Esperado, laPropsAndComments(1,2), laPropsAndComments_Esperado(1,2) ;
+ , laProtected(1), lnProtected_Count, laProtected_Esperado(1), lnProtected_Count_Esperado ;
+ , laMethods(1,2), lnMethods_Count, laMethods_Esperado(1,2), lnMethods_Count_Esperado, lcExtraData
+ LOCAL loObj AS c_conversor_bin_a_prg OF "FOXBIN2PRG.PRG"
+
+ *-- Algunos ajustes para mejor visualización de caracteres especiales
+ *tcPropValue = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcPropValue )
+ loObj = NEWOBJECT("c_conversor_bin_a_prg", "FOXBIN2PRG.PRG")
+
+ *-- Reserved3
+ loObj.get_PropsAndCommentsFrom_RESERVED3( toReg.RESERVED3, .F., @laPropsAndComments, @lnPropsAndComments_Count, '' )
+ loObj.get_PropsAndCommentsFrom_RESERVED3( toReg_Esperado.RESERVED3, .F., @laPropsAndComments_Esperado, @lnPropsAndComments_Count_Esperado, '' )
+
+ *-- Properties
+ loObj.get_PropsAndValuesFrom_PROPERTIES( toReg.PROPERTIES, 0, @laPropsAndValues, @lnPropsAndValues_Count, '' )
+ loObj.get_PropsAndValuesFrom_PROPERTIES( toReg_Esperado.PROPERTIES, 0, @laPropsAndValues_Esperado, @lnPropsAndValues_Count_Esperado, '' )
+
+ *-- Protected
+ loObj.get_PropsFrom_PROTECTED( toReg.PROTECTED, .F., @laProtected, @lnProtected_Count, '' )
+ loObj.get_PropsFrom_PROTECTED( toReg_Esperado.PROTECTED, .F., @laProtected_Esperado, @lnProtected_Count_Esperado, '' )
+
+ *-- Methods
+ loObj.get_ADD_OBJECT_METHODS( toReg, toReg, '', @laMethods, '', @lnMethods_Count )
+ loObj.get_ADD_OBJECT_METHODS( toReg_Esperado, toReg_Esperado, '', @laMethods_Esperado, '', @lnMethods_Count_Esperado )
+
+ lcExtraData = tcParent + '.' + tcObjName + ' (' + tcClass + ')'
+
+
+ *-- Visualización de valores
+ THIS.messageout( LOWER(PROGRAM(PROGRAM(-1)-1)) )
+
+ THIS.messageout( 'PROPERTIES esperadas para ' + lcExtraData + ': ' ;
+ + TRANSFORM(lnPropsAndValues_Count_Esperado) + ' (Tamaño = ' + TRANSFORM(LEN(toReg_Esperado.PROPERTIES)) + ' bytes)' )
+ *THIS.messageout( REPLICATE('-',80) )
+ *FOR I = 1 TO lnPropsAndValues_Count_Esperado
+ * THIS.messageout( 'PropName = ' + TRANSFORM(laPropsAndValues_Esperado(I,1)) )
+ *ENDFOR
+
+ THIS.messageout( 'PROTECTED esperadas para ' + lcExtraData + ': ' ;
+ + TRANSFORM(lnProtected_Count_Esperado) + ' (Tamaño = ' + TRANSFORM(LEN(toReg_Esperado.PROTECTED)) + ' bytes)' )
+ *THIS.messageout( REPLICATE('-',80) )
+ *FOR I = 1 TO lnProtected_Count_Esperado
+ * THIS.messageout( 'PropName = ' + TRANSFORM(laProtected_Esperado(I,1)) )
+ *ENDFOR
+
+ THIS.messageout( 'RESERVED3 esperadas para ' + lcExtraData + ': ' ;
+ + TRANSFORM(lnPropsAndComments_Count_Esperado) + ' (Tamaño = ' + TRANSFORM(LEN(toReg_Esperado.RESERVED3)) + ' bytes)' )
+ *THIS.messageout( REPLICATE('-',80) )
+ *FOR I = 1 TO lnPropsAndComments_Count_Esperado
+ * THIS.messageout( 'PropName = ' + TRANSFORM(laPropsAndComments_Esperado(I,1)) )
+ *ENDFOR
+
+ THIS.messageout( 'METHODS esperadas para ' + lcExtraData + ': ' ;
+ + TRANSFORM(lnMethods_Count_Esperado) + ' (Tamaño = ' + TRANSFORM(LEN(toReg_Esperado.METHODS)) + ' bytes)' )
+ *THIS.messageout( REPLICATE('-',80) )
+ *FOR I = 1 TO lnMethods_Count_Esperado
+ * THIS.messageout( 'Name = ' + TRANSFORM(laMethods_Esperado(I,1)) )
+ *ENDFOR
+
+ THIS.messageout( 'OLE2 esperado para ' + lcExtraData + ': ' + TRANSFORM(toReg_Esperado.OLE2) )
+
+ THIS.messageout( 'Checksum OLE esperado para ' + lcExtraData + ': ' + TRANSFORM(SYS(2007, toReg_Esperado.OLE)) )
+
+
+ *-- Evaluación de valores
+ THIS.assertequals( toReg_Esperado.Reserved1, toReg.Reserved1, "Valor de RESERVED1 para " + lcExtraData )
+ THIS.assertequals( LEN(toReg_Esperado.Reserved1), LEN(toReg.Reserved1), "Tamaño de RESERVED1 para " + lcExtraData )
+
+ THIS.assertequals( toReg_Esperado.Reserved2, toReg.Reserved2, "Valor de RESERVED2 para " + lcExtraData )
+ THIS.assertequals( LEN(toReg_Esperado.Reserved2), LEN(toReg.Reserved2), "Tamaño de RESERVED2 para " + lcExtraData )
+
+ THIS.assertequals( toReg_Esperado.Reserved4, toReg.Reserved4, "Valor de RESERVED4 para " + lcExtraData )
+ THIS.assertequals( LEN(toReg_Esperado.Reserved4), LEN(toReg.Reserved4), "Tamaño de RESERVED4 para " + lcExtraData )
+
+ THIS.assertequals( toReg_Esperado.Reserved5, toReg.Reserved5, "Valor de RESERVED5 para " + lcExtraData )
+ THIS.assertequals( LEN(toReg_Esperado.Reserved5), LEN(toReg.Reserved5), "Tamaño de RESERVED5 para " + lcExtraData )
+
+ THIS.assertequals( toReg_Esperado.Reserved6, toReg.Reserved6, "Valor de RESERVED6 para " + lcExtraData )
+ THIS.assertequals( LEN(toReg_Esperado.Reserved6), LEN(toReg.Reserved6), "Tamaño de RESERVED6 para " + lcExtraData )
+
+ THIS.assertequals( toReg_Esperado.Reserved7, toReg.Reserved7, "Valor de RESERVED7 para " + lcExtraData )
+ THIS.assertequals( LEN(toReg_Esperado.Reserved7), LEN(toReg.Reserved7), "Tamaño de RESERVED7 para " + lcExtraData )
+
+ THIS.assertequals( toReg_Esperado.Reserved8, toReg.Reserved8, "Valor de RESERVED8 para " + lcExtraData )
+ THIS.assertequals( LEN(toReg_Esperado.Reserved8), LEN(toReg.Reserved8), "Tamaño de RESERVED8 para " + lcExtraData )
+
+ THIS.assertequals( toReg_Esperado.OLE2, toReg.OLE2, "Valor de OLE2 para " + lcExtraData )
+ THIS.assertequals( LEN(toReg_Esperado.OLE2), LEN(toReg.OLE2), "Tamaño de OLE2 para " + lcExtraData )
+
+ THIS.assertequals( SYS(2007, toReg_Esperado.OLE), SYS(2007, toReg.OLE), "Valor de OLE (Checksum) para " + lcExtraData )
+ THIS.assertequals( LEN(toReg_Esperado.OLE), LEN(toReg.OLE), "Tamaño de OLE para " + lcExtraData )
+
+ *-- PROPERTIES
+ THIS.assertequals( LEN(toReg_Esperado.PROPERTIES), LEN(toReg.PROPERTIES), "Tamaño de PROPERTIES para " + lcExtraData )
+ THIS.assertequals( lnPropsAndValues_Count_Esperado, lnPropsAndValues_Count, "Cantidad de PROPERTIES para " + lcExtraData )
+ FOR I = 1 TO lnPropsAndValues_Count_Esperado
+ THIS.asserttrue( ASCAN( laPropsAndValues, laPropsAndValues_Esperado(I,1), 1, -1, 1, 0+2+4) > 0 ;
+ , ' Comprobación de que existe la Property "' + TRANSFORM(laPropsAndValues_Esperado(I,1)) + '"' + " para " + lcExtraData )
+ ENDFOR
+
+ *-- RESERVED3
+ THIS.assertequals( LEN(toReg_Esperado.RESERVED3), LEN(toReg.RESERVED3), "Tamaño de RESERVED3 para " + lcExtraData )
+ THIS.assertequals( lnPropsAndComments_Count_Esperado, lnPropsAndComments_Count, "Cantidad de RESERVED3 para " + lcExtraData )
+ FOR I = 1 TO lnPropsAndComments_Count_Esperado
+ THIS.asserttrue( ASCAN( laPropsAndComments, laPropsAndComments_Esperado(I,1), 1, -1, 1, 0+2+4) > 0 ;
+ , ' Comprobación de que existe la Reserved3 "' + TRANSFORM(laPropsAndComments_Esperado(I,1)) + '"' + " para " + lcExtraData )
+ ENDFOR
+
+ *-- PROTECTED
+ THIS.assertequals( LEN(toReg_Esperado.PROTECTED), LEN(toReg.PROTECTED), "Tamaño de PROTECTED para " + lcExtraData )
+ THIS.assertequals( lnProtected_Count_Esperado, lnProtected_Count, "Cantidad de PROTECTED para " + lcExtraData )
+ FOR I = 1 TO lnProtected_Count_Esperado
+ THIS.asserttrue( ASCAN( laProtected, laProtected_Esperado(I,1), 1, -1, 1, 0+2+4) > 0 ;
+ , ' Comprobación de que existe la Protected "' + TRANSFORM(laProtected_Esperado(I,1)) + '"' + " para " + lcExtraData )
+ ENDFOR
+
+ *-- METHODS
+ THIS.assertequals( LEN( STRTRAN( toReg_Esperado.METHODS, CHR(13)+CHR(10), CHR(13) ) ) ;
+ , LEN( STRTRAN( toReg.METHODS, CHR(13)+CHR(10), CHR(13) ) ), "Tamaño de METHODS para " + lcExtraData )
+ THIS.assertequals( lnMethods_Count_Esperado, lnMethods_Count, "Cantidad de METHODS para " + lcExtraData )
+ FOR I = 1 TO lnMethods_Count_Esperado
+ THIS.asserttrue( ASCAN( laMethods, laMethods_Esperado(I,1), 1, -1, 1, 0+2+4) > 0 ;
+ , ' Comprobación de que existe el Method "' + TRANSFORM(laMethods_Esperado(I,1)) + '"' + " para " + lcExtraData )
+ ENDFOR
+
+ ELSE
+ *-- Evaluación de errores
+ THIS.messageout( "Error " + TRANSFORM(toEx.ERRORNO) + ', ' + TRANSFORM(toEx.MESSAGE) )
+ THIS.messageout( toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) )
+ IF NOT INLIST( toEx.ERRORNO, 1098, 2071 ) && Error del usuario (ERROR y THROW)
+ THIS.messageout( TRANSFORM(toEx.LINECONTENTS) )
+ ENDIF
+
+ THIS.assertequals( tnCodError_Esperado, toEx.ERRORNO, 'Error' )
+ ENDIF
+
+ THIS.messageout( '' )
+ THIS.messageout( REPLICATE('*',80) )
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_Ejecutar_FOXBIN2PRG_ParaElForm_FB2P_SCX_YValidarLosCamposDelRegistro
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , lc_File, lc_InputFile, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado ;
+ , loModulo AS CL_CLASE OF "FOXBIN2PRG.PRG" ;
+ , loCnv AS c_foxbin2prg OF "FOXBIN2PRG.PRG" ;
+ , loEx AS EXCEPTION
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+
+ TRY
+ loEx = NULL
+ loCnv = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG")
+ *loCnv.l_Debug = .F.
+ loCnv.l_ShowErrors = .F.
+ *loCnv.l_Test = .T.
+
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ lc_File = 'fb2p_frm_1.scx'
+ lc_InputFile = FORCEPATH( lc_File, 'TESTS\DATOS_READONLY' )
+ lc_OutputFile = FORCEPATH( lc_File, 'TESTS\DATOS_TEST' )
+
+ oFXU_LIB.copiarArchivosParaTest( FORCEEXT( lc_File, LEFT( JUSTEXT(lc_File),2 ) + '?' ) )
+
+ loCnv.Convertir( lc_OutputFile, .F., .F., .T. )
+ loCnv.Convertir( FORCEEXT(lc_OutputFile, LEFT( JUSTEXT(lc_File),2 ) + '2' ), .F., .F., .T. )
+
+ SELECT 0
+ USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIBOBIN_IN
+
+ SCAN ALL FOR NOT DELETED() AND ( UniqueID==PADR('Form',10) OR PLATFORM==PADR("WINDOWS",8) )
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ SCATTER MEMO NAME loReg_Esperado
+ lcClass = loReg_Esperado.CLASS
+ lcParent = loReg_Esperado.PARENT
+ lcObjName = loReg_Esperado.objName
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado )
+ ENDSCAN
+
+ CATCH TO loEx
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado )
+
+ FINALLY
+ USE IN (SELECT("ARCHIBOBIN_IN"))
+ ENDTRY
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_Ejecutar_FOXBIN2PRG_ParaLaLibreria_FB2P_TEST_VCX_YValidarLosCamposDelRegistro
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , lc_File, lc_InputFile, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado ;
+ , loModulo AS CL_CLASE OF "FOXBIN2PRG.PRG" ;
+ , loCnv AS c_foxbin2prg OF "FOXBIN2PRG.PRG" ;
+ , loEx AS EXCEPTION
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+
+ TRY
+ loEx = NULL
+ loCnv = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG")
+ *loCnv.l_Debug = .F.
+ loCnv.l_ShowErrors = .F.
+ *loCnv.l_Test = .T.
+ loCnv.l_PropSort_Enabled = .F. && Para buscar diferencias
+ loCnv.l_MethodSort_Enabled = .F. && Para buscar diferencias
+
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ lc_File = 'fb2p_test.vcx' && 'THCALC.VCX' &&
+ lc_InputFile = FORCEPATH( lc_File, 'TESTS\DATOS_READONLY' )
+ lc_OutputFile = FORCEPATH( lc_File, 'TESTS\DATOS_TEST' )
+
+ oFXU_LIB.copiarArchivosParaTest( FORCEEXT( lc_File, LEFT( JUSTEXT(lc_File),2 ) + '?' ) )
+
+ loCnv.Convertir( lc_OutputFile, .F., .F., .T. )
+ loCnv.Convertir( FORCEEXT(lc_OutputFile, LEFT( JUSTEXT(lc_File),2 ) + '2' ), .F., .F., .T. )
+
+ SELECT 0
+ USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIBOBIN_IN
+
+ SCAN ALL FOR NOT DELETED() AND ( UniqueID==PADR('Class',10) OR PLATFORM==PADR("WINDOWS",8) )
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ SCATTER MEMO NAME loReg_Esperado
+ lcClass = loReg_Esperado.CLASS
+ lcParent = loReg_Esperado.PARENT
+ lcObjName = loReg_Esperado.objName
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado )
+ ENDSCAN
+
+ CATCH TO loEx
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado )
+
+ FINALLY
+ USE IN (SELECT("ARCHIBOBIN_IN"))
+ ENDTRY
+
+ ENDFUNC
+
+
+ENDDEFINE
diff --git a/TESTS/ut__foxbin2prg__c_conversor_base__GetTimeStamp.prg b/TESTS/ut__foxbin2prg__c_conversor_base__GetTimeStamp.prg
new file mode 100644
index 0000000..8def1ab
--- /dev/null
+++ b/TESTS/ut__foxbin2prg__c_conversor_base__GetTimeStamp.prg
@@ -0,0 +1,266 @@
+DEFINE CLASS ut__foxbin2prg__c_conversor_base__GetTimeStamp AS FxuTestCase OF FxuTestCase.prg
+
+ #IF .F.
+ LOCAL THIS AS ut__foxbin2prg__c_conversor_base__GetTimeStamp OF ut__foxbin2prg__c_conversor_base__GetTimeStamp.PRG
+ #ENDIF
+
+ #DEFINE C_FB2P_VALUE_I ''
+ #DEFINE C_FB2P_VALUE_F ''
+ #DEFINE CR_LF CHR(13) + CHR(10)
+ #DEFINE C_CR CHR(13)
+ #DEFINE C_LF CHR(10)
+ #DEFINE C_TAB CHR(9)
+ #DEFINE C_PROC 'PROCEDURE'
+ #DEFINE C_ENDPROC 'ENDPROC'
+ #DEFINE C_TEXT 'TEXT'
+ #DEFINE C_ENDTEXT 'ENDTEXT'
+ #DEFINE C_IF_F '#IF .F.'
+ #DEFINE C_ENDIF '#ENDIF'
+ #DEFINE C_DEFINE_CLASS 'DEFINE CLASS'
+ #DEFINE C_ENDDEFINE_CLASS 'ENDDEFINE'
+ icObj = NULL
+
+
+ *******************************************************************************************************************************************
+ FUNCTION SETUP
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ SET PROCEDURE TO 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ oFXU_LIB = CREATEOBJECT('CL_FXU_CONFIG')
+ oFXU_LIB.setup_comun()
+
+ THIS.icObj = NEWOBJECT("c_conversor_base", "FOXBIN2PRG.PRG")
+ loObj = THIS.icObj
+ loObj.l_Test = .T.
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION TearDown
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+ THIS.icObj = NULL
+
+ IF VARTYPE(oFXU_LIB) = "O"
+ oFXU_LIB.teardown_comun()
+ oFXU_LIB = NULL
+ ENDIF
+ RELEASE PROCEDURE 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Evaluate_results
+ LPARAMETERS toEx AS EXCEPTION, tnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado
+
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+
+ IF PCOUNT() = 0
+ THIS.messageout( "* Support method, not a valid test." )
+ RETURN .T.
+ ENDIF
+
+ IF ISNULL(toEx)
+
+ *-- Visualización de valores
+ THIS.messageout( ' TimeStamp (T) = ' + TRANSFORM(ltTimeStamp) )
+ THIS.messageout( ' TimeStamp (N) = ' + TRANSFORM(lnTimeStamp) )
+
+
+ *-- Evaluación de valores
+ THIS.assertequals( ltTimeStamp_Esperado, ltTimeStamp, "[Fecha y Hora]" )
+
+ ELSE
+ *-- Evaluación de errores
+ THIS.messageout( "Error " + TRANSFORM(toEx.ERRORNO) + ', ' + TRANSFORM(toEx.MESSAGE) )
+ THIS.messageout( toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) )
+ THIS.messageout( TRANSFORM(toEx.LINECONTENTS) )
+
+ THIS.assertequals( tnCodError_Esperado, toEx.ERRORNO, 'Error' )
+ ENDIF
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_DevolverLaFechaHora_2013_12_01_08_02_00_ParaElValor_1132544064
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ lnTimeStamp = 1132544064 && Corresponde a {^2013/12/01 8:02:00}
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ ltTimeStamp_Esperado = TTOC({^2013/12/01 8:02:00})
+
+ *-- TEST
+ ltTimeStamp = loObj.gettimestamp( lnTimeStamp )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado )
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_DevolverLaFechaHora_2013_12_01_08_02_01_ParaElValor_1132544065
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ lnTimeStamp = 1132544065 && Corresponde a {^2013/12/01 8:02:01}
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ ltTimeStamp_Esperado = TTOC({^2013/12/01 8:02:01})
+
+ *-- TEST
+ ltTimeStamp = loObj.gettimestamp( lnTimeStamp )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado )
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_DevolverLaFechaHora_2013_12_01_08_02_30_ParaElValor_1132544094
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ lnTimeStamp = 1132544094 && Corresponde a {^2013/12/01 8:02:30}
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ ltTimeStamp_Esperado = TTOC({^2013/12/01 8:02:30})
+
+ *-- TEST
+ ltTimeStamp = loObj.gettimestamp( lnTimeStamp )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado )
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_DevolverLaFechaHora_2013_12_01_08_02_31_ParaElValor_1132544095
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ lnTimeStamp = 1132544095 && Corresponde a {^2013/12/01 8:02:31}
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ ltTimeStamp_Esperado = TTOC({^2013/12/01 8:02:31})
+
+ *-- TEST
+ ltTimeStamp = loObj.gettimestamp( lnTimeStamp )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado )
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_DevolverLaFechaHora_2013_12_01_08_03_00_ParaElValor_1132544096
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ lnTimeStamp = 1132544096 && Corresponde a {^2013/12/01 8:02:32}
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ ltTimeStamp_Esperado = TTOC({^2013/12/01 8:03:00})
+
+ *-- TEST
+ ltTimeStamp = loObj.gettimestamp( lnTimeStamp )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado )
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_DevolverLaFechaHora_2013_12_01_08_03_01_ParaElValor_1132544097
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ lnTimeStamp = 1132544097 && Corresponde a {^2013/12/01 8:02:33}
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ ltTimeStamp_Esperado = TTOC({^2013/12/01 8:03:01})
+
+ *-- TEST
+ ltTimeStamp = loObj.gettimestamp( lnTimeStamp )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado )
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_DevolverLaFechaHora_2013_12_01_08_03_27_ParaElValor_1132544123__HoraReal__08_02_59
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ lnTimeStamp = 1132544123 && Corresponde a {^2013/12/01 8:02:59}
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ ltTimeStamp_Esperado = TTOC({^2013/12/01 8:03:27})
+
+ *-- TEST
+ ltTimeStamp = loObj.gettimestamp( lnTimeStamp )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado )
+
+ ENDFUNC
+
+
+ENDDEFINE
diff --git a/TESTS/ut__foxbin2prg__c_conversor_base__RowTimeStamp.prg b/TESTS/ut__foxbin2prg__c_conversor_base__RowTimeStamp.prg
new file mode 100644
index 0000000..f4732f0
--- /dev/null
+++ b/TESTS/ut__foxbin2prg__c_conversor_base__RowTimeStamp.prg
@@ -0,0 +1,325 @@
+DEFINE CLASS ut__foxbin2prg__c_conversor_base__RowTimeStamp AS FxuTestCase OF FxuTestCase.prg
+
+ #IF .F.
+ LOCAL THIS AS ut__foxbin2prg__c_conversor_base__RowTimeStamp OF ut__foxbin2prg__c_conversor_base__RowTimeStamp.PRG
+ #ENDIF
+
+ #DEFINE C_FB2P_VALUE_I ''
+ #DEFINE C_FB2P_VALUE_F ''
+ #DEFINE CR_LF CHR(13) + CHR(10)
+ #DEFINE C_CR CHR(13)
+ #DEFINE C_LF CHR(10)
+ #DEFINE C_TAB CHR(9)
+ #DEFINE C_PROC 'PROCEDURE'
+ #DEFINE C_ENDPROC 'ENDPROC'
+ #DEFINE C_TEXT 'TEXT'
+ #DEFINE C_ENDTEXT 'ENDTEXT'
+ #DEFINE C_IF_F '#IF .F.'
+ #DEFINE C_ENDIF '#ENDIF'
+ #DEFINE C_DEFINE_CLASS 'DEFINE CLASS'
+ #DEFINE C_ENDDEFINE_CLASS 'ENDDEFINE'
+ icObj = NULL
+
+
+ *******************************************************************************************************************************************
+ FUNCTION SETUP
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ SET PROCEDURE TO 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ oFXU_LIB = CREATEOBJECT('CL_FXU_CONFIG')
+ oFXU_LIB.setup_comun()
+
+ THIS.icObj = NEWOBJECT("c_conversor_base", "FOXBIN2PRG.PRG")
+ loObj = THIS.icObj
+ loObj.l_Test = .T.
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION TearDown
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+ THIS.icObj = NULL
+
+ IF VARTYPE(oFXU_LIB) = "O"
+ oFXU_LIB.teardown_comun()
+ oFXU_LIB = NULL
+ ENDIF
+ RELEASE PROCEDURE 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Evaluate_results
+ LPARAMETERS toEx AS EXCEPTION, tnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado
+
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+
+ IF PCOUNT() = 0
+ THIS.messageout( "* Support method, not a valid test." )
+ RETURN .T.
+ ENDIF
+
+ IF ISNULL(toEx)
+
+ *-- Visualización de valores
+ THIS.messageout( ' TimeStamp (T) = ' + TRANSFORM(ltTimeStamp) )
+ THIS.messageout( ' TimeStamp (N) = ' + TRANSFORM(lnTimeStamp) )
+
+
+ *-- Evaluación de valores
+ THIS.assertequals( lnTimeStamp_Esperado, lnTimeStamp, "[Valor de TimeStamp]" )
+
+ ELSE
+ *-- Evaluación de errores
+ THIS.messageout( "Error " + TRANSFORM(toEx.ERRORNO) + ', ' + TRANSFORM(toEx.MESSAGE) )
+ THIS.messageout( toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) )
+ THIS.messageout( TRANSFORM(toEx.LINECONTENTS) )
+
+ THIS.assertequals( tnCodError_Esperado, toEx.ERRORNO, 'Error' )
+ ENDIF
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_DevolverElValor_1132544064_ParaLaFechaHora_2013_12_01_08_02_00
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ ltTimeStamp = {^2013/12/01 8:02:00} && Le corresponde el numero 1132544064
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ lnTimeStamp_Esperado = 1132544064
+ *lnTimeStamp_Esperado = loObj.rowtimestamp( ltTimeStamp )
+
+ *-- TEST
+ lnTimeStamp = loObj.rowtimestamp( ltTimeStamp )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado )
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_DevolverElValor_1132544065_ParaLaFechaHora_2013_12_01_08_02_01
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ ltTimeStamp = {^2013/12/01 8:02:01} && Le corresponde el numero 1132544065
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ lnTimeStamp_Esperado = 1132544065
+ *lnTimeStamp_Esperado = loObj.rowtimestamp( ltTimeStamp )
+
+ *-- TEST
+ lnTimeStamp = loObj.rowtimestamp( ltTimeStamp )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado )
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_DevolverElValor_1132544095_ParaLaFechaHora_2013_12_01_08_02_31
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ ltTimeStamp = {^2013/12/01 8:02:31} && Le corresponde el numero 1132544095
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ lnTimeStamp_Esperado = 1132544095
+ *lnTimeStamp_Esperado = loObj.rowtimestamp( ltTimeStamp )
+
+ *-- TEST
+ lnTimeStamp = loObj.rowtimestamp( ltTimeStamp )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado )
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_DevolverElValor_1132544096_ParaLaFechaHora_2013_12_01_08_02_32
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ ltTimeStamp = {^2013/12/01 8:02:32} && Le corresponde el numero 1132544096
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ lnTimeStamp_Esperado = 1132544096
+ *lnTimeStamp_Esperado = loObj.rowtimestamp( ltTimeStamp )
+
+ *-- TEST
+ lnTimeStamp = loObj.rowtimestamp( ltTimeStamp )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado )
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_DevolverElValor_1132544097_ParaLaFechaHora_2013_12_01_08_02_33
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ ltTimeStamp = {^2013/12/01 8:02:33} && Le corresponde el numero 1132544097
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ lnTimeStamp_Esperado = 1132544097
+ *lnTimeStamp_Esperado = loObj.rowtimestamp( ltTimeStamp-1 )
+
+ *-- TEST
+ lnTimeStamp = loObj.rowtimestamp( ltTimeStamp )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado )
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_DevolverElValor_1132544123_ParaLaFechaHora_2013_12_01_08_02_59
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ ltTimeStamp = {^2013/12/01 8:02:59} && Le corresponde el numero 1132544123
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ lnTimeStamp_Esperado = 1132544123
+ *lnTimeStamp_Esperado = loObj.rowtimestamp( ltTimeStamp )
+
+ *-- TEST
+ lnTimeStamp = loObj.rowtimestamp( ltTimeStamp )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado )
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_DevolverElValor_1132544096_ParaLaFechaHora_2013_12_01_08_03_00
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ ltTimeStamp = {^2013/12/01 8:03:00} && Le corresponde el numero 1132544096
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ lnTimeStamp_Esperado = 1132544096
+ *lnTimeStamp_Esperado = loObj.rowtimestamp( ltTimeStamp )
+
+ *-- TEST
+ lnTimeStamp = loObj.rowtimestamp( ltTimeStamp )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado )
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_DevolverElValor_1132544097_ParaLaFechaHora_2013_12_01_08_03_01
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ ltTimeStamp = {^2013/12/01 8:03:01} && Le corresponde el numero 1132544097
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ lnTimeStamp_Esperado = 1132544097
+ *lnTimeStamp_Esperado = loObj.rowtimestamp( ltTimeStamp-1 )
+
+ *-- TEST
+ lnTimeStamp = loObj.rowtimestamp( ltTimeStamp )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado )
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_DevolverElValor_1132544123_ParaLaFechaHora_2013_12_01_08_03_27
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ ltTimeStamp = {^2013/12/01 8:03:27} && Le corresponde el numero 1132544123
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ lnTimeStamp_Esperado = 1132544123
+ *lnTimeStamp_Esperado = loObj.rowtimestamp( ltTimeStamp )
+
+ *-- TEST
+ lnTimeStamp = loObj.rowtimestamp( ltTimeStamp )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado )
+
+ ENDFUNC
+
+
+ENDDEFINE
diff --git a/TESTS/ut__foxbin2prg__c_conversor_base__get_SeparatedPropAndValue.prg b/TESTS/ut__foxbin2prg__c_conversor_base__get_SeparatedPropAndValue.prg
new file mode 100644
index 0000000..69798d8
--- /dev/null
+++ b/TESTS/ut__foxbin2prg__c_conversor_base__get_SeparatedPropAndValue.prg
@@ -0,0 +1,127 @@
+DEFINE CLASS ut__foxbin2prg__c_conversor_base__get_SeparatedPropAndValue AS FxuTestCase OF FxuTestCase.prg
+
+ #IF .F.
+ LOCAL THIS AS ut__foxbin2prg__c_conversor_base__get_SeparatedPropAndValue OF ut__foxbin2prg__c_conversor_base__get_SeparatedPropAndValue.PRG
+ #ENDIF
+
+ #DEFINE C_FB2P_VALUE_I ''
+ #DEFINE C_FB2P_VALUE_F ''
+ #DEFINE CR_LF CHR(13) + CHR(10)
+ #DEFINE C_CR CHR(13)
+ #DEFINE C_LF CHR(10)
+ #DEFINE C_TAB CHR(9)
+ #DEFINE C_PROC 'PROCEDURE'
+ #DEFINE C_ENDPROC 'ENDPROC'
+ #DEFINE C_TEXT 'TEXT'
+ #DEFINE C_ENDTEXT 'ENDTEXT'
+ #DEFINE C_IF_F '#IF .F.'
+ #DEFINE C_ENDIF '#ENDIF'
+ #DEFINE C_DEFINE_CLASS 'DEFINE CLASS'
+ #DEFINE C_ENDDEFINE_CLASS 'ENDDEFINE'
+ icObj = NULL
+
+
+ *******************************************************************************************************************************************
+ FUNCTION SETUP
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ SET PROCEDURE TO 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ oFXU_LIB = CREATEOBJECT('CL_FXU_CONFIG')
+ oFXU_LIB.setup_comun()
+
+ THIS.icObj = NEWOBJECT("c_conversor_base", "FOXBIN2PRG.PRG")
+ loObj = THIS.icObj
+ loObj.l_Test = .T.
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION TearDown
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+ THIS.icObj = NULL
+
+ IF VARTYPE(oFXU_LIB) = "O"
+ oFXU_LIB.teardown_comun()
+ oFXU_LIB = NULL
+ ENDIF
+ RELEASE PROCEDURE 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Evaluate_results
+ LPARAMETERS toEx AS EXCEPTION, tnCodError_Esperado ;
+ , tcPropName, tcPropValue, tcComentario, tcPropName_Esperado, tcPropValue_Esperado
+
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+
+ IF PCOUNT() = 0
+ THIS.messageout( "* Support method, not a valid test." )
+ RETURN .T.
+ ENDIF
+
+ IF ISNULL(toEx)
+ *-- Algunos ajustes para mejor visualización de caracteres especiales
+ tcPropValue = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcPropValue )
+ tcPropValue_Esperado = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcPropValue_Esperado )
+
+
+ *-- Visualización de valores
+ THIS.messageout( ' PropName = ' + TRANSFORM(tcPropName) )
+ THIS.messageout( ' PropValue = ' + TRANSFORM(tcPropValue) )
+
+
+ *-- Evaluación de valores
+ THIS.assertequals( tcPropName_Esperado, tcPropName, "PropsAndValues_Count" )
+ THIS.assertequals( tcPropValue_Esperado, tcPropValue, "PropsAndValues_Count" )
+
+ ELSE
+ *-- Evaluación de errores
+ THIS.messageout( "Error " + TRANSFORM(toEx.ERRORNO) + ', ' + TRANSFORM(toEx.MESSAGE) )
+ THIS.messageout( toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) )
+ THIS.messageout( TRANSFORM(toEx.LINECONTENTS) )
+
+ THIS.assertequals( tnCodError_Esperado, toEx.ERRORNO, 'Error' )
+ ENDIF
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_DevolverSeparados_Prop_y_Value
+ LOCAL lnCodError, lcMenError, lnCodError_Esperado ;
+ , laProps(1,2) ,lcPropName, lcPropValue, lcComentario, lcPropName_Esperado, lcPropValue_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ lcPropName = '_memberdata'
+ lcPropValue = ''
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ laProps( 1,1) = 'prop_especial_cr = Este es el valor 1
Este el 2
Y este bajo Shift_Enter el 3'
+ laProps( 1,2) = ''
+ lcPropName_Esperado = 'prop_especial_cr'
+ lcPropValue_Esperado = 'Este es el valor 1
Este el 2
Y este bajo Shift_Enter el 3'
+
+ *-- TEST
+ loObj.get_SeparatedPropAndValue( laProps(1,1), @lcPropName, @lcPropValue )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado ;
+ , @lcPropName, @lcPropValue, @lcComentario, @lcPropName_Esperado, @lcPropValue_Esperado )
+
+ ENDFUNC
+
+
+ENDDEFINE
diff --git a/TESTS/ut__foxbin2prg__c_conversor_base__normalizarValorPropiedad.prg b/TESTS/ut__foxbin2prg__c_conversor_base__normalizarValorPropiedad.prg
new file mode 100644
index 0000000..774d812
--- /dev/null
+++ b/TESTS/ut__foxbin2prg__c_conversor_base__normalizarValorPropiedad.prg
@@ -0,0 +1,235 @@
+DEFINE CLASS ut__foxbin2prg__c_conversor_base__normalizarValorPropiedad AS FxuTestCase OF FxuTestCase.prg
+
+ #IF .F.
+ LOCAL THIS AS ut__foxbin2prg__c_conversor_base__normalizarValorPropiedad OF ut__foxbin2prg__c_conversor_base__normalizarValorPropiedad.PRG
+ #ENDIF
+
+ #DEFINE C_FB2P_VALUE_I ''
+ #DEFINE C_FB2P_VALUE_F ''
+ #DEFINE CR_LF CHR(13) + CHR(10)
+ #DEFINE C_CR CHR(13)
+ #DEFINE C_LF CHR(10)
+ #DEFINE C_TAB CHR(9)
+ #DEFINE C_PROC 'PROCEDURE'
+ #DEFINE C_ENDPROC 'ENDPROC'
+ #DEFINE C_TEXT 'TEXT'
+ #DEFINE C_ENDTEXT 'ENDTEXT'
+ #DEFINE C_IF_F '#IF .F.'
+ #DEFINE C_ENDIF '#ENDIF'
+ #DEFINE C_DEFINE_CLASS 'DEFINE CLASS'
+ #DEFINE C_ENDDEFINE_CLASS 'ENDDEFINE'
+ icObj = NULL
+
+
+ *******************************************************************************************************************************************
+ FUNCTION SETUP
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ SET PROCEDURE TO 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ oFXU_LIB = CREATEOBJECT('CL_FXU_CONFIG')
+ oFXU_LIB.setup_comun()
+
+ THIS.icObj = NEWOBJECT("c_conversor_base", "FOXBIN2PRG.PRG")
+ loObj = THIS.icObj
+ loObj.l_Test = .T.
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION TearDown
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+ THIS.icObj = NULL
+
+ IF VARTYPE(oFXU_LIB) = "O"
+ oFXU_LIB.teardown_comun()
+ oFXU_LIB = NULL
+ ENDIF
+ RELEASE PROCEDURE 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Evaluate_results
+ LPARAMETERS toEx AS EXCEPTION, tnCodError_Esperado ;
+ , tcPropName, tcPropValue, tcComentario, tcPropValue_Esperado
+
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+
+ IF PCOUNT() = 0
+ THIS.messageout( "* Support method, not a valid test." )
+ RETURN .T.
+ ENDIF
+
+ IF ISNULL(toEx)
+ *-- Algunos ajustes para mejor visualización de caracteres especiales
+ tcPropValue = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcPropValue )
+ tcPropValue_Esperado = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcPropValue_Esperado )
+
+
+ *-- Visualización de valores
+ THIS.messageout( ' PropName = ' + TRANSFORM(tcPropName) )
+ THIS.messageout( ' PropValue = ' + TRANSFORM(tcPropValue) )
+
+
+ *-- Evaluación de valores
+ THIS.assertequals( tcPropValue_Esperado, tcPropValue, "PropsAndValues_Count" )
+
+ ELSE
+ *-- Evaluación de errores
+ THIS.messageout( "Error " + TRANSFORM(toEx.ERRORNO) + ', ' + TRANSFORM(toEx.MESSAGE) )
+ THIS.messageout( toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) )
+ THIS.messageout( TRANSFORM(toEx.LINECONTENTS) )
+
+ THIS.assertequals( tnCodError_Esperado, toEx.ERRORNO, 'Error' )
+ ENDIF
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_normalizarLaPropiedad_memberdata_separandoLosMiembrosPorLinea_ConLosTags_VFPData_PorFuera
+ LOCAL lnCodError, lcMenError, lnCodError_Esperado ;
+ , lcPropName, lcPropValue, lcComentario, lcPropValue_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ lcPropName = '_memberdata'
+ lcPropValue = ''
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ TEXT TO lcPropValue_Esperado TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+
+ <><>
+ <><>
+ ENDTEXT
+
+ *-- TEST
+ loObj.normalizarValorPropiedad( @lcPropName, @lcPropValue, @lcComentario )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado ;
+ , @lcPropName, @lcPropValue, @lcComentario, @lcPropValue_Esperado )
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_normalizarUnaPropiedadCon_CR__AgregandoLosTags_fb2p_value_PorFueraYCodificandoLos_CR
+ LOCAL lnCodError, lcMenError, lnCodError_Esperado ;
+ , lcPropName, lcPropValue, lcComentario, lcPropValue_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ lcPropName = 'unaPropiedadCon_CR'
+ lcPropValue = C_FB2P_VALUE_I + 'valor 1' + C_CR + 'valor 2' + C_CR + 'valor 3' + C_FB2P_VALUE_F
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ lcPropValue_Esperado = C_FB2P_VALUE_I + 'valor 1
valor 2
valor 3' + C_FB2P_VALUE_F
+
+ *-- TEST
+ loObj.normalizarValorPropiedad( @lcPropName, @lcPropValue, @lcComentario )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado ;
+ , @lcPropName, @lcPropValue, @lcComentario, @lcPropValue_Esperado )
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_normalizarUnaPropiedadCon_CRLF__AgregandoLosTags_fb2p_value_PorFueraYSinCodificarLos_CRLF
+ LOCAL lnCodError, lcMenError, lnCodError_Esperado ;
+ , lcPropName, lcPropValue, lcComentario, lcPropValue_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ lcPropName = 'unaPropiedadCon_CR'
+ lcPropValue = C_FB2P_VALUE_I + 'valor 1' + CR_LF + 'valor 2' + CR_LF + 'valor 3' + C_FB2P_VALUE_F
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ lcPropValue_Esperado = C_FB2P_VALUE_I + 'valor 1' + CR_LF + 'valor 2' + CR_LF + 'valor 3' + C_FB2P_VALUE_F
+
+ *-- TEST
+ loObj.normalizarValorPropiedad( @lcPropName, @lcPropValue, @lcComentario )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado ;
+ , @lcPropName, @lcPropValue, @lcComentario, @lcPropValue_Esperado )
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_normalizarUnaPropiedadCon_CR_y_CRLF_mixta__AgregandoLosTags_fb2p_value_PorFueraCodificandoLos_CR_yMantneiendoLos_CRLF
+ LOCAL lnCodError, lcMenError, lnCodError_Esperado ;
+ , lcPropName, lcPropValue, lcComentario, lcPropValue_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ lcPropName = 'unaPropiedadCon_CR'
+ lcPropValue = C_FB2P_VALUE_I + 'valor 1' + C_CR + 'valor 2' + CR_LF + 'valor 3' + C_FB2P_VALUE_F
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ lcPropValue_Esperado = C_FB2P_VALUE_I + 'valor 1' + '
' + 'valor 2' + CR_LF + 'valor 3' + C_FB2P_VALUE_F
+
+ *-- TEST
+ loObj.normalizarValorPropiedad( @lcPropName, @lcPropValue, @lcComentario )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado ;
+ , @lcPropName, @lcPropValue, @lcComentario, @lcPropValue_Esperado )
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_normalizarUnaPropiedadCon_LF_y_CRLF_mixta__AgregandoLosTags_fb2p_value_PorFueraCodificandoLos_LF_yMantneiendoLos_CRLF
+ LOCAL lnCodError, lcMenError, lnCodError_Esperado ;
+ , lcPropName, lcPropValue, lcComentario, lcPropValue_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ lcPropName = 'unaPropiedadCon_CR'
+ lcPropValue = C_FB2P_VALUE_I + 'valor 1' + C_LF + 'valor 2' + CR_LF + 'valor 3' + C_FB2P_VALUE_F
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ lcPropValue_Esperado = C_FB2P_VALUE_I + 'valor 1' + '
' + 'valor 2' + CR_LF + 'valor 3' + C_FB2P_VALUE_F
+
+ *-- TEST
+ loObj.normalizarValorPropiedad( @lcPropName, @lcPropValue, @lcComentario )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado ;
+ , @lcPropName, @lcPropValue, @lcComentario, @lcPropValue_Esperado )
+
+ ENDFUNC
+
+
+ENDDEFINE
diff --git a/TESTS/ut__foxbin2prg__c_conversor_bin_a_prg__get_PropsAndValuesFrom_PROPERTIES.prg b/TESTS/ut__foxbin2prg__c_conversor_bin_a_prg__get_PropsAndValuesFrom_PROPERTIES.prg
new file mode 100644
index 0000000..46841c3
--- /dev/null
+++ b/TESTS/ut__foxbin2prg__c_conversor_bin_a_prg__get_PropsAndValuesFrom_PROPERTIES.prg
@@ -0,0 +1,296 @@
+DEFINE CLASS ut__foxbin2prg__c_conversor_bin_a_prg__get_PropsAndValuesFrom_PROPERTIES AS FxuTestCase OF FxuTestCase.prg
+
+ #IF .F.
+ LOCAL THIS AS ut__foxbin2prg__c_conversor_bin_a_prg__get_PropsAndValuesFrom_PROPERTIES OF ut__foxbin2prg__c_conversor_bin_a_prg__get_PropsAndValuesFrom_PROPERTIES.PRG
+ #ENDIF
+
+ #DEFINE C_FB2P_VALUE_I ''
+ #DEFINE C_FB2P_VALUE_F ''
+ #DEFINE CR_LF CHR(13) + CHR(10)
+ #DEFINE C_CR CHR(13)
+ #DEFINE C_LF CHR(10)
+ #DEFINE C_TAB CHR(9)
+ #DEFINE C_PROC 'PROCEDURE'
+ #DEFINE C_ENDPROC 'ENDPROC'
+ #DEFINE C_TEXT 'TEXT'
+ #DEFINE C_ENDTEXT 'ENDTEXT'
+ #DEFINE C_IF_F '#IF .F.'
+ #DEFINE C_ENDIF '#ENDIF'
+ #DEFINE C_DEFINE_CLASS 'DEFINE CLASS'
+ #DEFINE C_ENDDEFINE_CLASS 'ENDDEFINE'
+ icObj = NULL
+
+
+ *******************************************************************************************************************************************
+ FUNCTION SETUP
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ SET PROCEDURE TO 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ oFXU_LIB = CREATEOBJECT('CL_FXU_CONFIG')
+ oFXU_LIB.setup_comun()
+
+ THIS.icObj = NEWOBJECT("c_conversor_bin_a_prg", "FOXBIN2PRG.PRG")
+ loObj = THIS.icObj
+ loObj.l_Test = .T.
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION TearDown
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+ THIS.icObj = NULL
+
+ IF VARTYPE(oFXU_LIB) = "O"
+ oFXU_LIB.teardown_comun()
+ oFXU_LIB = NULL
+ ENDIF
+ RELEASE PROCEDURE 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Evaluate_results
+ LPARAMETERS toEx AS EXCEPTION, tnCodError_Esperado ;
+ , tcMemo, tnSort, taPropsAndValues, tnPropsAndValues_Count, tcSortedMemo ;
+ , taPropsAndValues_Esperado, tnPropsAndValues_Count_Esperado, tcMemo_Esperado
+
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+ LOCAL loObj AS c_conversor_bin_a_prg OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+
+ IF PCOUNT() = 0
+ THIS.messageout( "* Support method, not a valid test." )
+ RETURN .T.
+ ENDIF
+
+ IF ISNULL(toEx)
+ *-- Algunos ajustes para mejor visualización de caracteres especiales
+ tcSortedMemo = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcSortedMemo )
+ tcMemo_Esperado = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcMemo_Esperado )
+ FOR I = 1 TO tnPropsAndValues_Count
+ taPropsAndValues(I,2) = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( TRANSFORM(taPropsAndValues(I,2)) )
+ ENDFOR
+ FOR I = 1 TO tnPropsAndValues_Count_Esperado
+ taPropsAndValues_Esperado(I,2) = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( TRANSFORM(taPropsAndValues_Esperado(I,2)) )
+ ENDFOR
+
+
+ *-- Visualización de valores
+ THIS.messageout( ' Sort = ' + TRANSFORM(tnSort) )
+ THIS.messageout( REPLICATE('-',50) )
+ FOR I = 1 TO tnPropsAndValues_Count
+ THIS.messageout( "taPropsAndValues(" + STR(I,3) + '): ' ;
+ + TRANSFORM(taPropsAndValues(I,1)) + ' = ' + TRANSFORM(taPropsAndValues(I,2)) + '' )
+ ENDFOR
+ THIS.messageout( REPLICATE('-',50) )
+ FOR I = 1 TO tnPropsAndValues_Count_Esperado
+ THIS.messageout( "taPropsAndValues_Esp(" + STR(I,3) + '): ' ;
+ + TRANSFORM(taPropsAndValues_Esperado(I,1)) + ' = ' + TRANSFORM(taPropsAndValues_Esperado(I,2)) + '' )
+ ENDFOR
+ THIS.messageout( REPLICATE('-',50) )
+ THIS.messageout( 'Sorted Memo: [' + tcSortedMemo + ']' )
+
+
+ *-- Evaluación de valores
+ THIS.assertequals( tnPropsAndValues_Count_Esperado, tnPropsAndValues_Count, "PropsAndValues_Count" )
+
+ FOR I = 1 TO MIN(tnPropsAndValues_Count, tnPropsAndValues_Count_Esperado)
+ THIS.assertequals( taPropsAndValues_Esperado(I,1), taPropsAndValues(I,1), "PropAndValue" )
+ ENDFOR
+
+ THIS.assertequals( tcMemo_Esperado, tcSortedMemo, "Memo" )
+
+ ELSE
+ *-- Evaluación de errores
+ THIS.messageout( "Error " + TRANSFORM(toEx.ERRORNO) + ', ' + TRANSFORM(toEx.MESSAGE) )
+ THIS.messageout( toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) )
+ THIS.messageout( TRANSFORM(toEx.LINECONTENTS) )
+
+ THIS.assertequals( tnCodError_Esperado, toEx.ERRORNO, 'Error' )
+ ENDIF
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_evaluarUnMemo_PROPERTIES_yDevolverUnArrayConLasPropsOrdenadas_PrimeroLasNormalesYLuegoLasDeObjeto_Sorted
+ LOCAL lnCodError, lcMenError, lnCodError_Esperado ;
+ , lnSort, laPropsAndValues(1,2), lnPropsAndValues_Count, lcMemo, lcSortedMemo ;
+ , laPropsAndValues_Esperado(1,2), lnPropsAndValues_Count_Esperado, lcMemo_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_bin_a_prg OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+
+ TEXT TO lcMemo TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ Height = 2.73
+ Width = 27.40
+ prop1 = .F.
+ _memberdata =
+ prop_especial_cr = <> 57Este es el valor 1
Este el 2
Y este bajo Shift_Enter el 3
+ prop_especial_crlf = <> 35El valor 1
+ El valor 2
+ Y el 3!
+ <>
+ Name = "c1"
+ Page2.Caption = "Page2"
+ Page1.Name = "Page1"
+ ENDTEXT
+
+ lcMemo = STRTRAN( STRTRAN( lcMemo, '
', CHR(13) ), '
', CHR(10) )
+ lnSort = 1
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ DIMENSION laPropsAndValues_Esperado(9,2)
+ laPropsAndValues_Esperado = ''
+ laPropsAndValues_Esperado( 1,1) = 'Height'
+ laPropsAndValues_Esperado( 1,2) = '2.73'
+ laPropsAndValues_Esperado( 2,1) = 'Name'
+ laPropsAndValues_Esperado( 2,2) = '"c1"'
+ laPropsAndValues_Esperado( 3,1) = 'prop1'
+ laPropsAndValues_Esperado( 3,2) = '.F.'
+ laPropsAndValues_Esperado( 4,1) = 'prop_especial_cr'
+ laPropsAndValues_Esperado( 4,2) = 'Este es el valor 1' + CHR(13) + 'Este el 2' + CHR(13) + 'Y este bajo Shift_Enter el 3'
+ laPropsAndValues_Esperado( 5,1) = 'prop_especial_crlf'
+ laPropsAndValues_Esperado( 5,2) = 'El valor 1' + CHR(13) + CHR(10) ;
+ + 'El valor 2' + CHR(13) + CHR(10) + 'Y el 3!' + CHR(13) + CHR(10) + SPACE(2)
+ laPropsAndValues_Esperado( 6,1) = 'Width'
+ laPropsAndValues_Esperado( 6,2) = '27.40'
+ laPropsAndValues_Esperado( 7,1) = '_memberdata'
+ laPropsAndValues_Esperado( 7,2) = ''
+ laPropsAndValues_Esperado( 8,1) = 'Page1.Name'
+ laPropsAndValues_Esperado( 8,2) = '"Page1"'
+ laPropsAndValues_Esperado( 9,1) = 'Page2.Caption'
+ laPropsAndValues_Esperado( 9,2) = '"Page2"'
+ lnPropsAndValues_Count_Esperado = 9
+
+ TEXT TO lcMemo_Esperado TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ Height = 2.73
+ Name = "c1"
+ prop1 = .F.
+ prop_especial_cr = Este es el valor 1
Este el 2
Y este bajo Shift_Enter el 3
+ prop_especial_crlf =
+ El valor 1
+ El valor 2
+ Y el 3!
+ <>
+
+ Width = 27.40
+ _memberdata =
+ <<>>
+ <<>>
+ Page1.Name = "Page1"
+ Page2.Caption = "Page2"
+
+ ENDTEXT
+
+
+ *-- TEST
+ loObj.get_PropsAndValuesFrom_PROPERTIES( @lcMemo, lnSort, @laPropsAndValues, @lnPropsAndValues_Count, @lcSortedMemo )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado ;
+ , @lcMemo, lnSort, @laPropsAndValues, @lnPropsAndValues_Count, @lcSortedMemo ;
+ , @laPropsAndValues_Esperado, @lnPropsAndValues_Count_Esperado, @lcMemo_Esperado )
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_evaluarUnMemo_PROPERTIES_yDevolverUnArrayConLasPropsSinOrdenar_PrimeroLasNormalesYLuegoLasDeObjeto
+ LOCAL lnCodError, lcMenError, lnCodError_Esperado ;
+ , lnSort, laPropsAndValues(1,2), lnPropsAndValues_Count, lcMemo, lcSortedMemo ;
+ , laPropsAndValues_Esperado(1,2), lnPropsAndValues_Count_Esperado, lcMemo_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_bin_a_prg OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+
+ TEXT TO lcMemo TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ Height = 2.73
+ Width = 27.40
+ prop1 = .F.
+ _memberdata =
+ prop_especial_cr = <> 57Este es el valor 1
Este el 2
Y este bajo Shift_Enter el 3
+ prop_especial_crlf = <> 35El valor 1
+ El valor 2
+ Y el 3!
+ <>
+ Name = "c1"
+ Page2.Caption = "Page2"
+ Page1.Name = "Page1"
+ ENDTEXT
+
+ lcMemo = STRTRAN( STRTRAN( lcMemo, '
', CHR(13) ), '
', CHR(10) )
+ lnSort = 0
+
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ DIMENSION laPropsAndValues_Esperado(9,2)
+ laPropsAndValues_Esperado = ''
+ laPropsAndValues_Esperado( 1,1) = 'Height'
+ laPropsAndValues_Esperado( 1,2) = '2.73'
+ laPropsAndValues_Esperado( 2,1) = 'Width'
+ laPropsAndValues_Esperado( 2,2) = '27.40'
+ laPropsAndValues_Esperado( 3,1) = 'prop1'
+ laPropsAndValues_Esperado( 3,2) = '.F.'
+ laPropsAndValues_Esperado( 4,1) = '_memberdata'
+ laPropsAndValues_Esperado( 4,2) = ''
+ laPropsAndValues_Esperado( 5,1) = 'prop_especial_cr'
+ laPropsAndValues_Esperado( 5,2) = 'Este es el valor 1' + C_CR + 'Este el 2' + C_LF + 'Y este bajo Shift_Enter el 3'
+ laPropsAndValues_Esperado( 6,1) = 'prop_especial_crlf'
+ laPropsAndValues_Esperado( 6,2) = 'El valor 1' + CR_LF ;
+ + 'El valor 2' + CR_LF + 'Y el 3!' + CR_LF + SPACE(2)
+ laPropsAndValues_Esperado( 7,1) = 'Name'
+ laPropsAndValues_Esperado( 7,2) = '"c1"'
+ laPropsAndValues_Esperado( 8,1) = 'Page2.Caption'
+ laPropsAndValues_Esperado( 8,2) = '"Page2"'
+ laPropsAndValues_Esperado( 9,1) = 'Page1.Name'
+ laPropsAndValues_Esperado( 9,2) = '"Page1"'
+ lnPropsAndValues_Count_Esperado = 9
+
+ TEXT TO lcMemo_Esperado TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ Height = 2.73
+ Width = 27.40
+ prop1 = .F.
+ _memberdata =
+ <<>>
+ <<>>
+ prop_especial_cr = Este es el valor 1
Este el 2
Y este bajo Shift_Enter el 3
+ prop_especial_crlf =
+ El valor 1
+ El valor 2
+ Y el 3!
+ <>
+
+ Name = "c1"
+ Page2.Caption = "Page2"
+ Page1.Name = "Page1"
+
+ ENDTEXT
+
+
+ *-- TEST
+ loObj.get_PropsAndValuesFrom_PROPERTIES( @lcMemo, lnSort, @laPropsAndValues, @lnPropsAndValues_Count, @lcSortedMemo )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado ;
+ , @lcMemo, lnSort, @laPropsAndValues, @lnPropsAndValues_Count, @lcSortedMemo ;
+ , @laPropsAndValues_Esperado, @lnPropsAndValues_Count_Esperado, @lcMemo_Esperado )
+
+ ENDFUNC
+
+
+ENDDEFINE
diff --git a/TESTS/ut__foxbin2prg__c_conversor_prg_a_bin__analizarAsignacion_TAG_Indicado.prg b/TESTS/ut__foxbin2prg__c_conversor_prg_a_bin__analizarAsignacion_TAG_Indicado.prg
new file mode 100644
index 0000000..e234e3c
--- /dev/null
+++ b/TESTS/ut__foxbin2prg__c_conversor_prg_a_bin__analizarAsignacion_TAG_Indicado.prg
@@ -0,0 +1,300 @@
+DEFINE CLASS ut__foxbin2prg__c_conversor_prg_a_bin__analizarAsignacion_TAG_Indicado AS FxuTestCase OF FxuTestCase.prg
+
+ #IF .F.
+ LOCAL THIS AS ut__foxbin2prg__c_conversor_prg_a_bin__analizarAsignacion_TAG_Indicado OF ut__foxbin2prg__c_conversor_prg_a_bin__analizarAsignacion_TAG_Indicado.PRG
+ #ENDIF
+
+ #DEFINE C_FB2P_VALUE_I ''
+ #DEFINE C_FB2P_VALUE_F ''
+ #DEFINE CR_LF CHR(13) + CHR(10)
+ #DEFINE C_CR CHR(13)
+ #DEFINE C_LF CHR(10)
+ #DEFINE C_TAB CHR(9)
+ #DEFINE C_PROC 'PROCEDURE'
+ #DEFINE C_ENDPROC 'ENDPROC'
+ #DEFINE C_TEXT 'TEXT'
+ #DEFINE C_ENDTEXT 'ENDTEXT'
+ #DEFINE C_IF_F '#IF .F.'
+ #DEFINE C_ENDIF '#ENDIF'
+ #DEFINE C_DEFINE_CLASS 'DEFINE CLASS'
+ #DEFINE C_ENDDEFINE_CLASS 'ENDDEFINE'
+ icObj = NULL
+
+
+ *******************************************************************************************************************************************
+ FUNCTION SETUP
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ SET PROCEDURE TO 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ oFXU_LIB = CREATEOBJECT('CL_FXU_CONFIG')
+ oFXU_LIB.setup_comun()
+
+ THIS.icObj = NEWOBJECT("c_conversor_prg_a_bin", "FOXBIN2PRG.PRG")
+ loObj = THIS.icObj
+ loObj.l_Test = .T.
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION TearDown
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+ THIS.icObj = NULL
+
+ IF VARTYPE(oFXU_LIB) = "O"
+ oFXU_LIB.teardown_comun()
+ oFXU_LIB = NULL
+ ENDIF
+ RELEASE PROCEDURE 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Evaluate_results
+ LPARAMETERS toEx AS EXCEPTION, tnCodError_Esperado ;
+ , tcPropName, tcPropValue, taProps, tnProp_Count ;
+ , I, tcTag_I, tcTag_F, tnLen_lcTag_I, tnLen_lcTag_F, tcMemo, tcValue_Esperado
+
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+ LOCAL loObj AS c_conversor_prg_a_bin OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+
+ IF PCOUNT() = 0
+ THIS.messageout( "* Support method, not a valid test." )
+ RETURN .T.
+ ENDIF
+
+ IF ISNULL(toEx)
+ *-- Algunos ajustes para mejor visualización de caracteres especiales
+ tcPropValue = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcPropValue )
+ tcValue_Esperado = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcValue_Esperado )
+
+
+ *-- Visualización de valores
+ THIS.messageout( ' Value = ' + TRANSFORM(tcPropValue) )
+ THIS.messageout( ' Value_Esperado = ' + TRANSFORM(tcValue_Esperado) )
+
+
+ *-- Evaluación de valores
+ THIS.assertequals( tcValue_Esperado, tcPropValue, "Valor devuelto" )
+
+ ELSE
+ *-- Evaluación de errores
+ THIS.messageout( "Error " + TRANSFORM(toEx.ERRORNO) + ', ' + TRANSFORM(toEx.MESSAGE) )
+ THIS.messageout( toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) )
+ THIS.messageout( TRANSFORM(toEx.LINECONTENTS) )
+
+ THIS.assertequals( tnCodError_Esperado, toEx.ERRORNO, 'Error' )
+ ENDIF
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_analizarAsignacion_TAG__fb2p_value__EnUnaAsignacion_InLine
+ LOCAL lnCodError, lcMenError, lnCodError_Esperado ;
+ , lcPropName, lcPropValue, laProps(1,2), lnProp_Count, I, lcTag_I, lcTag_F, lnLen_lcTag_I, lnLen_lcTag_F, lcMemo ;
+ , lcValue_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_prg_a_bin OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ lcTag_I = ''
+ lcTag_F = ''
+ lnLen_lcTag_I = LEN(lcTag_I)
+ lnLen_lcTag_F = LEN(lcTag_F)
+ lnProp_Count = 17
+ DIMENSION laProps(lnProp_Count,2)
+ laProps = ''
+ laProps( 1,1) = 'Height = 2.73'
+ laProps( 1,2) = ''
+ laProps( 2,1) = 'Name = "c1"'
+ laProps( 2,2) = ''
+ laProps( 3,1) = 'prop1 = .F.'
+ laProps( 3,2) = 'Mi prop1'
+ laProps( 4,1) = 'prop_especial_cr = Este es el valor 1
Este el 2
Y este bajo Shift_Enter el 3'
+ laProps( 4,2) = ''
+ laProps( 5,1) = 'prop_especial_crlf = '
+ laProps( 5,2) = ''
+ laProps( 6,1) = 'El valor 1'
+ laProps( 6,2) = ''
+ laProps( 7,1) = 'El valor 2'
+ laProps( 7,2) = ''
+ laProps( 8,1) = 'Y el 3!'
+ laProps( 8,2) = ''
+ laProps( 9,1) = ''
+ laProps( 9,2) = ''
+ laProps(10,1) = ''
+ laProps(10,2) = ''
+ laProps(11,2) = 'Debería tener CR+LF'
+ laProps(11,2) = ''
+ laProps(12,1) = 'Width = 27.4'
+ laProps(12,2) = ''
+ laProps(13,1) = '_memberdata = [ ;'
+ laProps(13,2) = ''
+ laProps(14,1) = ' ;'
+ laProps(14,2) = ''
+ laProps(15,1) = ']'
+ laProps(15,2) = 'XML Metadata for customizable properties'
+ I = 4
+ loObj.get_SeparatedPropAndValue( laProps(I,1), @lcPropName, @lcPropValue )
+ *lcPropName = 'prop_especial_cr'
+ *lcPropValue = 'Este es el valor 1
Este el 2
Y este bajo Shift_Enter el 3'
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ lcValue_Esperado = REPLICATE( CHR(1), 517 ) + STR(57,8) + 'Este es el valor 1' + CHR(13) + 'Este el 2' + CHR(13) + 'Y este bajo Shift_Enter el 3'
+
+ *-- TEST
+ loObj.analizarAsignacion_TAG_Indicado( @lcPropName, @lcPropValue, @laProps, @lnProp_Count ;
+ , @I, lcTag_I, lcTag_F, lnLen_lcTag_I, lnLen_lcTag_F, @lcMemo )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado ;
+ , @lcPropName, @lcPropValue, @laProps, @lnProp_Count ;
+ , @I, lcTag_I, lcTag_F, lnLen_lcTag_I, lnLen_lcTag_F, @lcMemo, @lcValue_Esperado )
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_analizarAsignacion_TAG__fb2p_value__EnUnaAsignacion_MultiLine
+ LOCAL lnCodError, lcMenError, lnCodError_Esperado ;
+ , lcPropName, lcPropValue, laProps(1,2), lnProp_Count, I, lcTag_I, lcTag_F, lnLen_lcTag_I, lnLen_lcTag_F, lcMemo ;
+ , lcValue_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_prg_a_bin OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ lcTag_I = ''
+ lcTag_F = ''
+ lnLen_lcTag_I = LEN(lcTag_I)
+ lnLen_lcTag_F = LEN(lcTag_F)
+ lnProp_Count = 17
+ DIMENSION laProps(lnProp_Count,2)
+ laProps = ''
+ laProps( 1,1) = 'Height = 2.73'
+ laProps( 1,2) = ''
+ laProps( 2,1) = 'Name = "c1"'
+ laProps( 2,2) = ''
+ laProps( 3,1) = 'prop1 = .F.'
+ laProps( 3,2) = 'Mi prop1'
+ laProps( 4,1) = 'prop_especial_cr = Este es el valor 1
Este el 2
Y este bajo Shift_Enter el 3'
+ laProps( 4,2) = ''
+ laProps( 5,1) = 'prop_especial_crlf = '
+ laProps( 5,2) = ''
+ laProps( 6,1) = 'El valor 1'
+ laProps( 6,2) = ''
+ laProps( 7,1) = 'El valor 2'
+ laProps( 7,2) = ''
+ laProps( 8,1) = 'Y el 3!'
+ laProps( 8,2) = ''
+ laProps( 9,1) = ''
+ laProps( 9,2) = ''
+ laProps(10,1) = ''
+ laProps(10,2) = ''
+ laProps(11,2) = 'Debería tener CR+LF'
+ laProps(11,2) = ''
+ laProps(12,1) = 'Width = 27.4'
+ laProps(12,2) = ''
+ laProps(13,1) = '_memberdata = [ ;'
+ laProps(13,2) = ''
+ laProps(14,1) = ' ;'
+ laProps(14,2) = ''
+ laProps(15,1) = ']'
+ laProps(15,2) = 'XML Metadata for customizable properties'
+ I = 5
+ loObj.get_SeparatedPropAndValue( laProps(I,1), @lcPropName, @lcPropValue )
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ lcValue_Esperado = REPLICATE( CHR(1), 517 ) + STR(33,8) + 'El valor 1' + CR_LF + 'El valor 2' + CR_LF + 'Y el 3!' + CR_LF
+
+ *-- TEST
+ loObj.analizarAsignacion_TAG_Indicado( @lcPropName, @lcPropValue, @laProps, @lnProp_Count ;
+ , @I, lcTag_I, lcTag_F, lnLen_lcTag_I, lnLen_lcTag_F, @lcMemo )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado ;
+ , @lcPropName, @lcPropValue, @laProps, @lnProp_Count ;
+ , @I, lcTag_I, lcTag_F, lnLen_lcTag_I, lnLen_lcTag_F, @lcMemo, @lcValue_Esperado )
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_analizarAsignacion_TAG__memberdata__EnUnaAsignacion_MultiLine
+ LOCAL lnCodError, lcMenError, lnCodError_Esperado ;
+ , lcPropName, lcPropValue, laProps(1,2), lnProp_Count, I, lcTag_I, lcTag_F, lnLen_lcTag_I, lnLen_lcTag_F, lcMemo ;
+ , lcValue_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_prg_a_bin OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ lcTag_I = ''
+ lcTag_F = ''
+ lnLen_lcTag_I = LEN(lcTag_I)
+ lnLen_lcTag_F = LEN(lcTag_F)
+ lnProp_Count = 17
+ DIMENSION laProps(lnProp_Count,2)
+ laProps = ''
+ laProps( 1,1) = 'Height = 2.73'
+ laProps( 1,2) = ''
+ laProps( 2,1) = 'Name = "c1"'
+ laProps( 2,2) = ''
+ laProps( 3,1) = 'prop1 = .F.'
+ laProps( 3,2) = 'Mi prop1'
+ laProps( 4,1) = 'prop_especial_cr = Este es el valor 1
Este el 2
Y este bajo Shift_Enter el 3'
+ laProps( 4,2) = ''
+ laProps( 5,1) = 'prop_especial_crlf = '
+ laProps( 5,2) = ''
+ laProps( 6,1) = 'El valor 1'
+ laProps( 6,2) = ''
+ laProps( 7,1) = 'El valor 2'
+ laProps( 7,2) = ''
+ laProps( 8,1) = 'Y el 3!'
+ laProps( 8,2) = ''
+ laProps( 9,1) = ''
+ laProps( 9,2) = ''
+ laProps(10,1) = ''
+ laProps(10,2) = ''
+ laProps(11,2) = 'Debería tener CR+LF'
+ laProps(11,2) = ''
+ laProps(12,1) = 'Width = 27.4'
+ laProps(12,2) = ''
+ laProps(13,1) = '_memberdata = '
+ laProps(13,2) = ''
+ laProps(14,1) = ''
+ laProps(14,2) = ''
+ laProps(15,1) = ''
+ laProps(15,2) = 'XML Metadata for customizable properties'
+ I = 13
+ loObj.get_SeparatedPropAndValue( laProps(I,1), @lcPropName, @lcPropValue )
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ lcValue_Esperado = REPLICATE( CHR(1), 517 ) + STR(71,8) + '' + CR_LF + '' + CR_LF + ''
+
+ *-- TEST
+ loObj.analizarAsignacion_TAG_Indicado( @lcPropName, @lcPropValue, @laProps, @lnProp_Count ;
+ , @I, lcTag_I, lcTag_F, lnLen_lcTag_I, lnLen_lcTag_F, @lcMemo )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado ;
+ , @lcPropName, @lcPropValue, @laProps, @lnProp_Count ;
+ , @I, lcTag_I, lcTag_F, lnLen_lcTag_I, lnLen_lcTag_F, @lcMemo, @lcValue_Esperado )
+
+ ENDFUNC
+
+
+ENDDEFINE
diff --git a/TESTS/ut__foxbin2prg__c_conversor_prg_a_bin__insert_AllObjects.prg b/TESTS/ut__foxbin2prg__c_conversor_prg_a_bin__insert_AllObjects.prg
new file mode 100644
index 0000000..90ade57
--- /dev/null
+++ b/TESTS/ut__foxbin2prg__c_conversor_prg_a_bin__insert_AllObjects.prg
@@ -0,0 +1,161 @@
+DEFINE CLASS ut__foxbin2prg__c_conversor_prg_a_bin__insert_AllObjects AS FxuTestCase OF FxuTestCase.prg
+
+ #IF .F.
+ LOCAL THIS AS ut__foxbin2prg__c_conversor_prg_a_bin__insert_AllObjects OF ut__foxbin2prg__c_conversor_prg_a_bin__insert_AllObjects.PRG
+ #ENDIF
+
+ #DEFINE C_FB2P_VALUE_I ''
+ #DEFINE C_FB2P_VALUE_F ''
+ #DEFINE CR_LF CHR(13) + CHR(10)
+ #DEFINE C_CR CHR(13)
+ #DEFINE C_LF CHR(10)
+ #DEFINE C_TAB CHR(9)
+ #DEFINE C_PROC 'PROCEDURE'
+ #DEFINE C_ENDPROC 'ENDPROC'
+ #DEFINE C_TEXT 'TEXT'
+ #DEFINE C_ENDTEXT 'ENDTEXT'
+ #DEFINE C_IF_F '#IF .F.'
+ #DEFINE C_ENDIF '#ENDIF'
+ #DEFINE C_DEFINE_CLASS 'DEFINE CLASS'
+ #DEFINE C_ENDDEFINE_CLASS 'ENDDEFINE'
+ icObj = NULL
+ icClase = NULL
+
+
+ *******************************************************************************************************************************************
+ FUNCTION SETUP
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ LOCAL loObjeto AS CL_OBJETO OF "FOXBIN2PRG.PRG"
+ LOCAL loClase AS CL_CLASE OF "FOXBIN2PRG.PRG"
+ SET PROCEDURE TO 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ oFXU_LIB = CREATEOBJECT('CL_FXU_CONFIG')
+ oFXU_LIB.setup_comun()
+
+ THIS.icObj = NEWOBJECT("c_conversor_prg_a_bin", "FOXBIN2PRG.PRG")
+ THIS.icClase = NEWOBJECT("CL_CLASE", "FOXBIN2PRG.PRG")
+ loClase = THIS.icClase
+ loObj = THIS.icObj
+ loObj.l_Test = .T.
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION TearDown
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+ THIS.icObj = NULL
+ THIS.icClase = NULL
+
+ IF VARTYPE(oFXU_LIB) = "O"
+ oFXU_LIB.teardown_comun()
+ oFXU_LIB = NULL
+ ENDIF
+ RELEASE PROCEDURE 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Evaluate_results
+ LPARAMETERS toEx AS EXCEPTION, tnCodError_Esperado, toClase, taWriteOrder_Esperado
+
+ LOCAL loObj AS c_conversor_prg_a_bin OF "FOXBIN2PRG.PRG"
+ LOCAL loObjeto AS CL_OBJETO OF "FOXBIN2PRG.PRG"
+ LOCAL loClase AS CL_CLASE OF "FOXBIN2PRG.PRG"
+ LOCAL I
+ loObj = THIS.icObj
+ loClase = toClase
+
+ IF PCOUNT() = 0
+ THIS.messageout( "* Support method, not a valid test." )
+ RETURN .T.
+ ENDIF
+
+ IF ISNULL(toEx)
+ *-- Visualización de valores
+ FOR I = 1 TO loClase._AddObject_Count
+ loObjeto = loClase._AddObjects(I)
+ THIS.messageout( ' objeto._Nombre = ' + TRANSFORM(loObjeto._Nombre) )
+ THIS.messageout( ' objeto._ZOrder = ' + TRANSFORM(loObjeto._ZOrder) )
+ THIS.messageout( ' objeto._WriteOrder = ' + TRANSFORM(loObjeto._WriteOrder) )
+ THIS.messageout( REPLICATE('-',50) )
+ ENDFOR
+
+
+ *-- Evaluación de valores
+ FOR I = 1 TO loClase._AddObject_Count
+ loObjeto = loClase._AddObjects(I)
+ THIS.assertequals( taWriteOrder_Esperado(I), loObjeto._WriteOrder, "[WriteOrder para objeto " + loObjeto._Nombre + "]" )
+ ENDFOR
+
+ ELSE
+ *-- Evaluación de errores
+ THIS.messageout( "Error " + TRANSFORM(toEx.ERRORNO) + ', ' + TRANSFORM(toEx.MESSAGE) )
+ THIS.messageout( toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) )
+ THIS.messageout( TRANSFORM(toEx.LINECONTENTS) )
+
+ THIS.assertequals( tnCodError_Esperado, toEx.ERRORNO, 'Error' )
+ ENDIF
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_ordenarLosObjetosSegunSuOrdenOriginal
+ LOCAL lnCodError, lcMenError, lnCodError_Esperado ;
+ , laWriteOrder_Esperado(3) ;
+ , loEx AS EXCEPTION
+
+ LOCAL loObj AS c_conversor_prg_a_bin OF "FOXBIN2PRG.PRG"
+ LOCAL loObjeto AS CL_OBJETO OF "FOXBIN2PRG.PRG"
+ LOCAL loClase AS CL_CLASE OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loClase = THIS.icClase
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ *--
+ loObjeto = NULL
+ loObjeto = NEWOBJECT("CL_OBJETO", "FOXBIN2PRG.PRG")
+ loObjeto._ObjName = 'Label3'
+ loObjeto._Parent = 'Form1.pgfPanel.pagApariencia'
+ loObjeto._Nombre = 'Form1.pgfPanel.pagApariencia.Label3'
+ loObjeto._ZOrder = 50
+ loClase.add_Object( loObjeto )
+ *--
+ loObjeto = NULL
+ loObjeto = NEWOBJECT("CL_OBJETO", "FOXBIN2PRG.PRG")
+ loObjeto._ObjName = 'Label3'
+ loObjeto._Parent = 'Form1.pgfPanel.pagAvanzado'
+ loObjeto._Nombre = 'Form1.pgfPanel.pagAvanzado.Label3'
+ loObjeto._ZOrder = 82
+ loClase.add_Object( loObjeto )
+ *--
+ loObjeto = NULL
+ loObjeto = NEWOBJECT("CL_OBJETO", "FOXBIN2PRG.PRG")
+ loObjeto._ObjName = 'Label3'
+ loObjeto._Parent = 'Form1.pgfPanel.pagSeteos'
+ loObjeto._Nombre = 'Form1.pgfPanel.pagSeteos.Label3'
+ loObjeto._ZOrder = 30
+ loClase.add_Object( loObjeto )
+ *--
+ loObjeto = NULL
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ laWriteOrder_Esperado(1) = 2
+ laWriteOrder_Esperado(2) = 3
+ laWriteOrder_Esperado(3) = 1
+
+ *-- TEST
+ loObj.insert_AllObjects( @loClase )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, @loClase, @laWriteOrder_Esperado )
+
+ ENDFUNC
+
+
+ENDDEFINE
diff --git a/foxbin2prg.pjt b/foxbin2prg.pjt
new file mode 100644
index 0000000..b2c5295
Binary files /dev/null and b/foxbin2prg.pjt differ
diff --git a/foxbin2prg.pjx b/foxbin2prg.pjx
new file mode 100644
index 0000000..a9a20d1
Binary files /dev/null and b/foxbin2prg.pjx differ
diff --git a/foxbin2prg.prg b/foxbin2prg.prg
index 6d6ea79..41538f9 100644
--- a/foxbin2prg.prg
+++ b/foxbin2prg.prg
@@ -46,6 +46,7 @@
* 01/12/2013 FDBOZZO v1.6 Refactorización completa generación BIN y PRG, cambio de algoritmos, arreglo de bugs, Unit Testing con FoxUnit
* 02/12/2013 FDBOZZO v1.7 Arreglo bug "Name", barra de progreso, agregado mensaje de ayuda si se llama sin parámetros, verificación y logueo de archivos READONLY con debug activa
* 03/12/2013 FDBOZZO v1.8 Arreglo bug "Name" (otra vez), sort encapsulado y reutilizado para versiones TEXTO y BIN por seguridad
+* 03/12/2013 FDBOZZO v1.9 Arreglo bug pérdida de propiedades causado por una mejora anterior
*
*---------------------------------------------------------------------------------------------------
* TESTEO Y REPORTE DE BUGS (AGRADECIMIENTOS)
@@ -53,6 +54,7 @@
* 27/11/2013 Fidel Charny REPORTE BUG: Error en el guardado de ciertas propiedades de array (arreglado en v.1.6)
* 02/12/2013 Fidel Charny REPORTE BUG: Se pierden algunas propiedades y no muestra picture si "Name" no es la última (arreglado en v.1.7)
* 03/12/2013 Fidel Charny REPORTE BUG: Se siguen perdiendo algunas propiedades por implementación defectuosa del arreglo anterior (arreglado en v.1.8)
+* 03/12/2013 Fidel Charny REPORTE BUG: Se siguen perdiendo algunas propiedades por implementación defectuosa de una mejora anterior (arreglado en v.1.9)
*
*---------------------------------------------------------------------------------------------------
* TRAMIENTOS ESPECIALES DE ASIGNACIONES DE PROPIEDADES:
@@ -121,12 +123,19 @@ LPARAMETERS tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErro
#DEFINE C_FILE_TXT_F '*'
#DEFINE C_FB2P_VALUE_I ''
#DEFINE C_FB2P_VALUE_F ''
-#DEFINE C_MEMBERDATA_I ''
-#DEFINE C_MEMBERDATA_F ''
-#DEFINE C_LEN_MEMBERDATA_I LEN(C_MEMBERDATA_I)
-#DEFINE C_LEN_MEMBERDATA_F LEN(C_MEMBERDATA_F)
#DEFINE C_LEN_FB2P_VALUE_I LEN(C_FB2P_VALUE_I)
#DEFINE C_LEN_FB2P_VALUE_F LEN(C_FB2P_VALUE_F)
+#DEFINE C_VFPDATA_I ''
+#DEFINE C_VFPDATA_F ''
+#DEFINE C_MEMBERDATA_I C_VFPDATA_I
+#DEFINE C_MEMBERDATA_F C_VFPDATA_F
+#DEFINE C_LEN_MEMBERDATA_I LEN(C_MEMBERDATA_I)
+#DEFINE C_LEN_MEMBERDATA_F LEN(C_MEMBERDATA_F)
+#DEFINE C_DATA_I ''
+#DEFINE C_TAG_REPORTE 'Reportes'
+#DEFINE C_TAG_REPORTE_I '<' + C_TAG_REPORTE + '>'
+#DEFINE C_TAG_REPORTE_F '' + C_TAG_REPORTE + '>'
#DEFINE C_TAB CHR(9)
#DEFINE C_CR CHR(13)
#DEFINE C_LF CHR(10)
@@ -274,17 +283,22 @@ TRY
ENDIF
ENDCASE
- CD (JUSTPATH(lcSys16))
- SET PATH TO (lcPath)
ENDIF
CATCH TO loEx
+ IF llExisteConfig
+ goCnv.writeLog( 'ERROR: ' + TRANSFORM(loEx.ERRORNO) + ', ' + loEx.MESSAGE + CR_LF ;
+ + loEx.PROCEDURE + ', line ' + TRANSFORM(loEx.LINENO) + CR_LF ;
+ + loEx.DETAILS )
+ ENDIF
FINALLY
goFrm_Avance.HIDE()
goFrm_Avance.RELEASE()
STORE NULL TO goCnv, goFrm_Avance
RELEASE goCnv, goFrm_Avance
+ CD (JUSTPATH(lcSys16))
+ SET PATH TO (lcPath)
ENDTRY
IF _VFP.STARTMODE > 0
@@ -304,7 +318,10 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ [] ;
+ + [] ;
+ + [] ;
+ [] ;
+ [] ;
+ [] ;
@@ -315,26 +332,35 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ [] ;
+ [] ;
+ []
- c_CurDir = ''
- c_InputFile = ''
- c_LogFile = ''
- c_OutputFile = ''
- l_Debug = .F.
- l_ShowErrors = .F.
- lFileMode = .F.
- nClassTimeStamp = ''
- n_FB2PRG_Version = 1.8
- o_Conversor = NULL
- c_VC2 = 'VC2'
- c_SC2 = 'SC2'
- c_PJ2 = 'PJ2'
- c_MN2 = 'MN2'
- c_FR2 = 'FR2'
- c_LB2 = 'LB2'
+ c_CurDir = ''
+ c_InputFile = ''
+ c_LogFile = ''
+ c_OutputFile = ''
+ l_Debug = .F.
+ l_Test = .F.
+ l_ShowErrors = .F.
+ l_MethodSort_Enabled = .T. && Para Unit Testing se puede cambiar a .F. para buscar diferencias
+ l_PropSort_Enabled = .T. && Para Unit Testing se puede cambiar a .F. para buscar diferencias
+ lFileMode = .F.
+ nClassTimeStamp = ''
+ n_FB2PRG_Version = 1.9
+ o_Conversor = NULL
+ c_VC2 = 'VC2'
+ c_SC2 = 'SC2'
+ c_PJ2 = 'PJ2'
+ c_MN2 = 'MN2'
+ c_FR2 = 'FR2'
+ c_LB2 = 'LB2'
+ c_DB2 = 'DB2'
+ c_CD2 = 'CD2'
+ c_DC2 = 'DC2'
*******************************************************************************************************************
@@ -364,10 +390,10 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
*******************************************************************************************************************
PROCEDURE Convertir
- LPARAMETERS tc_InputFile
+ LPARAMETERS tc_InputFile, toModulo, toEx AS EXCEPTION, tlRelanzarError
TRY
- LOCAL lnCodError, loEx AS EXCEPTION, lcErrorInfo
+ LOCAL lnCodError, lcErrorInfo
lnCodError = 0
THIS.c_InputFile = FULLPATH( tc_InputFile )
THIS.c_CurDir = JUSTPATH( THIS.c_InputFile )
@@ -397,6 +423,10 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, THIS.c_PJ2 )
THIS.o_Conversor = CREATEOBJECT( 'c_conversor_pjx_a_prg' )
+ CASE JUSTEXT(THIS.c_InputFile) = 'FRX'
+ THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, THIS.c_FR2 )
+ THIS.o_Conversor = CREATEOBJECT( 'c_conversor_frx_a_prg' )
+
CASE JUSTEXT(THIS.c_InputFile) = THIS.c_VC2
THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, 'VCX' )
THIS.o_Conversor = CREATEOBJECT( 'c_conversor_prg_a_vcx' )
@@ -409,22 +439,29 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, 'PJX' )
THIS.o_Conversor = CREATEOBJECT( 'c_conversor_prg_a_pjx' )
+ CASE JUSTEXT(THIS.c_InputFile) = THIS.c_FR2
+ THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, 'FRX' )
+ THIS.o_Conversor = CREATEOBJECT( 'c_conversor_prg_a_frx' )
+
OTHERWISE
ERROR 'El archivo [' + THIS.c_InputFile + '] no está soportado'
ENDCASE
- THIS.o_Conversor.c_InputFile = THIS.c_InputFile
- THIS.o_Conversor.c_OutputFile = THIS.c_OutputFile
- THIS.o_Conversor.c_LogFile = THIS.c_LogFile
- THIS.o_Conversor.l_Debug = THIS.l_Debug
- THIS.o_Conversor.n_FB2PRG_Version = THIS.n_FB2PRG_Version
- THIS.o_Conversor.Convertir()
+ THIS.o_Conversor.c_InputFile = THIS.c_InputFile
+ THIS.o_Conversor.c_OutputFile = THIS.c_OutputFile
+ THIS.o_Conversor.c_LogFile = THIS.c_LogFile
+ THIS.o_Conversor.l_Debug = THIS.l_Debug
+ THIS.o_Conversor.l_Test = THIS.l_Test
+ THIS.o_Conversor.n_FB2PRG_Version = THIS.n_FB2PRG_Version
+ THIS.o_Conversor.Convertir( @toModulo )
+ THIS.o_Conversor.l_MethodSort_Enabled = THIS.l_MethodSort_Enabled
+ THIS.o_Conversor.l_PropSort_Enabled = THIS.l_PropSort_Enabled
THIS.o_Conversor = NULL
- CATCH TO loEx
- lnCodError = loEx.ERRORNO
- lcErrorInfo = THIS.Exception2Str(loEx) + CR_LF + CR_LF + 'Fuente: ' + THIS.c_InputFile
+ CATCH TO toEx
+ lnCodError = toEx.ERRORNO
+ lcErrorInfo = THIS.Exception2Str(toEx) + CR_LF + CR_LF + 'Fuente: ' + THIS.c_InputFile
TRY
STRTOFILE( lcErrorInfo, THIS.c_InputFile + '.ERR' )
@@ -440,6 +477,9 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
IF THIS.l_Debug AND THIS.l_ShowErrors
MESSAGEBOX( lcErrorInfo, 0+16+4096, 'FOXBIN2PRG: ERROR!!', 10000 )
ENDIF
+ IF tlRelanzarError && Usado en Unit Testing
+ THROW
+ ENDIF
ENDTRY
RETURN lnCodError
@@ -547,10 +587,12 @@ DEFINE CLASS c_conversor_base AS SESSION
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ [] ;
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ [] ;
+ [] ;
+ [] ;
@@ -570,20 +612,24 @@ DEFINE CLASS c_conversor_base AS SESSION
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ + [] ;
+ [] ;
+ []
- l_Debug = .F.
- l_Test = .F.
- c_InputFile = ''
- c_OutputFile = ''
- lFileMode = .T.
- nClassTimeStamp = ''
- n_FB2PRG_Version = 1.0
- c_Type = ''
- c_CurDir = ''
- c_LogFile = ''
+ l_Debug = .F.
+ l_Test = .F.
+ c_InputFile = ''
+ c_OutputFile = ''
+ lFileMode = .T.
+ nClassTimeStamp = ''
+ n_FB2PRG_Version = 1.0
+ c_Type = ''
+ c_CurDir = ''
+ c_LogFile = ''
+ l_MethodSort_Enabled = .T.
+ l_PropSort_Enabled = .T.
*******************************************************************************************************************
@@ -601,19 +647,6 @@ DEFINE CLASS c_conversor_base AS SESSION
ENDPROC
- *******************************************************************************************************************
- PROCEDURE writeLog
- LPARAMETERS tcText
-
- IF THIS.l_Debug
- TRY
- STRTOFILE( TTOC(DATETIME(),3) + ' ' + EVL(tcText,'') + CR_LF, THIS.c_LogFile, 1 )
- CATCH
- ENDTRY
- ENDIF
- ENDPROC
-
-
*******************************************************************************************************************
PROCEDURE DESTROY
C_FB2PRG_CODE = ''
@@ -623,182 +656,6 @@ DEFINE CLASS c_conversor_base AS SESSION
ENDPROC
- *******************************************************************************************************************
- PROCEDURE Convertir
- THIS.writeLog( '' )
- THIS.writeLog( 'Convirtiendo archivo ' + THIS.c_OutputFile + '...' )
- ENDPROC
-
-
- *******************************************************************************************************************
- PROCEDURE fileTypeCode
- LPARAMETERS tcExtension
- tcExtension = UPPER(tcExtension)
- RETURN ICASE( tcExtension = 'DBC', 'd' ;
- , tcExtension = 'DBF', 'D' ;
- , tcExtension = 'QPR', 'Q' ;
- , tcExtension = 'SCX', 'K' ;
- , tcExtension = 'FRX', 'R' ;
- , tcExtension = 'LBX', 'B' ;
- , tcExtension = 'VCX', 'V' ;
- , tcExtension = 'PRG', 'P' ;
- , tcExtension = 'FLL', 'L' ;
- , tcExtension = 'APP', 'Z' ;
- , tcExtension = 'EXE', 'Z' ;
- , tcExtension = 'MNX', 'M' ;
- , tcExtension = 'TXT', 'T' ;
- , tcExtension = 'FPW', 'T' ;
- , tcExtension = 'H', 'T' ;
- , 'x' )
- ENDPROC
-
-
- *******************************************************************************************************************
- PROCEDURE lineIsOnlyCommentAndNoMetadata
- LPARAMETERS tcLine, tcComment
- LOCAL lllineIsOnlyCommentAndNoMetadata, ln_AT_Cmt
-
- THIS.get_SeparatedLineAndComment( @tcLine, @tcComment )
-
- DO CASE
- CASE LEFT(tcLine,2) == '*<'
- tcComment = tcLine
-
- CASE EMPTY(tcLine) OR LEFT(tcLine, 1) == '*' OR LEFT(tcLine + ' ', 5) == 'NOTE ' && Vacía o Comentarios
- lllineIsOnlyCommentAndNoMetadata = .T.
-
- ENDCASE
-
- RETURN lllineIsOnlyCommentAndNoMetadata
- ENDPROC
-
-
- *******************************************************************************************************************
- PROCEDURE get_SeparatedLineAndComment
- LPARAMETERS tcLine, tcComment
- LOCAL ln_AT_Cmt
- tcComment = ''
-
- IF '&'+'&' $ tcLine
- ln_AT_Cmt = AT( '&'+'&', tcLine)
- tcComment = LTRIM( SUBSTR( tcLine, ln_AT_Cmt + 2 ) )
- tcLine = RTRIM( LEFT( tcLine, ln_AT_Cmt - 1 ), 0, ' ', CHR(9) ) && Quito espacios y TABS
- ENDIF
-
- RETURN
- ENDPROC
-
-
- *******************************************************************************************************************
- PROCEDURE get_SeparatedPropAndValue
- LPARAMETERS tcAsignacion, tcProp, tcValue
- LOCAL ln_AT_Cmt
- STORE '' TO tcProp, tcValue
-
- IF '=' $ tcAsignacion
- ln_AT_Cmt = AT( '=', tcAsignacion)
- tcProp = ALLTRIM( LEFT( tcAsignacion, ln_AT_Cmt - 2 ), 0, ' ', CHR(9) ) && Quito espacios y TABS
- tcValue = ALLTRIM( SUBSTR( tcAsignacion, ln_AT_Cmt + 2 ) )
- ENDIF
-
- RETURN
- ENDPROC
-
-
- *******************************************************************************************************************
- PROCEDURE getNext_BAK
- LPARAMETERS tcOutputFileName
- LOCAL lcNext_Bak, I
- lcNext_Bak = ''
-
- FOR I = 0 TO 99
- IF I = 0
- IF NOT FILE( tcOutputFileName + '.BAK' )
- lcNext_Bak = '.BAK'
- EXIT
- ENDIF
- ELSE
- IF NOT FILE( tcOutputFileName + '.' + PADL(I,2,'0') + '.BAK' )
- lcNext_Bak = '.' + PADL(I,2,'0') + '.BAK'
- EXIT
- ENDIF
- ENDIF
- ENDFOR
-
- lcNext_Bak = EVL( lcNext_Bak, '.100.BAK' ) && Para que no quede nunca vacío
-
- RETURN lcNext_Bak
- ENDPROC
-
-
- *******************************************************************************************************************
- PROCEDURE doBackup
- LOCAL lcNext_Bak
- lcNext_Bak = THIS.getNext_BAK( THIS.c_OutputFile )
-
- DO CASE
- CASE JUSTEXT( THIS.c_OutputFile ) = 'VCX'
- IF FILE( FORCEEXT(THIS.c_OutputFile,'VCX') )
- THIS.writeLog( 'backup de: ' + FORCEEXT(THIS.c_OutputFile,'VCX') + '/VCT' )
-
- COPY FILE (FORCEEXT(THIS.c_OutputFile,'VCX')) TO (FORCEEXT(THIS.c_OutputFile, 'VCX' + lcNext_Bak))
-
- IF FILE( FORCEEXT(THIS.c_OutputFile,'VCT') )
- COPY FILE (FORCEEXT(THIS.c_OutputFile,'VCT')) TO (FORCEEXT(THIS.c_OutputFile,'VCT' + lcNext_Bak))
- ENDIF
- ENDIF
-
- CASE JUSTEXT( THIS.c_OutputFile ) = 'SCX'
- IF FILE( FORCEEXT(THIS.c_OutputFile,'SCX') )
- THIS.writeLog( 'backup de: ' + FORCEEXT(THIS.c_OutputFile,'SCX') + '/SCT' )
- COPY FILE (FORCEEXT(THIS.c_OutputFile,'SCX')) TO (FORCEEXT(THIS.c_OutputFile,'SCX' + lcNext_Bak))
-
- IF FILE( FORCEEXT(THIS.c_OutputFile,'SCT') )
- COPY FILE (FORCEEXT(THIS.c_OutputFile,'SCT')) TO (FORCEEXT(THIS.c_OutputFile,'SCT' + lcNext_Bak))
- ENDIF
- ENDIF
-
- CASE JUSTEXT( THIS.c_OutputFile ) = 'PJX'
- IF FILE( FORCEEXT(THIS.c_OutputFile,'PJX') )
- THIS.writeLog( 'backup de: ' + FORCEEXT(THIS.c_OutputFile,'PJX') + '/PJT' )
- COPY FILE (FORCEEXT(THIS.c_OutputFile,'PJX')) TO (FORCEEXT(THIS.c_OutputFile,'PJX' + lcNext_Bak))
-
- IF FILE( FORCEEXT(THIS.c_OutputFile,'PJT') )
- COPY FILE (FORCEEXT(THIS.c_OutputFile,'PJT')) TO (FORCEEXT(THIS.c_OutputFile,'PJT' + lcNext_Bak))
- ENDIF
- ENDIF
-
- OTHERWISE
- ERROR 'Tipo de archivo [' + JUSTFNAME(THIS.c_OutputFile) + '] no soportado para backup!'
-
- ENDCASE
- ENDPROC
-
-
- *******************************************************************************************************************
- PROCEDURE lineaExcluida
- LPARAMETERS tn_Linea, tnBloquesExclusion, taBloquesExclusion
-
- EXTERNAL ARRAY taBloquesExclusion
- LOCAL X, llExcluida
-
- FOR X = 1 TO tnBloquesExclusion
- IF BETWEEN( tn_Linea, taBloquesExclusion(X,1), taBloquesExclusion(X,2) )
- llExcluida = .T.
- EXIT
- ENDIF
- ENDFOR
-
- RETURN llExcluida
- ENDPROC
-
-
- *******************************************************************************************************************
- PROCEDURE identificarBloquesDeCodigo
- LPARAMETERS taCodeLines, tnCodeLines, taBloquesExclusion, tnBloquesExclusion, toModulo
- ENDPROC
-
-
*******************************************************************************************************************
PROCEDURE buscarObjetoDelMetodoPorNombre
LPARAMETERS tcNombreObjeto, toClase
@@ -854,25 +711,252 @@ DEFINE CLASS c_conversor_base AS SESSION
*******************************************************************************************************************
- FUNCTION RowTimeStamp(ltDateTime)
- * Generate a FoxPro 3.0-style row timestamp
- *-- CONVIERTE UN DATO TIPO DATETIME EN TIMESTAMP NUMERICO USADO POR LOS ARCHIVOS SCX/VCX/etc.
- LOCAL lcTimeValue, tnTimeStamp
+ FUNCTION comprobarExpresionValida( tcAsignacion, tnCodError, tcExpNormalizada )
+ LOCAL llError, loEx AS EXCEPTION
- IF VARTYPE(m.ltDateTime) <> 'T'
- m.ltDateTime = DATETIME()
- ENDIF
+ TRY
+ tcExpNormalizada = NORMALIZE( tcAsignacion )
- tnTimeStamp = ( YEAR(m.ltDateTime) - 1980) * 2^25 ;
- + MONTH(m.ltDateTime) * 2^21 ;
- + DAY(m.ltDateTime) * 2^16 ;
- + HOUR(m.ltDateTime) * 2^11 ;
- + MINUTE(m.ltDateTime) * 2^5 ;
- + SEC(m.ltDateTime)
- RETURN INT(tnTimeStamp)
+ CATCH TO loEx
+ llError = .T.
+ tnCodError = loEx.ERRORNO
+ ENDTRY
+
+ RETURN NOT llError
ENDFUNC
+ *******************************************************************************************************************
+ PROCEDURE Convertir
+ LPARAMETERS toModulo, toEx AS EXCEPTION
+ THIS.writeLog( '' )
+ THIS.writeLog( 'Convirtiendo archivo ' + THIS.c_OutputFile + '...' )
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE decode_SpecialCodes_1_31
+ LPARAMETERS tcText
+ LOCAL I
+ FOR I = 0 TO 31
+ tcText = STRTRAN( tcText, '{' + TRANSFORM(I) + '}', CHR(I) )
+ ENDFOR
+ RETURN tcText
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE desnormalizarAsignacion
+ LPARAMETERS tcAsignacion
+ LOCAL lcPropName, lcValor, lnCodError, lcExpNormalizada, lnPos, lcComentario
+ THIS.get_SeparatedPropAndValue( @tcAsignacion, @lcPropName, @lcValor )
+ lcComentario = ''
+ THIS.desnormalizarValorPropiedad( @lcPropName, @lcValor, @lcComentario )
+ tcAsignacion = lcPropName + ' = ' + lcValor
+
+ RETURN tcAsignacion
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE desnormalizarValorPropiedad
+ LPARAMETERS tcProp, tcValue, tcComentario
+ LOCAL lnCodError, lnPos, lcValue
+ tcComentario = ''
+
+ *-- Ajustes de algunos casos especiales
+ DO CASE
+ CASE tcProp == '_memberdata'
+ *-- Me quedo con lo importante y quito los CHR(0) y longitud que a veces agrega al inicio
+ lcValue = ''
+
+ FOR I = 1 TO OCCURS( '/>', tcValue )
+ TEXT TO lcValue TEXTMERGE ADDITIVE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <', I, 1+4 )>>
+ ENDTEXT
+ ENDFOR
+
+ TEXT TO tcValue TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+
+ <>
+
+ ENDTEXT
+
+ tcValue = C_MPROPHEADER + STR( LEN(tcValue), 8 ) + tcValue
+
+ CASE LEFT( tcValue, C_LEN_FB2P_VALUE_I ) == C_FB2P_VALUE_I
+ *-- Valor especial Fox con cabecera CHR(1): Debo agregarla y desnormalizar el valor
+ tcValue = STRTRAN( STRTRAN( STREXTRACT( tcValue, C_FB2P_VALUE_I, C_FB2P_VALUE_F, 1, 1 ), '
', C_CR ), '
', C_LF )
+ tcValue = C_MPROPHEADER + STR( LEN(tcValue), 8 ) + tcValue
+
+ ENDCASE
+
+ RETURN tcValue
+ ENDFUNC
+
+
+ *******************************************************************************************************************
+ PROCEDURE desnormalizarValorXML
+ LPARAMETERS tcValor
+ *-- DESNORMALIZA EL TEXTO INDICADO, EXPANDIENDO LOS SÍMBOLOS XML ESPECIALES.
+ LOCAL lnPos, lnPos2, lnAscii
+ tcValor = STRTRAN(tcValor, CHR(38)+'gt;', '>') && >
+ tcValor = STRTRAN(tcValor, CHR(38)+'lt;', '<') && <
+ tcValor = STRTRAN(tcValor, CHR(38)+'quot;', CHR(34)) && "
+ tcValor = STRTRAN(tcValor, CHR(38)+'apos;', CHR(39)) && '
+ tcValor = STRTRAN(tcValor, CHR(38)+'amp;', CHR(38)) && &
+
+ *-- Obtengo los Hex
+ DO WHILE .T.
+ lnPos = AT( CHR(38)+'#x', tcValor )
+ IF lnPos = 0
+ EXIT
+ ENDIF
+ lnPos2 = lnPos + 1 + AT( ';', SUBSTR( tcValor, lnPos + 2, 4 ) )
+ lnAscii = EVALUATE( '0' + SUBSTR( tcValor, lnPos + 3, lnPos2 - lnPos - 3 ) )
+ tcValor = STUFF(tcValor, lnPos, lnPos2 - lnPos + 1, CHR(lnAscii)) && ASCII
+ ENDDO
+
+ *-- Obtengo los Dec
+ DO WHILE .T.
+ lnPos = AT( CHR(38)+'#', tcValor )
+ IF lnPos = 0
+ EXIT
+ ENDIF
+ lnPos2 = lnPos + 1 + AT( ';', SUBSTR( tcValor, lnPos + 2, 4 ) )
+ lnAscii = EVALUATE( SUBSTR( tcValor, lnPos + 2, lnPos2 - lnPos - 2 ) )
+ tcValor = STUFF(tcValor, lnPos, lnPos2 - lnPos + 1, CHR(lnAscii)) && ASCII
+ ENDDO
+
+ RETURN tcValor
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE doBackup
+ LOCAL lcNext_Bak
+ lcNext_Bak = THIS.getNext_BAK( THIS.c_OutputFile )
+
+ DO CASE
+ CASE JUSTEXT( THIS.c_OutputFile ) = 'VCX'
+ IF FILE( FORCEEXT(THIS.c_OutputFile,'VCX') )
+ THIS.writeLog( 'backup de: ' + FORCEEXT(THIS.c_OutputFile,'VCX') + '/VCT' )
+
+ COPY FILE (FORCEEXT(THIS.c_OutputFile,'VCX')) TO (FORCEEXT(THIS.c_OutputFile, 'VCX' + lcNext_Bak))
+
+ IF FILE( FORCEEXT(THIS.c_OutputFile,'VCT') )
+ COPY FILE (FORCEEXT(THIS.c_OutputFile,'VCT')) TO (FORCEEXT(THIS.c_OutputFile,'VCT' + lcNext_Bak))
+ ENDIF
+ ENDIF
+
+ CASE JUSTEXT( THIS.c_OutputFile ) = 'SCX'
+ IF FILE( FORCEEXT(THIS.c_OutputFile,'SCX') )
+ THIS.writeLog( 'backup de: ' + FORCEEXT(THIS.c_OutputFile,'SCX') + '/SCT' )
+ COPY FILE (FORCEEXT(THIS.c_OutputFile,'SCX')) TO (FORCEEXT(THIS.c_OutputFile,'SCX' + lcNext_Bak))
+
+ IF FILE( FORCEEXT(THIS.c_OutputFile,'SCT') )
+ COPY FILE (FORCEEXT(THIS.c_OutputFile,'SCT')) TO (FORCEEXT(THIS.c_OutputFile,'SCT' + lcNext_Bak))
+ ENDIF
+ ENDIF
+
+ CASE JUSTEXT( THIS.c_OutputFile ) = 'PJX'
+ IF FILE( FORCEEXT(THIS.c_OutputFile,'PJX') )
+ THIS.writeLog( 'backup de: ' + FORCEEXT(THIS.c_OutputFile,'PJX') + '/PJT' )
+ COPY FILE (FORCEEXT(THIS.c_OutputFile,'PJX')) TO (FORCEEXT(THIS.c_OutputFile,'PJX' + lcNext_Bak))
+
+ IF FILE( FORCEEXT(THIS.c_OutputFile,'PJT') )
+ COPY FILE (FORCEEXT(THIS.c_OutputFile,'PJT')) TO (FORCEEXT(THIS.c_OutputFile,'PJT' + lcNext_Bak))
+ ENDIF
+ ENDIF
+
+ CASE JUSTEXT( THIS.c_OutputFile ) = 'FRX'
+ IF FILE( FORCEEXT(THIS.c_OutputFile,'FRX') )
+ THIS.writeLog( 'backup de: ' + FORCEEXT(THIS.c_OutputFile,'FRX') + '/FRT' )
+ COPY FILE (FORCEEXT(THIS.c_OutputFile,'FRX')) TO (FORCEEXT(THIS.c_OutputFile,'FRX' + lcNext_Bak))
+
+ IF FILE( FORCEEXT(THIS.c_OutputFile,'FRT') )
+ COPY FILE (FORCEEXT(THIS.c_OutputFile,'FRT')) TO (FORCEEXT(THIS.c_OutputFile,'FRT' + lcNext_Bak))
+ ENDIF
+ ENDIF
+
+ OTHERWISE
+ ERROR 'Tipo de archivo [' + JUSTFNAME(THIS.c_OutputFile) + '] no soportado para backup!'
+
+ ENDCASE
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE encode_SpecialCodes_1_31
+ LPARAMETERS tcText
+ LOCAL I
+ FOR I = 0 TO 31
+ tcText = STRTRAN( tcText, CHR(I), '{' + TRANSFORM(I) + '}' )
+ ENDFOR
+ RETURN tcText
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ HIDDEN PROCEDURE Exception2Str
+ LPARAMETERS toEx AS EXCEPTION
+ LOCAL lcError
+ lcError = 'Error ' + TRANSFORM(toEx.ERRORNO) + ', ' + toEx.MESSAGE + CHR(13) + CHR(13) ;
+ + toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) + CHR(13) + CHR(13) ;
+ + toEx.LINECONTENTS
+ RETURN lcError
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE fileTypeCode
+ LPARAMETERS tcExtension
+ tcExtension = UPPER(tcExtension)
+ RETURN ICASE( tcExtension = 'DBC', 'd' ;
+ , tcExtension = 'DBF', 'D' ;
+ , tcExtension = 'QPR', 'Q' ;
+ , tcExtension = 'SCX', 'K' ;
+ , tcExtension = 'FRX', 'R' ;
+ , tcExtension = 'LBX', 'B' ;
+ , tcExtension = 'VCX', 'V' ;
+ , tcExtension = 'PRG', 'P' ;
+ , tcExtension = 'FLL', 'L' ;
+ , tcExtension = 'APP', 'Z' ;
+ , tcExtension = 'EXE', 'Z' ;
+ , tcExtension = 'MNX', 'M' ;
+ , tcExtension = 'TXT', 'T' ;
+ , tcExtension = 'FPW', 'T' ;
+ , tcExtension = 'H', 'T' ;
+ , 'x' )
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE getNext_BAK
+ LPARAMETERS tcOutputFileName
+ LOCAL lcNext_Bak, I
+ lcNext_Bak = ''
+
+ FOR I = 0 TO 99
+ IF I = 0
+ IF NOT FILE( tcOutputFileName + '.BAK' )
+ lcNext_Bak = '.BAK'
+ EXIT
+ ENDIF
+ ELSE
+ IF NOT FILE( tcOutputFileName + '.' + PADL(I,2,'0') + '.BAK' )
+ lcNext_Bak = '.' + PADL(I,2,'0') + '.BAK'
+ EXIT
+ ENDIF
+ ENDIF
+ ENDFOR
+
+ lcNext_Bak = EVL( lcNext_Bak, '.100.BAK' ) && Para que no quede nunca vacío
+
+ RETURN lcNext_Bak
+ ENDPROC
+
+
*******************************************************************************************************************
FUNCTION GetTimeStamp(tnTimeStamp)
*-- CONVIERTE UN DATO TIMESTAMP NUMERICO USADO POR LOS ARCHIVOS SCX/VCX/etc. EN TIPO DATETIME
@@ -955,117 +1039,79 @@ DEFINE CLASS c_conversor_base AS SESSION
*******************************************************************************************************************
- HIDDEN PROCEDURE Exception2Str
- LPARAMETERS toEx AS EXCEPTION
- LOCAL lcError
- lcError = 'Error ' + TRANSFORM(toEx.ERRORNO) + ', ' + toEx.MESSAGE + CHR(13) + CHR(13) ;
- + toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) + CHR(13) + CHR(13) ;
- + toEx.LINECONTENTS
- RETURN lcError
+ PROCEDURE get_SeparatedLineAndComment
+ LPARAMETERS tcLine, tcComment
+ LOCAL ln_AT_Cmt
+ tcComment = ''
+
+ IF '&'+'&' $ tcLine
+ ln_AT_Cmt = AT( '&'+'&', tcLine)
+ tcComment = LTRIM( SUBSTR( tcLine, ln_AT_Cmt + 2 ) )
+ tcLine = RTRIM( LEFT( tcLine, ln_AT_Cmt - 1 ), 0, ' ', CHR(9) ) && Quito espacios y TABS
+ ENDIF
+
+ RETURN
ENDPROC
*******************************************************************************************************************
- PROCEDURE normalizarValorXML
- LPARAMETERS tcValor
- *-- NORMALIZA EL TEXTO INDICADO, COMPRIMIENDO LOS SÍMBOLOS XML ESPECIALES.
- tcValor = STRTRAN(tcValor, CHR(38), CHR(38) + 'amp;') && reemplaza & por & &&
- tcValor = STRTRAN(tcValor, CHR(39), CHR(38) + 'apos;') && reemplaza ' por ' &&
- tcValor = STRTRAN(tcValor, CHR(34), CHR(38) + 'quot;') && reemplaza " por " &&
- tcValor = STRTRAN(tcValor, '<', CHR(38) + 'lt;') && reemplaza < por < &&
- tcValor = STRTRAN(tcValor, '>', CHR(38) + 'gt;') && reemplaza > por > &&
- tcValor = STRTRAN(tcValor, CHR(13)+CHR(10), CHR(10)) && reeemplaza CR+LF por LF
- tcValor = CHRTRAN(tcValor, CHR(13), CHR(10)) && reemplaza CR por LF
+ PROCEDURE get_SeparatedPropAndValue
+ LPARAMETERS tcAsignacion, tcProp, tcValue
+ LOCAL ln_AT_Cmt
+ STORE '' TO tcProp, tcValue
- RETURN tcValor
+ IF '=' $ tcAsignacion
+ ln_AT_Cmt = AT( '=', tcAsignacion)
+ tcProp = ALLTRIM( LEFT( tcAsignacion, ln_AT_Cmt - 2 ), 0, ' ', CHR(9) ) && Quito espacios y TABS
+ tcValue = ALLTRIM( SUBSTR( tcAsignacion, ln_AT_Cmt + 2 ) )
+ ENDIF
+
+ RETURN
ENDPROC
*******************************************************************************************************************
- PROCEDURE desnormalizarValorXML
- LPARAMETERS tcValor
- *-- DESNORMALIZA EL TEXTO INDICADO, EXPANDIENDO LOS SÍMBOLOS XML ESPECIALES.
- LOCAL lnPos, lnPos2, lnAscii
- tcValor = STRTRAN(tcValor, CHR(38)+'gt;', '>') && >
- tcValor = STRTRAN(tcValor, CHR(38)+'lt;', '<') && <
- tcValor = STRTRAN(tcValor, CHR(38)+'quot;', CHR(34)) && "
- tcValor = STRTRAN(tcValor, CHR(38)+'apos;', CHR(39)) && '
- tcValor = STRTRAN(tcValor, CHR(38)+'amp;', CHR(38)) && &
+ PROCEDURE identificarBloquesDeCodigo
+ LPARAMETERS taCodeLines, tnCodeLines, taBloquesExclusion, tnBloquesExclusion, toModulo
+ ENDPROC
- *-- Obtengo los Hex
- DO WHILE .T.
- lnPos = AT( CHR(38)+'#x', tcValor )
- IF lnPos = 0
+
+ *******************************************************************************************************************
+ PROCEDURE lineaExcluida
+ LPARAMETERS tn_Linea, tnBloquesExclusion, taBloquesExclusion
+
+ EXTERNAL ARRAY taBloquesExclusion
+ LOCAL X, llExcluida
+
+ FOR X = 1 TO tnBloquesExclusion
+ IF BETWEEN( tn_Linea, taBloquesExclusion(X,1), taBloquesExclusion(X,2) )
+ llExcluida = .T.
EXIT
ENDIF
- lnPos2 = lnPos + 1 + AT( ';', SUBSTR( tcValor, lnPos + 2, 4 ) )
- lnAscii = EVALUATE( '0' + SUBSTR( tcValor, lnPos + 3, lnPos2 - lnPos - 3 ) )
- tcValor = STUFF(tcValor, lnPos, lnPos2 - lnPos + 1, CHR(lnAscii)) && ASCII
- ENDDO
+ ENDFOR
- *-- Obtengo los Dec
- DO WHILE .T.
- lnPos = AT( CHR(38)+'#', tcValor )
- IF lnPos = 0
- EXIT
- ENDIF
- lnPos2 = lnPos + 1 + AT( ';', SUBSTR( tcValor, lnPos + 2, 4 ) )
- lnAscii = EVALUATE( SUBSTR( tcValor, lnPos + 2, lnPos2 - lnPos - 2 ) )
- tcValor = STUFF(tcValor, lnPos, lnPos2 - lnPos + 1, CHR(lnAscii)) && ASCII
- ENDDO
-
- RETURN tcValor
+ RETURN llExcluida
ENDPROC
*******************************************************************************************************************
- PROCEDURE desnormalizarAsignacion
- LPARAMETERS tcAsignacion
- LOCAL lcPropName, lcValor, lnCodError, lcExpNormalizada, lnPos, lcComentario
- THIS.get_SeparatedPropAndValue( @tcAsignacion, @lcPropName, @lcValor )
- lcComentario = ''
- THIS.desnormalizarValorPropiedad( @lcPropName, @lcValor, @lcComentario )
- tcAsignacion = lcPropName + ' = ' + lcValor
+ PROCEDURE lineIsOnlyCommentAndNoMetadata
+ LPARAMETERS tcLine, tcComment
+ LOCAL lllineIsOnlyCommentAndNoMetadata, ln_AT_Cmt
- RETURN tcAsignacion
- ENDPROC
+ THIS.get_SeparatedLineAndComment( @tcLine, @tcComment )
-
- *******************************************************************************************************************
- PROCEDURE desnormalizarValorPropiedad
- LPARAMETERS tcProp, tcValue, tcComentario
- LOCAL lnCodError, lnPos, lcValue
- tcComentario = ''
-
- *-- Ajustes de algunos casos especiales
DO CASE
- CASE tcProp == '_memberdata'
- *-- Me quedo con lo importante y quito los CHR(0) y longitud que a veces agrega al inicio
- lcValue = ''
+ CASE LEFT(tcLine,2) == '*<'
+ tcComment = tcLine
- FOR I = 1 TO OCCURS( '/>', tcValue )
- TEXT TO lcValue TEXTMERGE ADDITIVE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <', I, 1+4 )>>
- ENDTEXT
- ENDFOR
-
- TEXT TO tcValue TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
-
- <>
-
- ENDTEXT
-
- tcValue = C_MPROPHEADER + STR( LEN(tcValue), 8 ) + tcValue
-
- CASE LEFT( tcValue, C_LEN_FB2P_VALUE_I ) == C_FB2P_VALUE_I
- *-- Valor especial Fox con cabecera CHR(1): Debo agregarla y desnormalizar el valor
- tcValue = STRTRAN( STRTRAN( STREXTRACT( tcValue, C_FB2P_VALUE_I, C_FB2P_VALUE_F, 1, 1 ), '
', C_CR ), '
', C_LF )
- tcValue = C_MPROPHEADER + STR( LEN(tcValue), 8 ) + tcValue
+ CASE EMPTY(tcLine) OR LEFT(tcLine, 1) == '*' OR LEFT(tcLine + ' ', 5) == 'NOTE ' && Vacía o Comentarios
+ lllineIsOnlyCommentAndNoMetadata = .T.
ENDCASE
- RETURN tcValue
- ENDFUNC
+ RETURN lllineIsOnlyCommentAndNoMetadata
+ ENDPROC
*******************************************************************************************************************
@@ -1119,18 +1165,38 @@ DEFINE CLASS c_conversor_base AS SESSION
*******************************************************************************************************************
- FUNCTION comprobarExpresionValida( tcAsignacion, tnCodError, tcExpNormalizada )
- LOCAL llError, loEx AS EXCEPTION
+ PROCEDURE normalizarValorXML
+ LPARAMETERS tcValor
+ *-- NORMALIZA EL TEXTO INDICADO, COMPRIMIENDO LOS SÍMBOLOS XML ESPECIALES.
+ tcValor = STRTRAN(tcValor, CHR(38), CHR(38) + 'amp;') && reemplaza & por & &&
+ tcValor = STRTRAN(tcValor, CHR(39), CHR(38) + 'apos;') && reemplaza ' por ' &&
+ tcValor = STRTRAN(tcValor, CHR(34), CHR(38) + 'quot;') && reemplaza " por " &&
+ tcValor = STRTRAN(tcValor, '<', CHR(38) + 'lt;') && reemplaza < por < &&
+ tcValor = STRTRAN(tcValor, '>', CHR(38) + 'gt;') && reemplaza > por > &&
+ tcValor = STRTRAN(tcValor, CHR(13)+CHR(10), CHR(10)) && reeemplaza CR+LF por LF
+ tcValor = CHRTRAN(tcValor, CHR(13), CHR(10)) && reemplaza CR por LF
- TRY
- tcExpNormalizada = NORMALIZE( tcAsignacion )
+ RETURN tcValor
+ ENDPROC
- CATCH TO loEx
- llError = .T.
- tnCodError = loEx.ERRORNO
- ENDTRY
- RETURN NOT llError
+ *******************************************************************************************************************
+ FUNCTION RowTimeStamp(ltDateTime)
+ * Generate a FoxPro 3.0-style row timestamp
+ *-- CONVIERTE UN DATO TIPO DATETIME EN TIMESTAMP NUMERICO USADO POR LOS ARCHIVOS SCX/VCX/etc.
+ LOCAL lcTimeValue, tnTimeStamp
+
+ IF VARTYPE(m.ltDateTime) <> 'T'
+ m.ltDateTime = DATETIME()
+ ENDIF
+
+ tnTimeStamp = ( YEAR(m.ltDateTime) - 1980) * 2^25 ;
+ + MONTH(m.ltDateTime) * 2^21 ;
+ + DAY(m.ltDateTime) * 2^16 ;
+ + HOUR(m.ltDateTime) * 2^11 ;
+ + MINUTE(m.ltDateTime) * 2^5 ;
+ + SEC(m.ltDateTime)
+ RETURN INT(tnTimeStamp)
ENDFUNC
@@ -1176,7 +1242,9 @@ DEFINE CLASS c_conversor_base AS SESSION
ENDIF
ENDFOR
- ASORT( laPropsAndValues, 1, -1, 0, 1)
+ IF THIS.l_PropSort_Enabled
+ ASORT( laPropsAndValues, 1, -1, 0, 1)
+ ENDIF
*-- Quitar el agregado
@@ -1254,6 +1322,19 @@ DEFINE CLASS c_conversor_base AS SESSION
ENDPROC
+ *******************************************************************************************************************
+ PROCEDURE writeLog
+ LPARAMETERS tcText
+
+ IF THIS.l_Debug
+ TRY
+ STRTOFILE( TTOC(DATETIME(),3) + ' ' + EVL(tcText,'') + CR_LF, THIS.c_LogFile, 1 )
+ CATCH
+ ENDTRY
+ ENDIF
+ ENDPROC
+
+
ENDDEFINE
@@ -1280,9 +1361,14 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ [] ;
+ + [] ;
+ [] ;
+ + [] ;
+ + [] ;
+ [] ;
+ + [] ;
+ [] ;
+ [] ;
+ [] ;
@@ -1302,7 +1388,8 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
*******************************************************************************************************************
PROCEDURE Convertir
- DODEFAULT()
+ LPARAMETERS toModulo, toEx AS EXCEPTION
+ DODEFAULT( @toModulo, @toEx )
ENDPROC
@@ -1378,6 +1465,12 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
lnLastPos = 1
DIMENSION taPropsAndValues( lnCantComillas / 2, 2 )
+ *-------------------------------------------------------------------------------------
+ * IMPORTANTE!!
+ * ------------
+ * SI SE SEPARAN LAS IGUALDADES CON ESPACIOS, ÉSTAS DEJAN DE RECONOCERSE!! (prop = "valor" en vez de prop="valor")
+ * TENER EN CUENTA AL GENERAR EL TEXTO O AL MODIFICARLO MANUALMENTE AL MERGEAR
+ *-------------------------------------------------------------------------------------
FOR I = 1 TO lnCantComillas STEP 2
X = X + 1
@@ -1504,11 +1597,6 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
*******************************************************************************************************************
PROCEDURE createProject
- LPARAMETERS toProject
-
- #IF .F.
- LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG'
- #ENDIF
CREATE TABLE (THIS.c_OutputFile) ;
( NAME M ;
@@ -1541,6 +1629,18 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
, USER M )
USE (THIS.c_OutputFile) ALIAS TABLABIN AGAIN SHARED
+
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE createProject_RecordHeader
+ LPARAMETERS toProject
+
+ #IF .F.
+ LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG'
+ #ENDIF
+
INSERT INTO TABLABIN ;
( NAME ;
, TYPE ;
@@ -1584,9 +1684,6 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
*******************************************************************************************************************
PROCEDURE createClasslib
- * No funciona con el EXE
- *CREATE CLASSLIB (THIS.c_outputFile)
-
CREATE TABLE (THIS.c_OutputFile) ;
( PLATFORM C(8) ;
, UNIQUEID C(10) ;
@@ -1613,6 +1710,13 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
, USER M )
USE (THIS.c_OutputFile) ALIAS TABLABIN AGAIN SHARED
+
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE createClasslib_RecordHeader
+
INSERT INTO TABLABIN ;
( PLATFORM ;
, UNIQUEID ;
@@ -1654,6 +1758,13 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
, USER M )
USE (THIS.c_OutputFile) ALIAS TABLABIN AGAIN SHARED
+
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE createForm_RecordHeader
+
INSERT INTO TABLABIN ;
( PLATFORM ;
, UNIQUEID ;
@@ -1666,6 +1777,99 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
ENDPROC
+ *******************************************************************************************************************
+ PROCEDURE createReport
+
+ CREATE TABLE (THIS.c_OutputFile) ;
+ ( 'PLATFORM' C(8) ;
+ , 'UNIQUEID' C(10) ;
+ , 'TIMESTAMP' N(10) ;
+ , 'OBJTYPE' N(2) ;
+ , 'OBJCODE' N(3) ;
+ , 'NAME' M ;
+ , 'EXPR' M ;
+ , 'VPOS' N(9,3) ;
+ , 'HPOS' N(9,3) ;
+ , 'HEIGHT' N(9,3) ;
+ , 'WIDTH' N(9,3) ;
+ , 'STYLE' M ;
+ , 'PICTURE' M ;
+ , 'ORDER' M NOCPTRANS ;
+ , 'UNIQUE' L ;
+ , 'COMMENT' M ;
+ , 'ENVIRON' L ;
+ , 'BOXCHAR' C(1) ;
+ , 'FILLCHAR' C(1) ;
+ , 'TAG' M ;
+ , 'TAG2' M NOCPTRANS ;
+ , 'PENRED' N(5) ;
+ , 'PENGREEN' N(5) ;
+ , 'PENBLUE' N(5) ;
+ , 'FILLRED' N(5) ;
+ , 'FILLGREEN' N(5) ;
+ , 'FILLBLUE' N(5) ;
+ , 'PENSIZE' N(5) ;
+ , 'PENPAT' N(5) ;
+ , 'FILLPAT' N(5) ;
+ , 'FONTFACE' M ;
+ , 'FONTSTYLE' N(3) ;
+ , 'FONTSIZE' N(3) ;
+ , 'MODE' N(3) ;
+ , 'RULER' N(1) ;
+ , 'RULERLINES' N(1) ;
+ , 'GRID' L ;
+ , 'GRIDV' N(2) ;
+ , 'GRIDH' N(2) ;
+ , 'FLOAT' L ;
+ , 'STRETCH' L ;
+ , 'STRETCHTOP' L ;
+ , 'TOP' L ;
+ , 'BOTTOM' L ;
+ , 'SUPTYPE' N(1) ;
+ , 'SUPREST' N(1) ;
+ , 'NOREPEAT' L ;
+ , 'RESETRPT' N(2) ;
+ , 'PAGEBREAK' L ;
+ , 'COLBREAK' L ;
+ , 'RESETPAGE' L ;
+ , 'GENERAL' N(3) ;
+ , 'SPACING' N(3) ;
+ , 'DOUBLE' L ;
+ , 'SWAPHEADER' L ;
+ , 'SWAPFOOTER' L ;
+ , 'EJECTBEFOR' L ;
+ , 'EJECTAFTER' L ;
+ , 'PLAIN' L ;
+ , 'SUMMARY' L ;
+ , 'ADDALIAS' L ;
+ , 'OFFSET' N(3) ;
+ , 'TOPMARGIN' N(3) ;
+ , 'BOTMARGIN' N(3) ;
+ , 'TOTALTYPE' N(2) ;
+ , 'RESETTOTAL' N(2) ;
+ , 'RESOID' N(2) ;
+ , 'CURPOS' L ;
+ , 'SUPALWAYS' L ;
+ , 'SUPOVFLOW' L ;
+ , 'SUPRPCOL' N(1) ;
+ , 'SUPGROUP' N(2) ;
+ , 'SUPVALCHNG' L ;
+ , 'SUPEXPR' M ;
+ , 'USER' M )
+
+ USE (THIS.c_OutputFile) ALIAS TABLABIN AGAIN SHARED
+
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE emptyRecord
+ LOCAL loReg
+ SCATTER MEMO BLANK NAME loReg
+ RETURN loReg
+ ENDPROC
+
+
*******************************************************************************************************************
PROCEDURE escribirArchivoBin
LPARAMETERS toModulo
@@ -1706,14 +1910,16 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
lcMemo = ''
IF toClase._Prop_Count > 0
- DIMENSION laProps( toClase._Prop_Count, 2 )
+ DIMENSION laProps( toClase._Prop_Count, 3 )
ACOPY( toClase._Props, laProps )
lnPropsAndValues_Count = 0
WITH THIS
*-- OBTENGO LAS PROPIEDADES Y SUS VALORES
FOR I = 1 TO toClase._Prop_Count
- .get_SeparatedPropAndValue( toClase._Props(I,1), @lcPropName, @lcValue )
+ *.get_SeparatedPropAndValue( toClase._Props(I,1), @lcPropName, @lcValue )
+ lcPropName = toClase._Props(I,1)
+ lcValue = toClase._Props(I,2)
DO CASE
CASE EMPTY(lcPropName)
@@ -1783,14 +1989,15 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
IF toObjeto._Prop_Count > 0
DIMENSION laPropsAndValues( toObjeto._Prop_Count, 2 )
+ ACOPY( toObjeto._Props, laPropsAndValues )
- WITH THIS
- FOR I = 1 TO toObjeto._Prop_Count
- .get_SeparatedPropAndValue( toObjeto._Props(I,1), @lcPropName, @lcValue )
- laPropsAndValues(I,1) = lcPropName
- laPropsAndValues(I,2) = lcValue
- ENDFOR
- ENDWITH && THIS
+ *WITH THIS
+ * FOR I = 1 TO toObjeto._Prop_Count
+ * .get_SeparatedPropAndValue( toObjeto._Props(I,1), @lcPropName, @lcValue )
+ * laPropsAndValues(I,1) = lcPropName
+ * laPropsAndValues(I,2) = lcValue
+ * ENDFOR
+ *ENDWITH && THIS
*-- REORDENO LAS PROPIEDADES
@@ -1845,8 +2052,6 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
ENDTEXT
ENDIF
- *-- Comentarios (NO DEBEN IR EN EL VCX!!)
-
*-- Incluir las líneas del método
FOR X = 1 TO loProcedure._ProcLine_Count
TEXT TO lcMemo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
@@ -2151,6 +2356,14 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
*******************************************************************************************************************
PROCEDURE analizarAsignacion_TAG_Indicado
+ *-- DETALLES: Este método está pensado para leer los tags FB2P_VALUE y MEMBERDATA, que tienen esta sintaxis:
+ *
+ * _memberdata =
+ *
+ * && XML Metadata for customizable properties
+ *
+ * Este es un
valor especial
+ *
LPARAMETERS tcPropName, tcValue, taProps, tnProp_Count, I, tcTAG_I, tcTAG_F, tnLEN_TAG_I, tnLEN_TAG_F, tcMemo
EXTERNAL ARRAY taProps
LOCAL llBloqueEncontrado, loEx AS EXCEPTION
@@ -2203,77 +2416,6 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
ENDPROC
- *******************************************************************************************************************
- PROCEDURE evaluarDefinicionDeProcedure
- LPARAMETERS toClase, tnX, tc_Comentario, tcProcName, tcProcType, toObjeto
- *--------------------------------------------------------------------------------------------------------------
- #IF .F.
- LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' ;
- , toObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG'
- #ENDIF
-
- TRY
- LOCAL I, lcNombreObjeto, lnObjProc ;
- , loProcedure AS CL_PROCEDURE OF 'FOXBIN2PRG.PRG'
-
- IF EMPTY(toClase._Fin_Cab)
- toClase._Fin_Cab = tnX-1
- toClase._Ini_Cuerpo = tnX
- ENDIF
-
- loProcedure = CREATEOBJECT("CL_PROCEDURE")
- loProcedure._Nombre = tcProcName
- loProcedure._ProcType = tcProcType
- loProcedure._Comentario = tc_Comentario
-
- *-- Anoto en HiddenMethods y ProtectedMethods según corresponda
- DO CASE
- CASE loProcedure._ProcType == 'hidden'
- toClase._HiddenMethods = toClase._HiddenMethods + ',' + tcProcName
-
- CASE loProcedure._ProcType == 'protected'
- toClase._ProtectedMethods = toClase._ProtectedMethods + ',' + tcProcName
-
- ENDCASE
-
- *-- Agrego el objeto Procedimiento a la clase, o a un objeto de la clase.
- IF '.' $ tcProcName
- *-- Procedimiento de objeto
- lcNombreObjeto = LOWER( JUSTSTEM( tcProcName ) )
-
- *-- Busco el objeto al que corresponde el método
- lnObjProc = THIS.buscarObjetoDelMetodoPorNombre( lcNombreObjeto, toClase )
-
- IF lnObjProc = 0
- *-- Procedimiento de clase
- toClase.add_Procedure( loProcedure )
- ELSE
- *-- Procedimiento de objeto
- toObjeto = toClase._AddObjects( lnObjProc )
- toObjeto.add_Procedure( loProcedure )
- ENDIF
- ELSE
- *-- Procedimiento de clase
- toClase.add_Procedure( loProcedure )
- ENDIF
-
- CATCH TO loEx
- IF THIS.l_Debug AND _VFP.STARTMODE = 0
- SET STEP ON
- ENDIF
-
- THROW
-
- FINALLY
- STORE NULL TO loProcedure
- RELEASE loProcedure
-
- ENDTRY
-
- RETURN
- ENDPROC
-
-
*******************************************************************************************************************
PROCEDURE analizarLineasDeProcedure
LPARAMETERS toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto, tc_Comentario ;
@@ -2332,191 +2474,6 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
ENDPROC
- *******************************************************************************************************************
- PROCEDURE analizarBloque_PROCEDURE
- LPARAMETERS toModulo, toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto ;
- , tc_Comentario, taBloquesExclusion, tnBloquesExclusion
-
- #IF .F.
- LOCAL toModulo AS CL_MODULO OF 'FOXBIN2PRG.PRG'
- LOCAL toObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG'
- LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG'
- #ENDIF
-
- LOCAL llBloqueEncontrado
-
- DO CASE
- CASE LEFT( tcLine, 20 ) == 'PROTECTED PROCEDURE '
- *-- Estructura a reconocer: PROTECTED PROCEDURE nombre_del_procedimiento
- llBloqueEncontrado = .T.
- tcProcedureAbierto = ALLTRIM( SUBSTR( tcLine, 21 ) )
- THIS.evaluarDefinicionDeProcedure( @toClase, I, @tc_Comentario, tcProcedureAbierto, 'protected', @toObjeto )
-
-
- CASE LEFT( tcLine, 17 ) == 'HIDDEN PROCEDURE '
- *-- Estructura a reconocer: HIDDEN PROCEDURE nombre_del_procedimiento
- llBloqueEncontrado = .T.
- tcProcedureAbierto = ALLTRIM( SUBSTR( tcLine, 18 ) )
- THIS.evaluarDefinicionDeProcedure( @toClase, I, @tc_Comentario, tcProcedureAbierto, 'hidden', @toObjeto )
-
- CASE LEFT( tcLine, 10 ) == 'PROCEDURE '
- *-- Estructura a reconocer: PROCEDURE [objeto.]nombre_del_procedimiento
- llBloqueEncontrado = .T.
- tcProcedureAbierto = ALLTRIM( SUBSTR( tcLine, 11 ) )
- THIS.evaluarDefinicionDeProcedure( @toClase, I, @tc_Comentario, tcProcedureAbierto, 'normal', @toObjeto )
-
- ENDCASE
-
- IF llBloqueEncontrado
- *-- Evalúo todo el contenido del PROCEDURE
- THIS.analizarLineasDeProcedure( @toClase, @toObjeto, @tcLine, @taCodeLines, @I, @tnCodeLines, tcProcedureAbierto ;
- , @tc_Comentario, @taBloquesExclusion, @tnBloquesExclusion )
- ENDIF
-
- RETURN llBloqueEncontrado
- ENDPROC
-
-
- *******************************************************************************************************************
- PROCEDURE analizarBloque_METADATA
- LPARAMETERS toClase, tcLine
-
- #IF .F.
- LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG'
- #ENDIF
-
- LOCAL llBloqueEncontrado
-
- IF LEFT(tcLine, C_LEN_METADATA_I) == C_METADATA_I && METADATA de la CLASE
- *< CLASSDATA: Baseclass="custom" Timestamp="2013/11/19 11:51:04" Scale="Foxels" Uniqueid="_3WF0VSTN1" ProjectClassIcon="container.ico" ClassIcon="toolbar.ico" />
- LOCAL laPropsAndValues(1,2), lnPropsAndValues_Count
- llBloqueEncontrado = .T.
- WITH THIS
- .get_ListNamesWithValuesFrom_InLine_MetadataTag( @tcLine, @laPropsAndValues, @lnPropsAndValues_Count, C_METADATA_I, C_METADATA_F )
-
- toClase._BaseClass = .get_ValueByName_FromListNamesWithValues( 'BaseClass', 'C', @laPropsAndValues )
- toClase._TimeStamp = INT( .RowTimeStamp( .get_ValueByName_FromListNamesWithValues( 'TimeStamp', 'T', @laPropsAndValues ) ) )
- toClase._Scale = .get_ValueByName_FromListNamesWithValues( 'Scale', 'C', @laPropsAndValues )
- toClase._UniqueID = .get_ValueByName_FromListNamesWithValues( 'UniqueID', 'C', @laPropsAndValues )
- toClase._ProjectClassIcon = .get_ValueByName_FromListNamesWithValues( 'ProjectClassIcon', 'C', @laPropsAndValues )
- toClase._ClassIcon = .get_ValueByName_FromListNamesWithValues( 'ClassIcon', 'C', @laPropsAndValues )
- toClase._Ole2 = .get_ValueByName_FromListNamesWithValues( 'Ole2', 'C', @laPropsAndValues )
- ENDWITH && THIS
-
- IF NOT EMPTY( toClase._Ole2 ) && Le agrego "OLEObject = " delante
- toClase._Ole2 = 'OLEObject = ' + toClase._Ole2 + CR_LF
- ENDIF
- ENDIF
-
- RETURN llBloqueEncontrado
- ENDPROC
-
-
- *******************************************************************************************************************
- PROCEDURE analizarBloque_PROTECTED
- LPARAMETERS toClase, tcLine
-
- #IF .F.
- LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG'
- #ENDIF
-
- LOCAL llBloqueEncontrado
-
- IF LEFT(tcLine, 10) == 'PROTECTED '
- llBloqueEncontrado = .T.
- toClase._ProtectedProps = ALLTRIM( SUBSTR( tcLine, 11 ) )
- ENDIF
-
- RETURN llBloqueEncontrado
- ENDPROC
-
-
- *******************************************************************************************************************
- PROCEDURE analizarBloque_HIDDEN
- LPARAMETERS toClase, tcLine
-
- #IF .F.
- LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG'
- #ENDIF
-
- LOCAL llBloqueEncontrado
-
- IF LEFT(tcLine, 7) == 'HIDDEN '
- llBloqueEncontrado = .T.
- toClase._HiddenProps = ALLTRIM( SUBSTR( tcLine, 8 ) )
- ENDIF
-
- RETURN llBloqueEncontrado
- ENDPROC
-
-
- *******************************************************************************************************************
- PROCEDURE analizarBloque_DEFINED_PAM
- *-- ESTRUCTURA A ANALIZAR:
- *
- *m: *metodovacio_con_comentarios && Este método no tiene código, pero tiene comentarios. A ver que pasa!
- *m: *mimetodo && Mi metodo
- *p: prop1 && Mi prop 1
- *p: prop_especial_cr &&
- *a: ^array_1_d[1,0] && Array 1 dimensión (1)
- *a: ^array_2_d[1,2] && Array una dimension (1,2)
- *p: _memberdata && XML Metadata for customizable properties
- *
- LPARAMETERS toClase, tcLine, taCodeLines, tnCodeLines, I
-
- #IF .F.
- LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG'
- #ENDIF
-
- TRY
- LOCAL llBloqueEncontrado, lcDefinedPAM, lnPos, lnPos2
-
- IF LEFT( tcLine, C_LEN_DEFINED_PAM_I) == C_DEFINED_PAM_I
- llBloqueEncontrado = .T.
- lcDefinedPAM = ''
-
- WITH THIS
- FOR I = I + 1 TO tnCodeLines
- .set_Line( @tcLine, @taCodeLines, I )
-
- DO CASE
- CASE LEFT( tcLine, C_LEN_DEFINED_PAM_F ) == C_DEFINED_PAM_F
- I = I + 1
- EXIT
-
- *CASE .lineIsOnlyCommentAndNoMetadata( @tcLine )
- * LOOP && Saltear comentarios
-
- OTHERWISE
- *toProject.setParsedProjInfoLine( @tcLine )
- lnPos = AT( ' ', tcLine, 1 )
- lnPos2 = AT( '&'+'&', tcLine )
- lcDefinedPAM = lcDefinedPAM ;
- + RTRIM( SUBSTR( tcLine, lnPos+1, lnPos2 - lnPos - 1 ), 0, ' ', CHR(9) ) + ' ' + SUBSTR( tcLine, lnPos2 + 3 ) ;
- + CR_LF
- ENDCASE
- ENDFOR
- ENDWITH && THIS
-
- toClase._Defined_PAM = lcDefinedPAM
- I = I - 1
- ENDIF
-
- CATCH TO loEx
- lnCodError = loEx.ERRORNO
-
- IF THIS.l_Debug AND _VFP.STARTMODE = 0
- SET STEP ON
- ENDIF
-
- THROW
-
- ENDTRY
-
- RETURN llBloqueEncontrado
- ENDPROC
-
-
*******************************************************************************************************************
PROCEDURE analizarBloque_ADD_OBJECT
LPARAMETERS toModulo, toClase, tcLine, I, taCodeLines, tnCodeLines
@@ -2535,7 +2492,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
IF LEFT( tcLine, 11 ) == 'ADD OBJECT '
*-- Estructura a reconocer: ADD OBJECT 'frm_a.Check1' AS check [WITH]
llBloqueEncontrado = .T.
- LOCAL laPropsAndValues(1,2), lnPropsAndValues_Count, Z
+ LOCAL laPropsAndValues(1,2), lnPropsAndValues_Count, Z, lcProp, lcValue
tcLine = CHRTRAN( tcLine, ['], ["] )
IF EMPTY(toClase._Fin_Cab)
@@ -2592,10 +2549,12 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
IF RIGHT(tcLine, 3) == ', ;'
*toObjeto.add_Property( .desnormalizarAsignacion( LEFT(tcLine, LEN(tcLine) - 3) ) )
- toObjeto.add_Property( LEFT(tcLine, LEN(tcLine) - 3) )
+ .get_SeparatedPropAndValue( LEFT(tcLine, LEN(tcLine) - 3), @lcProp, @lcValue )
+ toObjeto.add_Property( @lcProp, @lcValue )
ELSE
*toObjeto.add_Property( .desnormalizarAsignacion( RTRIM(tcLine) ) )
- toObjeto.add_Property( RTRIM(tcLine) )
+ .get_SeparatedPropAndValue( RTRIM(tcLine), @lcProp, @lcValue )
+ toObjeto.add_Property( @lcProp, @lcValue )
ENDIF
ENDFOR
@@ -2616,31 +2575,74 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
*******************************************************************************************************************
- PROCEDURE analizarBloque_ENDDEFINE
- LPARAMETERS toClase, tcLine, I, tcProcedureAbierto
+ PROCEDURE analizarBloque_DEFINED_PAM
+ *-- ESTRUCTURA A ANALIZAR:
+ *
+ *m: *metodovacio_con_comentarios && Este método no tiene código, pero tiene comentarios. A ver que pasa!
+ *m: *mimetodo && Mi metodo
+ *p: prop1 && Mi prop 1
+ *p: prop_especial_cr &&
+ *a: ^array_1_d[1,0] && Array 1 dimensión (1)
+ *a: ^array_2_d[1,2] && Array una dimension (1,2)
+ *p: _memberdata && XML Metadata for customizable properties
+ *
+ LPARAMETERS toClase, tcLine, taCodeLines, tnCodeLines, I
#IF .F.
LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG'
#ENDIF
- LOCAL llBloqueEncontrado
+ TRY
+ LOCAL llBloqueEncontrado, lcDefinedPAM, lnPos, lnPos2, lcPAM_Name
- IF LEFT( tcLine + ' ', 10 ) == C_ENDDEFINE + ' ' && Fin de bloque (ENDDEF / ENDPROC) encontrado
- llBloqueEncontrado = .T.
- toClase._Fin = I
+ IF LEFT( tcLine, C_LEN_DEFINED_PAM_I) == C_DEFINED_PAM_I
+ llBloqueEncontrado = .T.
+ lcDefinedPAM = ''
- IF EMPTY( toClase._Ini_Cuerpo )
- toClase._Ini_Cuerpo = I-1
+ WITH THIS
+ FOR I = I + 1 TO tnCodeLines
+ .set_Line( @tcLine, @taCodeLines, I )
+
+ DO CASE
+ CASE LEFT( tcLine, C_LEN_DEFINED_PAM_F ) == C_DEFINED_PAM_F
+ I = I + 1
+ EXIT
+
+ OTHERWISE
+ lnPos = AT( ' ', tcLine, 1 )
+ lnPos2 = AT( '&'+'&', tcLine )
+
+ IF lnPos2 > 0
+ *-- Con comentarios
+ lcPAM_Name = RTRIM( SUBSTR( tcLine, lnPos+1, lnPos2 - lnPos - 1 ), 0, ' ', CHR(9) )
+ lcDefinedPAM = lcDefinedPAM ;
+ + lcPAM_Name + ' ' + SUBSTR( tcLine, lnPos2 + 3 ) ;
+ + CR_LF
+ ELSE
+ *-- Sin comentarios
+ lcPAM_Name = RTRIM( SUBSTR( tcLine, lnPos+1 ), 0, ' ', CHR(9) )
+ lcDefinedPAM = lcDefinedPAM ;
+ + lcPAM_Name + IIF(ISALPHA(lcPAM_Name), '', ' ') ;
+ + CR_LF
+ ENDIF
+ ENDCASE
+ ENDFOR
+ ENDWITH && THIS
+
+ toClase._Defined_PAM = lcDefinedPAM
+ I = I - 1
ENDIF
- toClase._Fin_Cuerpo = I-1
+ CATCH TO loEx
+ lnCodError = loEx.ERRORNO
- IF EMPTY( toClase._Fin_Cab )
- toClase._Fin_Cab = I-1
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
ENDIF
- STORE '' TO tcProcedureAbierto
- ENDIF
+ THROW
+
+ ENDTRY
RETURN llBloqueEncontrado
ENDPROC
@@ -2664,7 +2666,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
IF LEFT(tcLine + ' ', 13) == C_DEFINE_CLASS + ' '
TRY
llBloqueEncontrado = .T.
- LOCAL Z, loEx AS EXCEPTION ;
+ LOCAL Z, lcProp, lcValue, loEx AS EXCEPTION ;
, llMETADATA_Completed, llPROTECTED_Completed, llHIDDEN_Completed, llDEFINED_PAM_Completed ;
, llINCLUDE_Completed, llCLASS_PROPERTY_Completed
@@ -2748,7 +2750,8 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
CASE NOT llCLASS_PROPERTY_Completed AND EMPTY( toClase._Fin_Cab ) && Propiedades del DEFINE CLASS
*toClase.add_Property( THIS.desnormalizarAsignacion( RTRIM(tcLine) ), RTRIM(tc_Comentario) )
- toClase.add_Property( RTRIM(tcLine), RTRIM(tc_Comentario) )
+ .get_SeparatedPropAndValue( RTRIM(tcLine), @lcProp, @lcValue )
+ toClase.add_Property( @lcProp, @lcValue, RTRIM(tc_Comentario) )
OTHERWISE
@@ -2767,6 +2770,18 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
+ 'para el identificador [' + toClase._Nombre + ']'
ENDIF
+ toClase._PROPERTIES = THIS.classProps2Memo( toClase )
+ toClase._PROTECTED = THIS.hiddenAndProtected_PAM( toClase )
+ toClase._METHODS = THIS.classMethods2Memo( toClase )
+ toClase._RESERVED1 = IIF( THIS.c_Type = 'SCX', '', 'Class' )
+ toClase._RESERVED2 = IIF( THIS.c_Type = 'VCX' OR toClase._Nombre == 'Dataenvironment', TRANSFORM( toClase._AddObject_Count + 1 ), '' )
+ toClase._RESERVED3 = THIS.defined_PAM2Memo( toClase )
+ toClase._RESERVED4 = toClase._ClassIcon
+ toClase._RESERVED5 = toClase._ProjectClassIcon
+ toClase._RESERVED6 = toClase._Scale
+ toClase._RESERVED7 = toClase._Comentario
+ toClase._RESERVED8 = toClase._includeFile
+
CATCH TO loEx
IF THIS.l_Debug AND _VFP.STARTMODE = 0
SET STEP ON
@@ -2781,6 +2796,56 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
ENDPROC
+ *******************************************************************************************************************
+ PROCEDURE analizarBloque_ENDDEFINE
+ LPARAMETERS toClase, tcLine, I, tcProcedureAbierto
+
+ #IF .F.
+ LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG'
+ #ENDIF
+
+ LOCAL llBloqueEncontrado
+
+ IF LEFT( tcLine + ' ', 10 ) == C_ENDDEFINE + ' ' && Fin de bloque (ENDDEF / ENDPROC) encontrado
+ llBloqueEncontrado = .T.
+ toClase._Fin = I
+
+ IF EMPTY( toClase._Ini_Cuerpo )
+ toClase._Ini_Cuerpo = I-1
+ ENDIF
+
+ toClase._Fin_Cuerpo = I-1
+
+ IF EMPTY( toClase._Fin_Cab )
+ toClase._Fin_Cab = I-1
+ ENDIF
+
+ STORE '' TO tcProcedureAbierto
+ ENDIF
+
+ RETURN llBloqueEncontrado
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE analizarBloque_HIDDEN
+ LPARAMETERS toClase, tcLine
+
+ #IF .F.
+ LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG'
+ #ENDIF
+
+ LOCAL llBloqueEncontrado
+
+ IF LEFT(tcLine, 7) == 'HIDDEN '
+ llBloqueEncontrado = .T.
+ toClase._HiddenProps = ALLTRIM( SUBSTR( tcLine, 8 ) )
+ ENDIF
+
+ RETURN llBloqueEncontrado
+ ENDPROC
+
+
*******************************************************************************************************************
PROCEDURE analizarBloque_INCLUDE
LPARAMETERS toModulo, toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto
@@ -2804,6 +2869,41 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
ENDPROC
+ *******************************************************************************************************************
+ PROCEDURE analizarBloque_METADATA
+ LPARAMETERS toClase, tcLine
+
+ #IF .F.
+ LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG'
+ #ENDIF
+
+ LOCAL llBloqueEncontrado
+
+ IF LEFT(tcLine, C_LEN_METADATA_I) == C_METADATA_I && METADATA de la CLASE
+ *< CLASSDATA: Baseclass="custom" Timestamp="2013/11/19 11:51:04" Scale="Foxels" Uniqueid="_3WF0VSTN1" ProjectClassIcon="container.ico" ClassIcon="toolbar.ico" />
+ LOCAL laPropsAndValues(1,2), lnPropsAndValues_Count
+ llBloqueEncontrado = .T.
+ WITH THIS
+ .get_ListNamesWithValuesFrom_InLine_MetadataTag( @tcLine, @laPropsAndValues, @lnPropsAndValues_Count, C_METADATA_I, C_METADATA_F )
+
+ toClase._BaseClass = .get_ValueByName_FromListNamesWithValues( 'BaseClass', 'C', @laPropsAndValues )
+ toClase._TimeStamp = INT( .RowTimeStamp( .get_ValueByName_FromListNamesWithValues( 'TimeStamp', 'T', @laPropsAndValues ) ) )
+ toClase._Scale = .get_ValueByName_FromListNamesWithValues( 'Scale', 'C', @laPropsAndValues )
+ toClase._UniqueID = .get_ValueByName_FromListNamesWithValues( 'UniqueID', 'C', @laPropsAndValues )
+ toClase._ProjectClassIcon = .get_ValueByName_FromListNamesWithValues( 'ProjectClassIcon', 'C', @laPropsAndValues )
+ toClase._ClassIcon = .get_ValueByName_FromListNamesWithValues( 'ClassIcon', 'C', @laPropsAndValues )
+ toClase._Ole2 = .get_ValueByName_FromListNamesWithValues( 'OLEObject', 'C', @laPropsAndValues )
+ ENDWITH && THIS
+
+ IF NOT EMPTY( toClase._Ole2 ) && Le agrego "OLEObject = " delante
+ toClase._Ole2 = 'OLEObject = ' + toClase._Ole2 + CR_LF
+ ENDIF
+ ENDIF
+
+ RETURN llBloqueEncontrado
+ ENDPROC
+
+
*******************************************************************************************************************
PROCEDURE analizarBloque_OLE_DEF
LPARAMETERS toModulo, toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto
@@ -2854,6 +2954,142 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
RETURN llBloqueEncontrado
ENDPROC
+
+ *******************************************************************************************************************
+ PROCEDURE analizarBloque_PROCEDURE
+ LPARAMETERS toModulo, toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto ;
+ , tc_Comentario, taBloquesExclusion, tnBloquesExclusion
+
+ #IF .F.
+ LOCAL toModulo AS CL_MODULO OF 'FOXBIN2PRG.PRG'
+ LOCAL toObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG'
+ LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG'
+ #ENDIF
+
+ LOCAL llBloqueEncontrado
+
+ DO CASE
+ CASE LEFT( tcLine, 20 ) == 'PROTECTED PROCEDURE '
+ *-- Estructura a reconocer: PROTECTED PROCEDURE nombre_del_procedimiento
+ llBloqueEncontrado = .T.
+ tcProcedureAbierto = ALLTRIM( SUBSTR( tcLine, 21 ) )
+ THIS.evaluarDefinicionDeProcedure( @toClase, I, @tc_Comentario, tcProcedureAbierto, 'protected', @toObjeto )
+
+
+ CASE LEFT( tcLine, 17 ) == 'HIDDEN PROCEDURE '
+ *-- Estructura a reconocer: HIDDEN PROCEDURE nombre_del_procedimiento
+ llBloqueEncontrado = .T.
+ tcProcedureAbierto = ALLTRIM( SUBSTR( tcLine, 18 ) )
+ THIS.evaluarDefinicionDeProcedure( @toClase, I, @tc_Comentario, tcProcedureAbierto, 'hidden', @toObjeto )
+
+ CASE LEFT( tcLine, 10 ) == 'PROCEDURE '
+ *-- Estructura a reconocer: PROCEDURE [objeto.]nombre_del_procedimiento
+ llBloqueEncontrado = .T.
+ tcProcedureAbierto = ALLTRIM( SUBSTR( tcLine, 11 ) )
+ THIS.evaluarDefinicionDeProcedure( @toClase, I, @tc_Comentario, tcProcedureAbierto, 'normal', @toObjeto )
+
+ ENDCASE
+
+ IF llBloqueEncontrado
+ *-- Evalúo todo el contenido del PROCEDURE
+ THIS.analizarLineasDeProcedure( @toClase, @toObjeto, @tcLine, @taCodeLines, @I, @tnCodeLines, tcProcedureAbierto ;
+ , @tc_Comentario, @taBloquesExclusion, @tnBloquesExclusion )
+ ENDIF
+
+ RETURN llBloqueEncontrado
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE analizarBloque_PROTECTED
+ LPARAMETERS toClase, tcLine
+
+ #IF .F.
+ LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG'
+ #ENDIF
+
+ LOCAL llBloqueEncontrado
+
+ IF LEFT(tcLine, 10) == 'PROTECTED '
+ llBloqueEncontrado = .T.
+ toClase._ProtectedProps = ALLTRIM( SUBSTR( tcLine, 11 ) )
+ ENDIF
+
+ RETURN llBloqueEncontrado
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE evaluarDefinicionDeProcedure
+ LPARAMETERS toClase, tnX, tc_Comentario, tcProcName, tcProcType, toObjeto
+ *--------------------------------------------------------------------------------------------------------------
+ #IF .F.
+ LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' ;
+ , toObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG'
+ #ENDIF
+
+ TRY
+ LOCAL I, lcNombreObjeto, lnObjProc ;
+ , loProcedure AS CL_PROCEDURE OF 'FOXBIN2PRG.PRG'
+
+ IF EMPTY(toClase._Fin_Cab)
+ toClase._Fin_Cab = tnX-1
+ toClase._Ini_Cuerpo = tnX
+ ENDIF
+
+ loProcedure = CREATEOBJECT("CL_PROCEDURE")
+ loProcedure._Nombre = tcProcName
+ loProcedure._ProcType = tcProcType
+ loProcedure._Comentario = tc_Comentario
+
+ *-- Anoto en HiddenMethods y ProtectedMethods según corresponda
+ DO CASE
+ CASE loProcedure._ProcType == 'hidden'
+ toClase._HiddenMethods = toClase._HiddenMethods + ',' + tcProcName
+
+ CASE loProcedure._ProcType == 'protected'
+ toClase._ProtectedMethods = toClase._ProtectedMethods + ',' + tcProcName
+
+ ENDCASE
+
+ *-- Agrego el objeto Procedimiento a la clase, o a un objeto de la clase.
+ IF '.' $ tcProcName
+ *-- Procedimiento de objeto
+ lcNombreObjeto = LOWER( JUSTSTEM( tcProcName ) )
+
+ *-- Busco el objeto al que corresponde el método
+ lnObjProc = THIS.buscarObjetoDelMetodoPorNombre( lcNombreObjeto, toClase )
+
+ IF lnObjProc = 0
+ *-- Procedimiento de clase
+ toClase.add_Procedure( loProcedure )
+ ELSE
+ *-- Procedimiento de objeto
+ toObjeto = toClase._AddObjects( lnObjProc )
+ toObjeto.add_Procedure( loProcedure )
+ ENDIF
+ ELSE
+ *-- Procedimiento de clase
+ toClase.add_Procedure( loProcedure )
+ ENDIF
+
+ CATCH TO loEx
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+
+ FINALLY
+ STORE NULL TO loProcedure
+ RELEASE loProcedure
+
+ ENDTRY
+
+ RETURN
+ ENDPROC
+
+
*******************************************************************************************************************
PROCEDURE identificarBloquesDeCodigo
LPARAMETERS taCodeLines, tnCodeLines, taBloquesExclusion, tnBloquesExclusion, toModulo
@@ -2955,11 +3191,12 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin
*******************************************************************************************************************
PROCEDURE Convertir
- DODEFAULT()
+ LPARAMETERS toModulo, toEx AS EXCEPTION
+ DODEFAULT( @toModulo, @toEx )
TRY
- LOCAL lnCodError, loEx AS EXCEPTION, loReg, lcLine, laCodeLines(1), lnCodeLines, lnFB2P_Version, lcSourceFile ;
- , laBloquesExclusion(1,2), lnBloquesExclusion, I, toModulo
+ LOCAL lnCodError, loReg, lcLine, laCodeLines(1), lnCodeLines, lnFB2P_Version, lcSourceFile ;
+ , laBloquesExclusion(1,2), lnBloquesExclusion, I
STORE 0 TO lnCodError, lnCodeLines, lnFB2P_Version
STORE '' TO lcLine, lcSourceFile
STORE NULL TO loReg, toModulo
@@ -2967,6 +3204,11 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin
C_FB2PRG_CODE = FILETOSTR( THIS.c_InputFile )
lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE )
+ THIS.doBackup()
+
+ *-- Creo la librería
+ THIS.createClasslib()
+
*-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF
THIS.identificarBloquesDeExclusion( @laCodeLines, lnCodeLines, .F., @laBloquesExclusion, @lnBloquesExclusion )
@@ -2976,9 +3218,7 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin
THIS.escribirArchivoBin( @toModulo )
- CATCH TO loEx
- lnCodError = loEx.ERRORNO
-
+ CATCH TO toEx
IF THIS.l_Debug AND _VFP.STARTMODE = 0
SET STEP ON
ENDIF
@@ -2987,7 +3227,7 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin
ENDTRY
- RETURN lnCodError
+ RETURN
ENDPROC
@@ -3068,8 +3308,8 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin
, loClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' ;
, loObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG'
- THIS.doBackup()
- THIS.createClasslib()
+ *-- Creo el registro de cabecera
+ THIS.createClasslib_RecordHeader()
*-- Recorro las CLASES
@@ -3110,14 +3350,14 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin
, loClase._BaseClass ;
, loClase._ObjName ;
, loClase._Parent ;
- , THIS.classProps2Memo( loClase ) ;
- , THIS.hiddenAndProtected_PAM( loClase ) ;
- , THIS.classMethods2Memo( loClase ) ;
+ , loClase._PROPERTIES ;
+ , loClase._PROTECTED ;
+ , loClase._METHODS ;
, loClase._Ole ;
, loClase._Ole2 ;
- , 'Class' ;
- , TRANSFORM( loClase._AddObject_Count + 1 ) ;
- , THIS.defined_PAM2Memo( loClase ) ;
+ , loClase._RESERVED1 ;
+ , loClase._RESERVED2 ;
+ , loClase._RESERVED3 ;
, loClase._ClassIcon ;
, loClase._ProjectClassIcon ;
, loClase._Scale ;
@@ -3215,11 +3455,12 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin
*******************************************************************************************************************
PROCEDURE Convertir
- DODEFAULT()
+ LPARAMETERS toModulo, toEx AS EXCEPTION
+ DODEFAULT( @toModulo, @toEx )
TRY
- LOCAL lnCodError, loEx AS EXCEPTION, loReg, lcLine, laCodeLines(1), lnCodeLines, lnFB2P_Version, lcSourceFile ;
- , laBloquesExclusion(1,2), lnBloquesExclusion, I, toModulo
+ LOCAL lnCodError, loReg, lcLine, laCodeLines(1), lnCodeLines, lnFB2P_Version, lcSourceFile ;
+ , laBloquesExclusion(1,2), lnBloquesExclusion, I
STORE 0 TO lnCodError, lnCodeLines, lnFB2P_Version
STORE '' TO lcLine, lcSourceFile
STORE NULL TO loReg, toModulo
@@ -3227,6 +3468,11 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin
C_FB2PRG_CODE = FILETOSTR( THIS.c_InputFile )
lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE )
+ THIS.doBackup()
+
+ *-- Creo el form
+ THIS.createForm()
+
*-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF
THIS.identificarBloquesDeExclusion( @laCodeLines, lnCodeLines, .F., @laBloquesExclusion, @lnBloquesExclusion )
@@ -3236,9 +3482,7 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin
THIS.escribirArchivoBin( @toModulo )
- CATCH TO loEx
- lnCodError = loEx.ERRORNO
-
+ CATCH TO toEx
IF THIS.l_Debug AND _VFP.STARTMODE = 0
SET STEP ON
ENDIF
@@ -3247,7 +3491,7 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin
ENDTRY
- RETURN lnCodError
+ RETURN
ENDPROC
@@ -3328,8 +3572,8 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin
, loClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' ;
, loObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG'
- THIS.doBackup()
- THIS.createForm()
+ *-- Creo el registro de cabecera
+ THIS.createForm_RecordHeader()
*-- El SCX tiene el INCLUDE en el primer registro
IF NOT EMPTY(toModulo._includeFile)
@@ -3375,14 +3619,14 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin
, loClase._BaseClass ;
, loClase._ObjName ;
, loClase._Parent ;
- , THIS.classProps2Memo( loClase ) ;
- , THIS.hiddenAndProtected_PAM( loClase ) ;
- , THIS.classMethods2Memo( loClase ) ;
+ , loClase._PROPERTIES ;
+ , loClase._PROTECTED ;
+ , loClase._METHODS ;
, loClase._Ole ;
, loClase._Ole2 ;
- , '' ;
- , TRANSFORM( loClase._AddObject_Count + 1 ) ;
- , THIS.defined_PAM2Memo( loClase ) ;
+ , loClase._RESERVED1 ;
+ , loClase._RESERVED2 ;
+ , loClase._RESERVED3 ;
, loClase._ClassIcon ;
, loClase._ProjectClassIcon ;
, loClase._Scale ;
@@ -3394,7 +3638,7 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin
THIS.insert_AllObjects( @loClase )
- IF NOT loClase._BaseClass == 'dataenvironment'
+ IF .F. &&NOT loClase._BaseClass == 'dataenvironment'
*-- Inserto el COMMENT
INSERT INTO TABLABIN ;
( PLATFORM ;
@@ -3451,8 +3695,6 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin
CATCH TO loEx
- lnCodError = loEx.ERRORNO
-
IF THIS.l_Debug AND _VFP.STARTMODE = 0
SET STEP ON
ENDIF
@@ -3464,7 +3706,7 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin
ENDTRY
- RETURN lnCodError
+ RETURN
ENDPROC
ENDDEFINE
@@ -3490,12 +3732,16 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin
*******************************************************************************************************************
PROCEDURE Convertir
- DODEFAULT()
+ LPARAMETERS toModulo, toEx AS EXCEPTION
+ DODEFAULT( @toModulo, @toEx )
+
+ #IF .F.
+ LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG'
+ #ENDIF
TRY
- LOCAL lnCodError, loEx AS EXCEPTION, loReg, lcLine, laCodeLines(1), lnCodeLines, lnFB2P_Version, lcSourceFile ;
- , laBloquesExclusion(1,2), lnBloquesExclusion, I ;
- , loProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG'
+ LOCAL lnCodError, loReg, lcLine, laCodeLines(1), lnCodeLines, lnFB2P_Version, lcSourceFile ;
+ , laBloquesExclusion(1,2), lnBloquesExclusion, I
STORE 0 TO lnCodError, lnCodeLines, lnFB2P_Version
STORE '' TO lcLine, lcSourceFile
STORE NULL TO loReg, toModulo
@@ -3503,18 +3749,21 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin
C_FB2PRG_CODE = FILETOSTR( THIS.c_InputFile )
lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE )
+ THIS.doBackup()
+
+ *-- Creo solo la cabecera del proyecto
+ THIS.createProject()
+
*-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF
*THIS.identificarBloquesDeExclusion( @laCodeLines, .F., @laBloquesExclusion, @lnBloquesExclusion )
*-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo de cada clase
- THIS.identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @loProject )
+ THIS.identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @toProject )
- THIS.escribirArchivoBin( @loProject )
+ THIS.escribirArchivoBin( @toProject )
- CATCH TO loEx
- lnCodError = loEx.ERRORNO
-
+ CATCH TO toEx
IF THIS.l_Debug AND _VFP.STARTMODE = 0
SET STEP ON
ENDIF
@@ -3523,7 +3772,7 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin
ENDTRY
- RETURN lnCodError
+ RETURN
ENDPROC
@@ -3540,10 +3789,8 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin
, loServerHead AS CL_PROJ_SRV_HEAD OF 'FOXBIN2PRG.PRG' ;
, loFile AS CL_PROJ_FILE OF 'FOXBIN2PRG.PRG'
- THIS.doBackup()
-
- *-- Creo solo la cabecera del proyecto
- THIS.createProject( toProject )
+ *-- Creo solo el registro de cabecera del proyecto
+ THIS.createProject_RecordHeader( toProject )
lcMainProg = ''
@@ -4179,6 +4426,1779 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin
ENDDEFINE
+*******************************************************************************************************************
+DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin
+ #IF .F.
+ LOCAL THIS AS c_conversor_prg_a_frx OF 'FOXBIN2PRG.PRG'
+ #ENDIF
+ _MEMBERDATA = [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + []
+
+
+ *******************************************************************************************************************
+ PROCEDURE Convertir
+ DODEFAULT()
+
+ TRY
+ LOCAL lnCodError, loEx AS EXCEPTION, loReg, lcLine, laCodeLines(1), lnCodeLines, lnFB2P_Version, lcSourceFile ;
+ , laBloquesExclusion(1,2), lnBloquesExclusion, I ;
+ , loReport AS CL_REPORT OF 'FOXBIN2PRG.PRG'
+ STORE 0 TO lnCodError, lnCodeLines, lnFB2P_Version
+ STORE '' TO lcLine, lcSourceFile
+ STORE NULL TO loReg, toModulo
+
+ C_FB2PRG_CODE = FILETOSTR( THIS.c_InputFile )
+ lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE )
+
+ THIS.doBackup()
+
+ *-- Creo el reporte
+ THIS.createReport()
+
+ *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo del reporte
+ THIS.identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @loReport )
+
+ THIS.escribirArchivoBin( @loReport )
+
+
+ CATCH TO loEx
+ lnCodError = loEx.ERRORNO
+
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+
+ ENDTRY
+
+ RETURN lnCodError
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE escribirArchivoBin
+ LPARAMETERS toReport
+ *-- -----------------------------------------------------------------------------------------------------------
+ #IF .F.
+ LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG'
+ #ENDIF
+
+ TRY
+ LOCAL loReg, lnCodError, loEx AS EXCEPTION
+
+ *-- Agrego los ARCHIVOS
+ FOR EACH loReg IN toReport FOXOBJECT
+ INSERT INTO TABLABIN FROM NAME loReg
+ ENDFOR
+
+ USE IN (SELECT("TABLABIN"))
+
+
+ CATCH TO loEx
+ lnCodError = loEx.ERRORNO
+
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+
+ FINALLY
+ USE IN (SELECT("TABLABIN"))
+
+ ENDTRY
+
+ RETURN lnCodError
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE identificarBloquesDeCodigo
+ LPARAMETERS taCodeLines, tnCodeLines, taBloquesExclusion, tnBloquesExclusion, toReport
+ *--------------------------------------------------------------------------------------------------------------
+ * taCodeLines (!@ IN ) El array con las líneas del código donde buscar
+ * tnCodeLines (!@ IN ) Cantidad de líneas de código
+ * taBloquesExclusion (?@ IN ) Sin uso
+ * tnBloquesExclusion (?@ IN ) Sin uso
+ * toReport (?@ OUT) Objeto con toda la información del reporte analizado
+ *
+ * NOTA:
+ * Como identificador se usa el nombre de clase o de procedimiento, según corresponda.
+ *--------------------------------------------------------------------------------------------------------------
+ EXTERNAL ARRAY taCodeLines, taBloquesExclusion
+
+ #IF .F.
+ LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG'
+ #ENDIF
+
+ TRY
+ LOCAL I, lc_Comentario, lcLine, llFoxBin2Prg_Completed
+ STORE 0 TO I
+
+ THIS.c_Type = UPPER(JUSTEXT(THIS.c_OutputFile))
+
+ IF tnCodeLines > 1
+ toReport = NULL
+ toReport = CREATEOBJECT('CL_REPORT')
+
+ WITH THIS
+ FOR I = 1 TO tnCodeLines
+ .set_Line( @lcLine, @taCodeLines, I )
+
+ IF .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Vacía o solo Comentarios
+ LOOP
+ ENDIF
+
+ DO CASE
+ CASE NOT llFoxBin2Prg_Completed AND .analizarBloque_FoxBin2Prg( toReport, @lcLine, @taCodeLines, @I, tnCodeLines )
+ llFoxBin2Prg_Completed = .T.
+
+ CASE .analizarBloque_Reportes( toReport, @lcLine, @taCodeLines, @I, tnCodeLines )
+
+ ENDCASE
+ ENDFOR
+ ENDWITH && THIS
+ ENDIF
+
+ CATCH TO loEx
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+
+ ENDTRY
+
+ RETURN
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE analizarBloque_Reportes
+ *------------------------------------------------------
+ *-- Analiza el bloque
+ *------------------------------------------------------
+ LPARAMETERS toReport, tcLine, taCodeLines, I, tnCodeLines
+
+ #IF .F.
+ LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG'
+ #ENDIF
+
+ TRY
+ LOCAL llBloqueEncontrado, lcComment, lcMetadatos, luValor ;
+ , laPropsAndValues(1,2), lnPropsAndValues_Count ;
+ , loReg
+
+ IF LEFT( tcLine, LEN(C_TAG_REPORTE) + 1 ) == '<' + C_TAG_REPORTE + ''
+ llBloqueEncontrado = .T.
+ loReg = THIS.emptyRecord()
+
+ WITH THIS
+ FOR I = I + 1 TO tnCodeLines
+ lcComment = ''
+ .set_Line( @tcLine, @taCodeLines, I )
+
+ DO CASE
+ CASE LEFT( tcLine, LEN(C_TAG_REPORTE_F) ) == C_TAG_REPORTE_F
+ I = I + 1
+ EXIT
+
+ CASE .lineIsOnlyCommentAndNoMetadata( @tcLine, @lcComment )
+ LOOP && Saltear comentarios
+
+ *CASE UPPER( LEFT( tcLine, 14 ) ) == 'BUILD PROJECT '
+ * LOOP
+
+ CASE .analizarBloque_platform( toReport, @tcLine, @taCodeLines, @I, @tnCodeLines, @loReg )
+
+ CASE .analizarBloque_CDATA_inline( toReport, @tcLine, @taCodeLines, @I, tnCodeLines, @loReg, 'picture' )
+
+ CASE .analizarBloque_CDATA_inline( toReport, @tcLine, @taCodeLines, @I, tnCodeLines, @loReg, 'tag' )
+
+ CASE .analizarBloque_CDATA_inline( toReport, @tcLine, @taCodeLines, @I, tnCodeLines, @loReg, 'tag2' )
+
+ CASE .analizarBloque_CDATA_inline( toReport, @tcLine, @taCodeLines, @I, tnCodeLines, @loReg, 'penred' )
+
+ *CASE .analizarBloque_CDATA_inline( toReport, @tcLine, @taCodeLines, @I, tnCodeLines, @loReg, 'style' )
+
+ *CASE .analizarBloque_CDATA_inline( toReport, @tcLine, @taCodeLines, @I, tnCodeLines, @loReg, 'expr' )
+
+ CASE .analizarBloque_CDATA_inline( toReport, @tcLine, @taCodeLines, @I, tnCodeLines, @loReg, 'user' )
+
+ ENDCASE
+ ENDFOR
+ ENDWITH && THIS
+
+ I = I - 1
+ toReport.Add( loReg )
+ ENDIF
+
+ CATCH TO loEx
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+
+ ENDTRY
+
+ RETURN llBloqueEncontrado
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE analizarBloque_platform
+ *------------------------------------------------------
+ *-- Analiza el bloque
+ *------------------------------------------------------
+ LPARAMETERS toReport, tcLine, taCodeLines, I, tnCodeLines, toReg
+
+ #IF .F.
+ LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG'
+ #ENDIF
+
+ TRY
+ LOCAL llBloqueEncontrado, X, lnPos, lnPos2, lcValue, lnLenPropName, laProps(1) ;
+ , lcComment, lcMetadatos, luValor ;
+ , laPropsAndValues(1,2), lnPropsAndValues_Count
+
+ IF LOWER( LEFT(tcLine, 10) ) == 'platform="'
+ llBloqueEncontrado = .T.
+ lnLastPos = 1
+
+ FOR X = 1 TO AMEMBERS( laProps, toReg, 0 )
+ lnPos = AT( LOWER(laProps(X)) + '="', tcLine )
+
+ IF lnPos > 0
+ lnLenPropName = LEN(laProps(X))
+ lnPos2 = AT( '"', SUBSTR( tcLine, lnPos + lnLenPropName + 2 ) )
+ lcValue = SUBSTR( tcLine, lnPos + lnLenPropName + 2, lnPos2 - 1 )
+ ADDPROPERTY( toReg, laProps(X), lcValue )
+ ENDIF
+ ENDFOR
+
+ ENDIF
+
+ CATCH TO loEx
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+
+ ENDTRY
+
+ RETURN llBloqueEncontrado
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE analizarBloque_CDATA_inline
+ *------------------------------------------------------
+ *-- Analiza el bloque
+ *------------------------------------------------------
+ LPARAMETERS toReport, tcLine, taCodeLines, I, tnCodeLines, toReg, tcPropName
+
+ #IF .F.
+ LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG'
+ #ENDIF
+
+ TRY
+ LOCAL llBloqueEncontrado, lcValue, loEx as Exception
+
+ IF LEFT(tcLine, 9) == '<' + tcPropName + '>'
+ llBloqueEncontrado = .T.
+
+ lcValue = STREXTRACT( tcLine, C_DATA_I, C_DATA_F )
+ ADDPROPERTY( toReg, tcPropName, lcValue )
+ ENDIF
+
+ CATCH TO loEx
+ IF loEx.ErrorNo = 1470 && Incorrect property name.
+ loEx.UserValue = 'PropName=[' + TRANSFORM(tcPropName) + '], Value=[' + TRANSFORM(lcValue) + ']'
+ ENDIF
+
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+
+ ENDTRY
+
+ RETURN llBloqueEncontrado
+ ENDPROC
+
+
+ENDDEFINE
+
+
+*******************************************************************************************************************
+DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
+ #IF .F.
+ LOCAL THIS AS c_conversor_bin_a_prg OF 'FOXBIN2PRG.PRG'
+ #ENDIF
+ _MEMBERDATA = [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + []
+
+
+ *******************************************************************************************************************
+ PROCEDURE Convertir
+ LPARAMETERS toModulo, toEx AS EXCEPTION
+ DODEFAULT( @toModulo, @toEx )
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE get_ADD_OBJECT_METHODS
+ LPARAMETERS toRegObj, toRegClass, tcMethods, taMethods, taCode, tnMethodCount
+
+ TRY
+ THIS.SortMethod( toRegObj.METHODS, @taMethods, @taCode, '', @tnMethodCount )
+
+ *-- Ubico los métodos protegidos y les cambio la definición.
+ *-- Los métodos se deben generar con la ruta completa, porque si no es imposible saber a que objeto corresponden,
+ *-- o si son de la clase.
+ IF tnMethodCount > 0 THEN
+ FOR I = 1 TO tnMethodCount
+ IF EMPTY(toRegObj.PARENT)
+ tcMethodName = toRegObj.OBJNAME + '.' + taMethods(I,1)
+ ELSE
+ DO CASE
+ CASE '.' $ toRegObj.PARENT
+ tcMethodName = SUBSTR(toRegObj.PARENT, AT('.', toRegObj.PARENT) + 1) + '.' + toRegObj.OBJNAME + '.' + taMethods(I,1)
+
+ CASE LEFT(toRegObj.PARENT + '.', LEN( toRegClass.OBJNAME + '.' ) ) == toRegClass.OBJNAME + '.'
+ tcMethodName = toRegObj.OBJNAME + '.' + taMethods(I,1)
+
+ OTHERWISE
+ tcMethodName = toRegObj.PARENT + '.' + toRegObj.OBJNAME + '.' + taMethods(I,1)
+
+ ENDCASE
+ ENDIF
+
+ *-- Genero el método SIN indentar, ya que se hace luego
+ TEXT TO tcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <<'PROCEDURE'>> <>
+ <>
+ <<'ENDPROC'>>
+ ENDTEXT
+ ENDFOR
+ ENDIF
+
+ CATCH TO loEx
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+ ENDTRY
+
+ RETURN
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE get_NombresObjetosOLEPublic
+ LPARAMETERS ta_NombresObjsOle
+ *-- Obtengo los objetos "OLEPublic"
+ SELECT PADR(OBJNAME,100) OBJNAME ;
+ FROM TABLABIN ;
+ WHERE TABLABIN.PLATFORM = "COMMENT" AND TABLABIN.RESERVED2 == "OLEPublic" ;
+ ORDER BY 1 ;
+ INTO ARRAY ta_NombresObjsOle
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE get_PropsAndCommentsFrom_RESERVED3
+ *-- Sirve para el memo RESERVED3
+ *---------------------------------------------------------------------------------------------------
+ * PARÁMETROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT)
+ * tcMemo (v! IN ) Contenido de un campo MEMO
+ * tlSort (v? IN ) Indica si se deben ordenar alfabéticamente los nombres
+ * taPropsAndComments (@! OUT) Array con las propiedades y comentarios
+ * tnPropsAndComments_Count (@! OUT) Cantidad de propiedades
+ * tcSortedMemo (@? OUT) Contenido del campo memo ordenado
+ *---------------------------------------------------------------------------------------------------
+ LPARAMETERS tcMemo, tlSort, taPropsAndComments, tnPropsAndComments_Count, tcSortedMemo
+ EXTERNAL ARRAY taPropsAndComments
+
+ TRY
+ LOCAL laLines(1), I, lnPos, loEx AS EXCEPTION
+ tcSortedMemo = ''
+ tnPropsAndComments_Count = ALINES(laLines, tcMemo, 1+4)
+
+ IF tnPropsAndComments_Count <= 1 AND EMPTY(laLines)
+ tnPropsAndComments_Count = 0
+ EXIT
+ ENDIF
+
+ DIMENSION taPropsAndComments(tnPropsAndComments_Count,2)
+
+ FOR I = 1 TO tnPropsAndComments_Count
+ lnPos = AT(' ', laLines(I)) && Un espacio separa la propiedad de su comentario (si tiene)
+
+ IF lnPos = 0
+ taPropsAndComments(I,1) = laLines(I)
+ taPropsAndComments(I,2) = ''
+ ELSE
+ taPropsAndComments(I,1) = LEFT( laLines(I), lnPos - 1 )
+ taPropsAndComments(I,2) = SUBSTR( laLines(I), lnPos + 1 )
+ ENDIF
+ ENDFOR
+
+ IF tlSort AND THIS.l_PropSort_Enabled
+ ASORT( taPropsAndComments, 1, -1, 0, 1 )
+ ENDIF
+
+ CATCH TO loEx
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+ ENDTRY
+
+ RETURN
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE get_PropsAndValuesFrom_PROPERTIES
+ *-- Sirve para el memo PROPERTIES
+ *---------------------------------------------------------------------------------------------------
+ * KNOWLEDGE BASE:
+ * 29/11/2013 FDBOZZO En un pageframe, si las props.nativas del mismo no están antes que las de
+ * los objetos contenidos, causa un error. Se deben ordenar primero las
+ * props.nativas (sin punto) y luego las de los objetos (con punto)
+ *
+ *---------------------------------------------------------------------------------------------------
+ * PARÁMETROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT)
+ * tcMemo (v! IN ) Contenido de un campo MEMO
+ * tnSort (v? IN ) Indica si se deben ordenar alfabéticamente los objetos y props (1), o no (0)
+ * taPropsAndValues (@! OUT) Array con las propiedades y comentarios
+ * tnPropsAndValues_Count (@! OUT) Cantidad de propiedades
+ * tcSortedMemo (@? OUT) Contenido del campo memo ordenado
+ *---------------------------------------------------------------------------------------------------
+ LPARAMETERS tcMemo, tnSort, taPropsAndValues, tnPropsAndValues_Count, tcSortedMemo
+ EXTERNAL ARRAY taPropsAndValues
+ TRY
+ LOCAL laItems(1), I, X, lnLenAcum, lnPosEQ, lcPropName, lnLenVal, lcValue, lcMethods
+ tcSortedMemo = ''
+ tnPropsAndValues_Count = 0
+
+ IF NOT EMPTY(m.tcMemo)
+ lnItemCount = ALINES(laItems, m.tcMemo, 0, CR_LF) && Específicamente CR+LF para que no reconozca los CR o LF por separado
+ X = 0
+
+ IF lnItemCount <= 1 AND EMPTY(laItems)
+ lnItemCount = 0
+ EXIT
+ ENDIF
+
+
+ *-- 1) OBTENCIÓN Y SEPARACIÓN DE PROPIEDADES Y VALORES
+ *-- Crear un array con los valores especiales que pueden estar repartidos entre varias lineas
+ FOR I = 1 TO m.lnItemCount
+ IF EMPTY( laItems(I) )
+ LOOP
+ ENDIF
+
+ X = X + 1
+ DIMENSION taPropsAndValues(X,2)
+
+ IF C_MPROPHEADER $ laItems(I)
+ *-- Solo entrará por aquí cuando se evalúe una propiedad de PROPERTIES con un valor especial (largo)
+ lnLenAcum = 0
+ lnPosEQ = AT( '=', laItems(I) )
+ lcPropName = LEFT( laItems(I), lnPosEQ - 2 )
+ lnLenVal = INT( VAL( SUBSTR( laItems(I), lnPosEQ + 2 + 517, 8) ) )
+ lcValue = SUBSTR( laItems(I), lnPosEQ + 2 + 517 + 8 )
+
+ IF LEN( lcValue ) < lnLenVal
+ *-- Como el valor es multi-línea, debo agregarle los CR_LF que le quitó el ALINES()
+ FOR I = I + 1 TO m.lnItemCount
+ lcValue = lcValue + CR_LF + laItems(I)
+
+ IF LEN( lcValue ) >= lnLenVal
+ EXIT
+ ENDIF
+ ENDFOR
+
+ lcValue = C_FB2P_VALUE_I + CR_LF + lcValue + CR_LF + C_FB2P_VALUE_F
+ ELSE
+ lcValue = C_FB2P_VALUE_I + lcValue + C_FB2P_VALUE_F
+ ENDIF
+
+ *-- Es un valor especial, por lo que se encapsula en un marcador especial
+ taPropsAndValues(X,1) = lcPropName
+ taPropsAndValues(X,2) = THIS.normalizarValorPropiedad( lcPropName, lcValue, '' )
+
+ ELSE
+ *-- Propiedad normal
+ *-- SI HACE FALTA QUE LOS MÉTODOS ESTÉN AL FINAL, DESCOMENTAR ESTO (Y EL DE MÁS ABAJO)
+ *IF LEFT(laItems(I), 1) == '*' && Only Reserved3 have this
+ * LOOP
+ *ENDIF
+
+ lnPosEQ = AT( '=', laItems(I) )
+ taPropsAndValues(X,1) = LEFT( laItems(I), lnPosEQ - 2 )
+ taPropsAndValues(X,2) = THIS.normalizarValorPropiedad( taPropsAndValues(X,1), LTRIM( SUBSTR( laItems(I), lnPosEQ + 2 ) ), '' )
+ ENDIF
+ ENDFOR
+
+
+ tnPropsAndValues_Count = X
+ lcMethods = ''
+
+
+ *-- 2) SORT
+ THIS.sortPropsAndValues( @taPropsAndValues, tnPropsAndValues_Count, tnSort )
+
+
+ *-- Agregar propiedades primero
+ FOR I = 1 TO m.tnPropsAndValues_Count
+ *-- SI HACE FALTA QUE LOS MÉTODOS ESTÉN AL FINAL, DESCOMENTAR ESTO (Y EL DE MÁS ARRIBA)
+ *IF LEFT(taPropsAndValues(I), 1) == '*' && Only Reserved3 have this
+ * lcMethods = m.lcMethods + m.taPropsAndValues(I,1) + ' = ' + m.taPropsAndValues(I,2) + CR_LF
+ * LOOP
+ *ENDIF
+
+ tcSortedMemo = m.tcSortedMemo + m.taPropsAndValues(I,1) + ' = ' + m.taPropsAndValues(I,2) + CR_LF
+ ENDFOR
+
+ *-- Agregar métodos al final
+ tcSortedMemo = m.tcSortedMemo + m.lcMethods
+
+ ENDIF
+
+ CATCH TO loEx
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+ ENDTRY
+
+ RETURN
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE get_PropsFrom_PROTECTED
+ *-- Sirve para el memo PROTECTED
+ *---------------------------------------------------------------------------------------------------
+ * PARÁMETROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT)
+ * tcMemo (v! IN ) Contenido de un campo MEMO
+ * tlSort (v? IN ) Indica si se deben ordenar alfabéticamente los nombres
+ * taProtected (@! OUT) Array con las propiedades y comentarios
+ * tnProtected_Count (@! OUT) Cantidad de propiedades
+ * tcSortedMemo (@? OUT) Contenido del campo memo ordenado
+ *---------------------------------------------------------------------------------------------------
+ LPARAMETERS tcMemo, tlSort, taProtected, tnProtected_Count, tcSortedMemo
+ EXTERNAL ARRAY taProtected
+
+ tcSortedMemo = ''
+ tnProtected_Count = ALINES(taProtected, tcMemo, 1+4)
+
+ IF tnProtected_Count <= 1 AND EMPTY(taProtected)
+ tnProtected_Count = 0
+ ELSE
+ IF tlSort AND THIS.l_PropSort_Enabled
+ ASORT( taProtected, 1, -1, 0, 1 )
+ ENDIF
+
+ FOR I = 1 TO tnProtected_Count
+ tcSortedMemo = tcSortedMemo + taProtected(I) + CR_LF
+ ENDFOR
+ ENDIF
+
+ RETURN
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE IndentarMemo
+ LPARAMETERS tcMethod, tcIndentation
+ *-- INDENTA EL CÓDIGO DE UN MÉTODO DADO Y QUITA LA CABECERA DE MÉTODO (PROCEDURE/ENDPROC) SI LA ENCUENTRA
+ TRY
+ LOCAL I, lcMethod, llProcedure, lnInicio, lnFin
+ lcMethod = ''
+ llProcedure = ( LEFT(tcMethod,10) == 'PROCEDURE ' ;
+ OR LEFT(tcMethod,17) == 'HIDDEN PROCEDURE ' ;
+ OR LEFT(tcMethod,20) == 'PROTECTED PROCEDURE ' )
+ lnInicio = 1
+ lnFin = ALINES(laLineas, tcMethod)
+ IF VARTYPE(tcIndentation) # 'C'
+ tcIndentation = ''
+ ENDIF
+
+ *-- Si encuentra la cabecera de un PROCEDURE, la saltea
+ IF llProcedure
+ lnInicio = 2
+ lnFin = lnFin - 1
+ ENDIF
+
+ FOR I = lnInicio TO lnFin
+ *-- TEXT/ENDTEXT aquí da error 2044 de recursividad. No usar.
+ lcMethod = lcMethod + CR_LF + tcIndentation + laLineas(I)
+ ENDFOR
+
+ lcMethod = SUBSTR(lcMethod,3) && Quito el primer ENTER (CR+LF)
+
+ CATCH TO loEx
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+ ENDTRY
+
+ RETURN lcMethod
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE MemoInOneLine( tcMethod )
+ TRY
+ LOCAL lcLine, I
+ lcLine = ''
+
+ IF NOT EMPTY(tcMethod)
+ FOR I = 1 TO ALINES(laLines, m.tcMethod, 0)
+ lcLine = lcLine + ', ' + laLines(I)
+ ENDFOR
+
+ lcLine = SUBSTR(lcLine, 3)
+ ENDIF
+
+ CATCH TO loEx
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+ ENDTRY
+
+ RETURN lcLine
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE set_MultilineMemoWithAddObjectProperties
+ LPARAMETERS taPropsAndValues, tnPropCount, tcLeftIndentation, tlNormalizeLine
+ EXTERNAL ARRAY taPropsAndValues
+
+ TRY
+ LOCAL lcLine, I, lcComentarios, laLines(1), lcFinDeLinea_Coma_PuntoComa_CR
+ lcLine = ''
+ lcFinDeLinea = ', ;' + CR_LF
+
+ IF tnPropCount > 0
+ IF VARTYPE(tcLeftIndentation) # 'C'
+ tcLeftIndentation = ''
+ ENDIF
+
+ FOR I = 1 TO tnPropCount
+ lcLine = lcLine + tcLeftIndentation + taPropsAndValues(I,1) + ' = ' + taPropsAndValues(I,2) + lcFinDeLinea
+ ENDFOR
+
+ *-- Quito el ", ;" final
+ lcLine = tcLeftIndentation + SUBSTR(lcLine, 1 + LEN(tcLeftIndentation), LEN(lcLine) - LEN(tcLeftIndentation) - LEN(lcFinDeLinea))
+ ENDIF
+
+ CATCH TO loEx
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+ ENDTRY
+
+ RETURN lcLine
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE SortMethod
+ LPARAMETERS tcMethod, taMethods, taCode, tcSorted, tnMethodCount
+ *-- 29/10/2013 Fernando D. Bozzo
+ *-- Se tiene en cuenta la posibilidad de que haya un PROC/ENDPROC dentro de un TEXT/ENDTEXT
+ *-- cuando es usado en un generador de código o similar.
+ EXTERNAL ARRAY taMethods, taCode
+
+ *-- ESTRUCTURA DE LOS ARRAYS CREADOS:
+ *-- taMethods[1,3]
+ *-- Nombre Método
+ *-- Posición Original
+ *-- Tipo (HIDDEN/PROTECTED/NORMAL)
+ *-- taCode[1]
+ *-- Bloque de código del método en su posición original
+ TRY
+ LOCAL lnLineCount, laLine(1), I, lnTextNodes, tcSorted
+ LOCAL loEx AS EXCEPTION
+ DIMENSION taMethods(1,3)
+ STORE '' TO taMethods, m.tcSorted, taCode
+ tnMethodCount = 0
+
+ IF NOT EMPTY(m.tcMethod) AND LEFT(m.tcMethod,9) == "ENDPROC"+CHR(13)+CHR(10)
+ tcMethod = SUBSTR(m.tcMethod,10)
+ ENDIF
+
+ IF NOT EMPTY(m.tcMethod)
+ DIMENSION laLine(1), taMethods(1,3)
+ STORE '' TO laLine, taMethods, taCode
+ STORE 0 TO tnMethodCount, lnTextNodes
+ lnLineCount = ALINES(laLine, m.tcMethod) && NO aplicar nungún formato ni limpieza, que es el CÓDIGO FUENTE
+
+ *-- Delete beginning empty lines before first "PROCEDURE", that is the first not empty line.
+ FOR I = 1 TO lnLineCount
+ IF NOT EMPTY(laLine(I))
+ IF I > 1
+ FOR X = I-1 TO 1 STEP -1
+ ADEL(laLine, X)
+ ENDFOR
+ lnLineCount = lnLineCount - I + 1
+ DIMENSION laLine(lnLineCount)
+ ENDIF
+ EXIT
+ ENDIF
+ ENDFOR
+
+ *-- Delete ending empty lines after last "ENDPROC", that is the last not empty line.
+ FOR I = lnLineCount TO 1 STEP -1
+ IF EMPTY(laLine(I))
+ ADEL(laLine, I)
+ ELSE
+ IF I < lnLineCount
+ lnLineCount = I
+ DIMENSION laLine(lnLineCount)
+ ENDIF
+ EXIT
+ ENDIF
+ ENDFOR
+
+ *-- Analyze and count line methods, get method names and consolidate block code
+ FOR I = 1 TO lnLineCount
+ DO CASE
+ CASE LEFT(laLine(I), 4) == C_TEXT
+ lnTextNodes = lnTextNodes + 1
+ taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(I) + CR_LF
+
+ CASE LEFT(laLine(I), 7) == C_ENDTEXT
+ lnTextNodes = lnTextNodes - 1
+ taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(I) + CR_LF
+
+ CASE lnTextNodes = 0 AND LEFT(laLine(I), 10) == 'PROCEDURE '
+ tnMethodCount = tnMethodCount + 1
+ DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount)
+ taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(laLine(I), 11) )
+ taMethods(tnMethodCount, 2) = tnMethodCount
+ taMethods(tnMethodCount, 3) = ''
+ taCode(tnMethodCount) = laLine(I) + CR_LF
+
+ CASE lnTextNodes = 0 AND LEFT(laLine(I), 17) == 'HIDDEN PROCEDURE '
+ tnMethodCount = tnMethodCount + 1
+ DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount)
+ taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(laLine(I), 18) )
+ taMethods(tnMethodCount, 2) = tnMethodCount
+ taMethods(tnMethodCount, 3) = 'HIDDEN '
+ taCode(tnMethodCount) = laLine(I) + CR_LF
+
+ CASE lnTextNodes = 0 AND LEFT(laLine(I), 20) == 'PROTECTED PROCEDURE '
+ tnMethodCount = tnMethodCount + 1
+ DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount)
+ taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(laLine(I), 21) )
+ taMethods(tnMethodCount, 2) = tnMethodCount
+ taMethods(tnMethodCount, 3) = 'PROTECTED '
+ taCode(tnMethodCount) = laLine(I) + CR_LF
+
+ CASE lnTextNodes = 0 AND LEFT(laLine(I), 7) == 'ENDPROC'
+ taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(I) + CR_LF
+
+ CASE tnMethodCount = 0 && Skip empty lines before methods begin
+
+ OTHERWISE && Method Code
+ taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(I) + CR_LF
+
+ ENDCASE
+ ENDFOR
+
+ *-- Alphabetical ordering of methods
+ IF THIS.l_MethodSort_Enabled
+ ASORT(taMethods,1,-1,0,1)
+ ENDIF
+
+ FOR I = 1 TO tnMethodCount
+ m.tcSorted = m.tcSorted + taCode(taMethods(I,2))
+ ENDFOR
+
+ ENDIF
+
+ CATCH TO loEx
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+ ENDTRY
+
+ RETURN
+ ENDPROC && SordMethod
+
+
+ *******************************************************************************************************************
+ PROCEDURE write_ADD_OBJECTS_WithProperties
+ LPARAMETERS toRegObj
+
+ #IF .F.
+ LOCAL toRegObj AS CL_OBJETO OF 'FOXBIN2PRG.PRG'
+ #ENDIF
+
+ TRY
+ LOCAL lcMemo, laPropsAndValues(1,2), lnPropsAndValues_Count
+
+ *-- Defino los objetos a cargar
+ THIS.get_PropsAndValuesFrom_PROPERTIES( toRegObj.PROPERTIES, 1, @laPropsAndValues, @lnPropsAndValues_Count, @lcMemo )
+ *lcMemo = THIS.set_MultilineMemoWithAddObjectProperties( lcMemo, C_TAB + C_TAB, .T. )
+ lcMemo = THIS.set_MultilineMemoWithAddObjectProperties( @laPropsAndValues, @lnPropsAndValues_Count, C_TAB + C_TAB, .T. )
+
+ IF '.' $ toRegObj.PARENT
+ *-- Este caso: clase.objeto.objeto ==> se quita clase
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <>ADD OBJECT '<>.<>' AS <> <<>>
+ ENDTEXT
+ ELSE
+ *-- Este caso: objeto
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <>ADD OBJECT '<>' AS <> <<>>
+ ENDTEXT
+ ENDIF
+
+ IF NOT EMPTY(lcMemo)
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ WITH ;
+ <>
+ ENDTEXT
+ ENDIF
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <><> <<>>
+ ENDTEXT
+
+ IF NOT EMPTY(toRegObj.CLASSLOC)
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ ClassLib="<>" <<>>
+ ENDTEXT
+ ENDIF
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2+4+8
+ BaseClass="<>" UniqueID="<>"
+ Timestamp="<>" ZOrder="<>" <<>>
+ ENDTEXT
+
+ *-- Agrego metainformación para objetos OLE
+ IF toRegObj.BASECLASS == 'olecontrol'
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ OLEObject="<>" CheckSum="<>" <<>>
+ ENDTEXT
+ ENDIF
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ <>
+
+ ENDTEXT
+
+ CATCH TO loEx
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+ ENDTRY
+
+ RETURN
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE write_ALL_OBJECT_METHODS
+ LPARAMETERS tcMethods
+
+ *-- Finalmente, todos los métodos los ordeno y escribo juntos
+ LOCAL laMethods(1), laCode(1), lnMethodCount, I
+
+ IF NOT EMPTY(tcMethods)
+ DIMENSION laMethods(1,3)
+ THIS.SortMethod( @tcMethods, @laMethods, @laCode, '', @lnMethodCount )
+
+ FOR I = 1 TO lnMethodCount
+ *-- Genero los métodos indentados
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <><>PROCEDURE <>
+ <>
+ <>ENDPROC
+
+ ENDTEXT
+ ENDFOR
+ ENDIF
+
+ RETURN
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE write_CLASS_METHODS
+ LPARAMETERS tnMethodCount, taMethods, taCode, taProtected, taPropsAndComments
+ *-- DEFINIR MÉTODOS DE LA CLASE
+ *-- Ubico los métodos protegidos y les cambio la definición
+ EXTERNAL ARRAY taMethods, taCode, taProtected, taPropsAndComments
+
+ TRY
+ LOCAL lcMethod, lnProtectedItem, lnCommentRow, lcProcDef, lcMethods
+ STORE '' TO lcMethod, lcProcDef, lcMethods
+
+ IF tnMethodCount > 0 THEN
+ FOR I = 1 TO tnMethodCount
+ lcMethod = CHRTRAN( taMethods(I,1), '^', '' )
+ lnProtectedItem = ASCAN( taProtected, taMethods(I,1), 1, 0, 0, 0)
+ lnCommentRow = ASCAN( taPropsAndComments, '*' + lcMethod, 1, 0, 1, 8)
+
+ DO CASE
+ CASE lnProtectedItem = 0
+ *-- Método común
+ lcProcDef = 'PROCEDURE'
+
+ CASE taProtected(lnProtectedItem) == taMethods(I,1)
+ *-- Método protegido
+ lcProcDef = 'PROTECTED PROCEDURE'
+
+ CASE taProtected(lnProtectedItem) == taMethods(I,1) + '^'
+ *-- Método oculto
+ lcProcDef = 'HIDDEN PROCEDURE'
+
+ ENDCASE
+
+ *-- Nombre del método
+ TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <><> <>
+ ENDTEXT
+
+ *-- Comentarios del método (si tiene)
+ IF lnCommentRow > 0 AND NOT EMPTY(taPropsAndComments(lnCommentRow,2))
+ TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ <><>&& <>
+ ENDTEXT
+ ENDIF
+
+ *-- Código del método
+ *TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ * <>
+ * <>ENDPROC
+
+ *ENDTEXT
+ lcMethods = lcMethods + CR_LF + THIS.IndentarMemo( taCode(taMethods(I,2)), C_TAB + C_TAB )
+ lcMethods = lcMethods + CR_LF + C_TAB + 'ENDPROC' + CR_LF
+ ENDFOR
+
+ *TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ * <>
+ *ENDTEXT
+ C_FB2PRG_CODE = C_FB2PRG_CODE + C_TAB + lcMethods &&+ CR_LF
+
+ ENDIF
+
+ CATCH TO loEx
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+ ENDTRY
+
+ RETURN
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE write_CLASS_PROPERTIES
+ LPARAMETERS toRegClass, taPropsAndValues, taPropsAndComments, taProtected
+
+ EXTERNAL ARRAY taPropsAndValues, taPropsAndComments
+
+ TRY
+ LOCAL lnPropsAndValues_Count, lcHiddenProp, lcProtectedProp, lcPropsMethodsDefd, lnPropsAndComments_Count, I ;
+ , lcPropName, lnProtectedItem, lcComentarios
+
+ WITH THIS
+ *-- DEFINIR PROPIEDADES ( HIDDEN, PROTECTED, *DEFINED_PAM )
+ DIMENSION taProtected(1)
+ STORE '' TO lcHiddenProp, lcProtectedProp, lcPropsMethodsDefd
+ THIS.get_PropsAndValuesFrom_PROPERTIES( toRegClass.PROPERTIES, 1, @taPropsAndValues, @lnPropsAndValues_Count, '' )
+ THIS.get_PropsAndCommentsFrom_RESERVED3( toRegClass.RESERVED3, .T., @taPropsAndComments, @lnPropsAndComments_Count, '' )
+ THIS.get_PropsFrom_PROTECTED( toRegClass.PROTECTED, .T., @taProtected, 0, '' )
+
+ IF lnPropsAndValues_Count > 0 THEN
+ *-- Recorro las propiedades (campo Properties) para ir conformando
+ *-- las definiciones HIDDEN y PROTECTED
+ FOR I = 1 TO lnPropsAndValues_Count
+ IF EMPTY(taPropsAndValues(I,1))
+ LOOP
+ ENDIF
+
+ lnProtectedItem = ASCAN(taProtected, taPropsAndValues(I,1), 1, 0, 0, 0)
+
+ DO CASE
+ CASE lnProtectedItem = 0
+ *-- Propiedad común
+
+ CASE taProtected(lnProtectedItem) == taPropsAndValues(I,1)
+ *-- Propiedad protegida
+ lcProtectedProp = lcProtectedProp + ',' + taPropsAndValues(I,1)
+
+ CASE taProtected(lnProtectedItem) == taPropsAndValues(I,1) + '^'
+ *-- Propiedad oculta
+ lcHiddenProp = lcHiddenProp + ',' + taPropsAndValues(I,1)
+
+ ENDCASE
+ ENDFOR
+
+ THIS.write_DEFINED_PAM( @taPropsAndComments, lnPropsAndComments_Count )
+
+ THIS.write_HIDDEN_Properties( @lcHiddenProp )
+
+ THIS.write_PROTECTED_Properties( @lcProtectedProp )
+
+ *-- Escribo las propiedades de la clase y sus comentarios (los comentarios aquí son redundantes)
+ FOR I = 1 TO ALEN(taPropsAndValues, 1)
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <><> = <>
+ ENDTEXT
+
+ lnComment = ASCAN( taPropsAndComments, taPropsAndValues(I,1), 1, 0, 1, 8)
+
+ IF lnComment > 0 AND NOT EMPTY(taPropsAndComments(lnComment,2))
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ <><>&& <>
+ ENDTEXT
+ ENDIF
+ ENDFOR
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+
+ ENDTEXT
+ ENDIF
+ ENDWITH && THIS
+
+ CATCH TO loEx
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+ ENDTRY
+
+ RETURN
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE write_DEFINED_PAM
+ *-- Escribo propiedades DEFINED (Reserved3) en este formato:
+
+ *
+ *m: *metodovacio_con_comentarios && Este método no tiene código, pero tiene comentarios. A ver que pasa!
+ *m: *mimetodo && Mi metodo
+ *p: prop1 && Mi prop 1
+ *p: prop_especial_cr &&
+ *a: ^array_1_d[1,0] && Array 1 dimensión (1)
+ *a: ^array_2_d[1,2] && Array una dimension (1,2)
+ *p: _memberdata && XML Metadata for customizable properties
+ *
+
+ LPARAMETERS taPropsAndComments, tnPropsAndComments_Count
+
+ IF tnPropsAndComments_Count > 0
+ LOCAL I, lcPropsMethodsDefd
+ lcPropsMethodsDefd = ''
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <><>
+ ENDTEXT
+
+ FOR I = 1 TO tnPropsAndComments_Count
+ IF EMPTY(taPropsAndComments(I,1))
+ LOOP
+ ENDIF
+
+ lcType = LEFT( taPropsAndComments(I,1), 1 )
+ lcType = ICASE( lcType == '*', 'm' ;
+ , lcType == '^', 'a' ;
+ , 'p' )
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <><>*<>: <>
+ ENDTEXT
+
+ IF NOT EMPTY(taPropsAndComments(I,2))
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ <><><<'&'>><<'&'>> <>
+ ENDTEXT
+ ENDIF
+ ENDFOR
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <><>
+ ENDTEXT
+
+ ENDIF
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE write_DEFINE_CLASS
+ LPARAMETERS ta_NombresObjsOle, toRegClass
+
+ LOCAL lcOF_Classlib, llOleObject
+ lcOF_Classlib = ''
+ llOleObject = ( ASCAN( ta_NombresObjsOle, toRegClass.OBJNAME, 1, 0, 1, 8) > 0 )
+
+ IF NOT EMPTY(toRegClass.CLASSLOC)
+ lcOF_Classlib = 'OF "' + ALLTRIM(toRegClass.CLASSLOC) + '" '
+ ENDIF
+
+ *-- DEFINICIÓN DE LA CLASE ( DEFINE CLASS 'className' AS 'classType' [OF 'classLib'] [OLEPUBLIC] )
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <<'DEFINE CLASS'>> <> AS <> <>
+ ENDTEXT
+
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE write_DEFINE_CLASS_COMMENTS
+ LPARAMETERS toRegClass
+ *-- Comentario de la clase
+ IF NOT EMPTY(toRegClass.RESERVED7) THEN
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ <><><<'&'+'&'>> <>
+ ENDTEXT
+ ENDIF
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE write_ENDDEFINE_SiCorresponde
+ LPARAMETERS tnLastClass
+ IF tnLastClass = 1
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <<'ENDDEFINE'>>
+
+ ENDTEXT
+ ENDIF
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE write_INCLUDE
+ LPARAMETERS toReg
+ *-- #INCLUDE
+ IF NOT EMPTY(toReg.RESERVED8) THEN
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <>#INCLUDE "<>"
+ ENDTEXT
+ ENDIF
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE write_METADATA
+ LPARAMETERS toRegClass
+
+ *-- Agrego Metadatos de la clase (Baseclass, Timestamp, Scale, Uniqueid)
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+
+ ENDTEXT
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2+8
+ <><>
+ Baseclass="<>"
+ Timestamp="<>"
+ Scale="<>"
+ Uniqueid="<>"
+ ENDTEXT
+
+ IF NOT EMPTY(toRegClass.OLE2)
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2+4+8
+ OLEObject="<>" CheckSum="<>" <<>>
+ ENDTEXT
+ ENDIF
+
+ IF NOT EMPTY(toRegClass.RESERVED5)
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2+4+8
+ ProjectClassIcon="<>"
+ ENDTEXT
+ ENDIF
+
+ IF NOT EMPTY(toRegClass.RESERVED4)
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2+4+8
+ ClassIcon="<>"
+ ENDTEXT
+ ENDIF
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2+4+8
+ <>
+ ENDTEXT
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE write_HIDDEN_Properties
+ *-- Escribo la definición HIDDEN de propiedades
+ LPARAMETERS tcHiddenProp
+
+ IF NOT EMPTY(tcHiddenProp)
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <>HIDDEN <>
+ ENDTEXT
+ ENDIF
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE write_PROGRAM_HEADER
+ *-- Cabecera del PRG e inicio de DEF_CLASS
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ *--------------------------------------------------------------------------------------------------------------------------------------------------------
+ * (ES) AUTOGENERADO - ¡¡ATENCIÓN!! - ¡¡NO PENSADO PARA EJECUTAR!! USAR SOLAMENTE PARA INTEGRAR CAMBIOS Y ALMACENAR CON HERRAMIENTAS SCM!!
+ * (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!!
+ *--------------------------------------------------------------------------------------------------------------------------------------------------------
+ <> Version="<>" SourceFile="<>" Generated="<>" <> (Para uso con Visual FoxPro 9.0)
+ *
+ ENDTEXT
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE write_PROTECTED_Properties
+ *-- Escribo la definición PROTECTED de propiedades
+ LPARAMETERS tcProtectedProp
+
+ IF NOT EMPTY(tcProtectedProp)
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <>PROTECTED <>
+ ENDTEXT
+ ENDIF
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE write_CABECERA_REPORTE
+ LPARAMETERS toReg
+
+ TRY
+ LOCAL lc_TAG_REPORTE
+ lc_TAG_REPORTE_I = '<' + C_TAG_REPORTE + ' '
+ lc_TAG_REPORTE_F = '' + C_TAG_REPORTE + '>'
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <>
+ ENDTEXT
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <>platform="WINDOWS " uniqueid="<>" timestamp="<>" objtype="<>" <<>>
+ ENDTEXT
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ objcode="<>" name="<>" <<>>
+ ENDTEXT
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ vpos="<>" hpos="<>" height="<>" width="<>" <<>>
+ ENDTEXT
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ order="<>" unique="<>" comment="<>" <<>>
+ ENDTEXT
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ environ="<>" boxchar="<>" fillchar="<>" <<>>
+ ENDTEXT
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ pengreen="<>" penblue="<>" fillred="<>" fillgreen="<>" <<>>
+ ENDTEXT
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ fillblue="<>" pensize="<>" penpat="<>" fillpat="<>" <<>>
+ ENDTEXT
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ fontface="<>" fontstyle="<>" fontsize="<>" mode="<>" <<>>
+ ENDTEXT
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ ruler="<>" rulerlines="<>" grid="<>" gridv="<>" <<>>
+ ENDTEXT
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ gridh="<>" float="<>" stretch="<>" stretchtop="<>" <<>>
+ ENDTEXT
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ top="<>" bottom="<>" suptype="<>" suprest="<>" norepeat="<>" <<>>
+ ENDTEXT
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ resetrpt="<>" pagebreak="<>" colbreak="<>" resetpage="<>" <<>>
+ ENDTEXT
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ general="<>" spacing="<>" double="<>" swapheader="<>" <<>>
+ ENDTEXT
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ swapfooter="<>" ejectbefor="<>" ejectafter="<>" plain="<>" <<>>
+ ENDTEXT
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ summary="<>" addalias="<>" offset="<>" topmargin="<>" <<>>
+ ENDTEXT
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ botmargin="<>" totaltype="<>" resettotal="<>" resoid="<>" <<>>
+ ENDTEXT
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ curpos="<>" supalways="<>" supovflow="<>" suprpcol="<>" <<>>
+ ENDTEXT
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ supgroup="<>" supvalchng="<>" supexpr="<>" >
+ ENDTEXT
+
+ * <>tag="<>"
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <>>]]>
+ <>>]]>
+ <>>]]>
+ <>>]]>
+ <>