From 2dfb262a24987a21c7c7a898e7ad71c047317321 Mon Sep 17 00:00:00 2001 From: fernando Date: Mon, 2 Dec 2013 01:10:11 +0100 Subject: [PATCH] =?UTF-8?q?Changeset:=2014=20Changeset:=2014=20Refactoriza?= =?UTF-8?q?ci=C3=B3n=20total=20de=20generaci=C3=B3n=20de=20scx/scx/vc2/sc2?= =?UTF-8?q?=20y=20agregado=20de=20Unit=20Testing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- foxbin2prg.prg | 3251 ++++++++++++++++++++++++++++-------------------- 1 file changed, 1924 insertions(+), 1327 deletions(-) diff --git a/foxbin2prg.prg b/foxbin2prg.prg index 1c798ca..bd5a161 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -14,7 +14,7 @@ * * EL OBJETIVO ES PODER USARLO COMO REEMPLAZO DEL SCCTEXT.PRG, PODER HACER MERGE * DEL CÓDIGO DIRECTAMENTE SOBRE ESTE NUEVO PRG Y GUARDARLO EN UNA HERRAMIENTA DE SCM * COMO CVS O SIMILAR SIN NECESIDAD DE GUARDAR LOS BINARIOS ORIGINALES. -* * EXTENSIONES GENERADAS: VC2, SC2, PJ2 +* * EXTENSIONES GENERADAS: VC2, SC2, PJ2 (...o VCA, SCA, PJA con archivo conf.) * * CONFIGURACIÓN: SI SE CREA UN ARCHIVO FOXBIN2PRG.CFG, SE PUEDEN CAMBIAR LAS EXTENSIONES * PARA PODER USARLO CON SOURCESAFE PONIENDO LAS EQUIVALENCIAS ASÍ: * @@ -38,19 +38,20 @@ * 22/11/2013 FDBOZZO v1.1 Corrección de bugs * 23/11/2013 FDBOZZO v1.2 Corrección de bugs, limpieza de código y refactorización * 24/11/2013 FDBOZZO v1.3 Corrección de bugs, limpieza de código y refactorización +* 27/11/2013 FDBOZZO v1.4 Agregado soporte comodines *.VCX, configuración de extensiones (vca), parámetro p/log +* 27/11/2013 FDBOZZO v1.5 Arreglo bug que no generaba form completo +* 01/12/2013 FDBOZZO v1.6 Refactorización completa generación BIN y PRG, cambio de algoritmos, arreglo de bugs, Unit Testing con FoxUnit * *--------------------------------------------------------------------------------------------------- -* TESTEO Y REPORTE DE BUGS -* 23/11/2013 Luis Martínez En algunos forms solo se generaba el dataenvironment (arreglado en v.1.5) -* 27/11/2013 Fidel Charny Error en el guardado de ciertas propiedades de array -* +* TESTEO Y REPORTE DE BUGS (AGRADECIMIENTOS) +* 23/11/2013 Luis Martínez REPORTE BUG: En algunos forms solo se generaba el dataenvironment (arreglado en v.1.5) +* 27/11/2013 Fidel Charny REPORTE BUG: Error en el guardado de ciertas propiedades de array (arreglado en v.1.6) +* *--------------------------------------------------------------------------------------------------- * TRAMIENTOS ESPECIALES DE ASIGNACIONES DE PROPIEDADES: * PROPIEDAD ARREGLO Y EJEMPLO *------------------------- -------------------------------------------------------------------------------------- -* _memberdata Se le agregan los delimitadores [] para que compile -* props = Se le agrega "" para que compile. Ej: props = ==> props = "" -* props = BadCahrValue Se le agrega "" para que compile. Ej: props = ### ==> props = "###" +* _memberdata Se separan las definiciones en lineas para evitar una sola muy larga * *--------------------------------------------------------------------------------------------------- * PARÁMETROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT) @@ -69,49 +70,60 @@ LPARAMETERS tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErro *-- Fin / End *-- NO modificar! / Do NOT change! -#DEFINE C_CMT_I '*--' -#DEFINE C_CMT_F '--*' -#DEFINE C_METADATA_I '*< CLASSDATA:' -#DEFINE C_METADATA_F '/>' -#DEFINE C_OLE_I '*< OLE:' -#DEFINE C_OLE_F '/>' -#DEFINE C_DEFINED_PEM_I '*< DEFINED_PEM:' -#DEFINE C_DEFINED_PEM_F '/>' -#DEFINE C_END_OBJECT_I '*< END OBJECT:' -#DEFINE C_END_OBJECT_F '/>' -#DEFINE C_FB2PRG_META_I '*< FOXBIN2PRG:' -#DEFINE C_FB2PRG_META_F '/>' -#DEFINE C_DEFINE_CLASS 'DEFINE CLASS' -#DEFINE C_ENDDEFINE 'ENDDEFINE' -#DEFINE C_TEXT 'TEXT' -#DEFINE C_ENDTEXT 'ENDTEXT' -#DEFINE C_PROCEDURE 'PROCEDURE' -#DEFINE C_ENDPROC 'ENDPROC' -#DEFINE C_SRV_HEAD_I '*' -#DEFINE C_SRV_HEAD_F '*' -#DEFINE C_SRV_DATA_I '*' -#DEFINE C_SRV_DATA_F '*' -#DEFINE C_DEVINFO_I '*' -#DEFINE C_DEVINFO_F '*' -#DEFINE C_BUILDPROJ_I '*' -#DEFINE C_BUILDPROJ_F '*' -#DEFINE C_PROJPROPS_I '*' -#DEFINE C_PROJPROPS_F '*' -#DEFINE C_FILE_META_I '*< FileMetadata:' -#DEFINE C_FILE_META_F '/>' -#DEFINE C_FILE_CMTS_I '*' -#DEFINE C_FILE_CMTS_F '*' -#DEFINE C_FILE_EXCL_I '*' -#DEFINE C_FILE_EXCL_F '*' -#DEFINE C_FILE_TXT_I '*' -#DEFINE C_FILE_TXT_F '*' -#DEFINE C_FB2P_VALUE_I '' -#DEFINE C_FB2P_VALUE_F '' -#DEFINE C_TAB CHR(9) -#DEFINE C_CR CHR(13) -#DEFINE C_LF CHR(10) -#DEFINE CR_LF C_CR + C_LF -#DEFINE C_MPROPHEADER REPLICATE( CHR(1), 517 ) +#DEFINE C_CMT_I '*--' +#DEFINE C_CMT_F '--*' +#DEFINE C_METADATA_I '*< CLASSDATA:' +#DEFINE C_METADATA_F '/>' +#DEFINE C_LEN_METADATA_I LEN(C_METADATA_I) +#DEFINE C_OLE_I '*< OLE:' +#DEFINE C_OLE_F '/>' +#DEFINE C_LEN_OLE_I LEN(C_OLE_I) +#DEFINE C_DEFINED_PAM_I '*' +#DEFINE C_DEFINED_PAM_F '*' +#DEFINE C_LEN_DEFINED_PAM_I LEN(C_DEFINED_PAM_I) +#DEFINE C_LEN_DEFINED_PAM_F LEN(C_DEFINED_PAM_F) +#DEFINE C_END_OBJECT_I '*< END OBJECT:' +#DEFINE C_END_OBJECT_F '/>' +#DEFINE C_LEN_END_OBJECT_I LEN(C_END_OBJECT_I) +#DEFINE C_FB2PRG_META_I '*< FOXBIN2PRG:' +#DEFINE C_FB2PRG_META_F '/>' +#DEFINE C_DEFINE_CLASS 'DEFINE CLASS' +#DEFINE C_ENDDEFINE 'ENDDEFINE' +#DEFINE C_TEXT 'TEXT' +#DEFINE C_ENDTEXT 'ENDTEXT' +#DEFINE C_PROCEDURE 'PROCEDURE' +#DEFINE C_ENDPROC 'ENDPROC' +#DEFINE C_SRV_HEAD_I '*' +#DEFINE C_SRV_HEAD_F '*' +#DEFINE C_SRV_DATA_I '*' +#DEFINE C_SRV_DATA_F '*' +#DEFINE C_DEVINFO_I '*' +#DEFINE C_DEVINFO_F '*' +#DEFINE C_BUILDPROJ_I '*' +#DEFINE C_BUILDPROJ_F '*' +#DEFINE C_PROJPROPS_I '*' +#DEFINE C_PROJPROPS_F '*' +#DEFINE C_FILE_META_I '*< FileMetadata:' +#DEFINE C_FILE_META_F '/>' +#DEFINE C_FILE_CMTS_I '*' +#DEFINE C_FILE_CMTS_F '*' +#DEFINE C_FILE_EXCL_I '*' +#DEFINE C_FILE_EXCL_F '*' +#DEFINE C_FILE_TXT_I '*' +#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_TAB CHR(9) +#DEFINE C_CR CHR(13) +#DEFINE C_LF CHR(10) +#DEFINE CR_LF C_CR + C_LF +#DEFINE C_MPROPHEADER REPLICATE( CHR(1), 517 ) *-- Fin / End *-- From FOXPRO.H @@ -140,7 +152,14 @@ LOCAL lcSys16, I, lcPath, lnResp, lcFileSpec, lcFile, laFiles(1,5), laConfig(1), , loCnv AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' lnResp = 0 -IF _VFP.StartMode > 0 +SET DELETED ON +SET DATE YMD +SET HOURS TO 24 +SET CENTURY ON +SET SAFETY OFF +SET TABLEPROMPT OFF + +IF _VFP.STARTMODE > 0 SET ESCAPE OFF ENDIF @@ -154,7 +173,7 @@ ELSE loCnv = CREATEOBJECT("c_foxbin2prg") loCnv.l_Debug = (TRANSFORM(tcDebug)=='1') loCnv.l_ShowErrors = NOT (TRANSFORM(tcDontShowErrors) == '1') - + *-- Configuración lcConfigFile = FORCEEXT( lcSys16, 'CFG' ) @@ -164,12 +183,12 @@ ELSE FOR I = 1 TO ALINES( laConfig, FILETOSTR( lcConfigFile ), 1+4 ) lcExt = 'c_' + ALLTRIM( GETWORDNUM( laConfig(I), 1, '=' ) ) IF PEMSTATUS( loCnv, lcExt, 5 ) - loCnv.AddProperty( lcExt, UPPER( ALLTRIM( GETWORDNUM( laConfig(I), 2, '=' ) ) ) ) + loCnv.ADDPROPERTY( lcExt, UPPER( ALLTRIM( GETWORDNUM( laConfig(I), 2, '=' ) ) ) ) ENDIF ENDFOR ENDIF - - + + *-- Evaluación de FileSpec de entrada IF '*' $ JUSTSTEM( tc_InputFile ) *-- Se quieren todos los archivos de una extensión @@ -192,10 +211,6 @@ ELSE IF FILE( lcFile ) lnResp = loCnv.Convertir( lcFile ) - - *IF lnResp <> 0 - * EXIT - *ENDIF ENDIF ENDFOR @@ -276,6 +291,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM SET HOURS TO 24 SET CENTURY ON SET SAFETY OFF + SET TABLEPROMPT OFF ENDPROC @@ -302,50 +318,51 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM lnCodError = 0 THIS.c_InputFile = FULLPATH( tc_InputFile ) THIS.c_CurDir = JUSTPATH( THIS.c_InputFile ) + THIS.o_Conversor = NULL - IF NOT FILE(THIS.c_inputFile) - ERROR 'El archivo [' + THIS.c_inputFile + '] no existe' + IF NOT FILE(THIS.c_InputFile) + ERROR 'El archivo [' + THIS.c_InputFile + '] no existe' ENDIF - IF FILE( THIS.c_inputFile + '.ERR' ) + IF FILE( THIS.c_InputFile + '.ERR' ) TRY - ERASE ( THIS.c_inputFile + '.ERR' ) + ERASE ( THIS.c_InputFile + '.ERR' ) CATCH ENDTRY ENDIF DO CASE - CASE JUSTEXT(THIS.c_inputFile) = 'VCX' - THIS.c_OutputFile = FORCEEXT( THIS.c_inputFile, THIS.c_VC2 ) + CASE JUSTEXT(THIS.c_InputFile) = 'VCX' + THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, THIS.c_VC2 ) THIS.o_Conversor = CREATEOBJECT( 'c_conversor_vcx_a_prg' ) - CASE JUSTEXT(THIS.c_inputFile) = 'SCX' - THIS.c_outputFile = FORCEEXT( THIS.c_inputFile, THIS.c_SC2 ) + CASE JUSTEXT(THIS.c_InputFile) = 'SCX' + THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, THIS.c_SC2 ) THIS.o_Conversor = CREATEOBJECT( 'c_conversor_scx_a_prg' ) - CASE JUSTEXT(THIS.c_inputFile) = 'PJX' - THIS.c_outputFile = FORCEEXT( THIS.c_inputFile, THIS.c_PJ2 ) + CASE JUSTEXT(THIS.c_InputFile) = 'PJX' + THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, THIS.c_PJ2 ) THIS.o_Conversor = CREATEOBJECT( 'c_conversor_pjx_a_prg' ) - CASE JUSTEXT(THIS.c_inputFile) = THIS.c_VC2 - THIS.c_outputFile = FORCEEXT( THIS.c_inputFile, 'VCX' ) + 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' ) - CASE JUSTEXT(THIS.c_inputFile) = THIS.c_SC2 - THIS.c_outputFile = FORCEEXT( THIS.c_inputFile, 'SCX' ) + CASE JUSTEXT(THIS.c_InputFile) = THIS.c_SC2 + THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, 'SCX' ) THIS.o_Conversor = CREATEOBJECT( 'c_conversor_prg_a_scx' ) - CASE JUSTEXT(THIS.c_inputFile) = THIS.c_PJ2 - THIS.c_outputFile = FORCEEXT( THIS.c_inputFile, 'PJX' ) + CASE JUSTEXT(THIS.c_InputFile) = THIS.c_PJ2 + THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, 'PJX' ) THIS.o_Conversor = CREATEOBJECT( 'c_conversor_prg_a_pjx' ) OTHERWISE - ERROR 'El archivo [' + THIS.c_inputFile + '] no está soportado' + 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_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 @@ -354,20 +371,20 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM CATCH TO loEx lnCodError = loEx.ERRORNO - lcErrorInfo = THIS.Exception2Str(loEx) + CR_LF + CR_LF + 'Fuente: ' + THIS.c_inputFile + lcErrorInfo = THIS.Exception2Str(loEx) + CR_LF + CR_LF + 'Fuente: ' + THIS.c_InputFile TRY - STRTOFILE( lcErrorInfo, THIS.c_inputFile + '.ERR' ) + STRTOFILE( lcErrorInfo, THIS.c_InputFile + '.ERR' ) CATCH TO loEx2 ENDTRY IF THIS.l_Debug - IF _VFP.StartMode = 0 + IF _VFP.STARTMODE = 0 SET STEP ON ENDIF THIS.writeLog( lcErrorInfo ) ENDIF - IF THIS.l_Debug OR THIS.l_ShowErrors + IF THIS.l_Debug AND THIS.l_ShowErrors MESSAGEBOX( lcErrorInfo, 0+16+4096, 'FOXBIN2PRG: ERROR!', 5*60*1000 ) ENDIF ENDTRY @@ -415,36 +432,38 @@ 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 = '' - includeFile = '' c_CurDir = '' c_LogFile = '' @@ -456,6 +475,7 @@ DEFINE CLASS c_conversor_base AS SESSION SET HOURS TO 24 SET CENTURY ON SET SAFETY OFF + SET TABLEPROMPT OFF PUBLIC C_FB2PRG_CODE C_FB2PRG_CODE = '' && Contendrá todo el código generado @@ -478,7 +498,7 @@ DEFINE CLASS c_conversor_base AS SESSION ******************************************************************************************************************* PROCEDURE DESTROY - RELEASE C_FB2PRG_CODE + C_FB2PRG_CODE = '' USE IN (SELECT("TABLABIN")) THIS.writeLog( 'Descarga del conversor' ) @@ -488,7 +508,7 @@ DEFINE CLASS c_conversor_base AS SESSION ******************************************************************************************************************* PROCEDURE Convertir THIS.writeLog( '' ) - THIS.writeLog( 'Convirtiendo archivo ' + THIS.c_outputFile + '...' ) + THIS.writeLog( 'Convirtiendo archivo ' + THIS.c_OutputFile + '...' ) ENDPROC @@ -516,9 +536,9 @@ DEFINE CLASS c_conversor_base AS SESSION ******************************************************************************************************************* - PROCEDURE lineIsOnlyComment + PROCEDURE lineIsOnlyCommentAndNoMetadata LPARAMETERS tcLine, tcComment - LOCAL llLineIsOnlyComment, ln_AT_Cmt + LOCAL lllineIsOnlyCommentAndNoMetadata, ln_AT_Cmt THIS.get_SeparatedLineAndComment( @tcLine, @tcComment ) @@ -527,11 +547,11 @@ DEFINE CLASS c_conversor_base AS SESSION tcComment = tcLine CASE EMPTY(tcLine) OR LEFT(tcLine, 1) == '*' OR LEFT(tcLine + ' ', 5) == 'NOTE ' && Vacía o Comentarios - llLineIsOnlyComment = .T. + lllineIsOnlyCommentAndNoMetadata = .T. ENDCASE - RETURN llLineIsOnlyComment + RETURN lllineIsOnlyCommentAndNoMetadata ENDPROC @@ -539,11 +559,28 @@ DEFINE CLASS c_conversor_base AS SESSION 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 comentarios. Ej: '#IF .F.&&cmt' ==> '#IF .F.' + 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 @@ -579,42 +616,42 @@ DEFINE CLASS c_conversor_base AS SESSION ******************************************************************************************************************* PROCEDURE doBackup LOCAL lcNext_Bak - lcNext_Bak = THIS.getNext_BAK( THIS.c_outputFile ) + 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' ) + 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)) + 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)) + 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)) + 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)) + 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)) + 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)) + 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!' + ERROR 'Tipo de archivo [' + JUSTFNAME(THIS.c_OutputFile) + '] no soportado para backup!' ENDCASE ENDPROC @@ -622,13 +659,13 @@ DEFINE CLASS c_conversor_base AS SESSION ******************************************************************************************************************* PROCEDURE lineaExcluida - LPARAMETERS tn_Linea, tnBloquesExclusion, ta_Pos_BloquesExclusion + LPARAMETERS tn_Linea, tnBloquesExclusion, taBloquesExclusion - EXTERNAL ARRAY ta_Pos_BloquesExclusion + EXTERNAL ARRAY taBloquesExclusion LOCAL X, llExcluida FOR X = 1 TO tnBloquesExclusion - IF BETWEEN( tn_Linea, ta_Pos_BloquesExclusion(X,1), ta_Pos_BloquesExclusion(X,2) ) + IF BETWEEN( tn_Linea, taBloquesExclusion(X,1), taBloquesExclusion(X,2) ) llExcluida = .T. EXIT ENDIF @@ -640,7 +677,7 @@ DEFINE CLASS c_conversor_base AS SESSION ******************************************************************************************************************* PROCEDURE identificarBloquesDeCodigo - LPARAMETERS ta_Lineas, ta_Pos_BloquesExclusion, toModulo + LPARAMETERS taCodeLines, tnCodeLines, taBloquesExclusion, tnBloquesExclusion, toModulo ENDPROC @@ -686,7 +723,7 @@ DEFINE CLASS c_conversor_base AS SESSION CATCH TO loEx lnCodError = loEx.ERRORNO - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -699,55 +736,66 @@ DEFINE CLASS c_conversor_base AS SESSION ******************************************************************************************************************* - * Generate a FoxPro 3.0-style row timestamp - FUNCTION RowTimeStamp(tDateTime) - LOCAL cTimeValue, tnTimeStamp + 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.tDateTime) <> 'T' - m.tDateTime = DATETIME() - m.cTimeValue = TIME() - ELSE - m.cTimeValue = TTOC(m.tDateTime, 2) + IF VARTYPE(m.ltDateTime) <> 'T' + m.ltDateTime = DATETIME() ENDIF - - tnTimeStamp = ((YEAR(m.tDateTime) - 1980) * 2 ** 25); - + (MONTH(m.tDateTime) * 2 ** 21); - + (DAY(m.tDateTime) * 2 ** 16); - + (VAL(LEFTC(m.cTimeValue, 2)) * 2 ** 11); - + (VAL(SUBSTRC(m.cTimeValue, 4, 2)) * 2 ** 5); - + VAL(RIGHTC(m.cTimeValue, 2)) - RETURN tnTimeStamp + + 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 ******************************************************************************************************************* FUNCTION GetTimeStamp(tnTimeStamp) + *-- CONVIERTE UN DATO TIMESTAMP NUMERICO USADO POR LOS ARCHIVOS SCX/VCX/etc. EN TIPO DATETIME TRY - LOCAL lcTimeStamp,lnYear,lnMonth,lnDay,lnHour,lnMinutes,lnSeconds,lcTime,lnHour,ldTimeStamp,lnResto ; - ,lcTimeStamp_Ret, laDir[1], loEx as Exception - + LOCAL lcTimeStamp,lnYear,lnMonth,lnDay,lnHour,lnMinutes,lnSeconds,lcTime,lnHour,ltTimeStamp,lnResto ; + ,lcTimeStamp_Ret, laDir[1,5], loEx AS EXCEPTION + lcTimeStamp_Ret = '' IF EMPTY(tnTimeStamp) IF THIS.lFileMode - IF ADIR(laDir,THIS.c_inputFile)=0 + IF ADIR(laDir,THIS.c_InputFile)=0 EXIT ENDIF - lcTime=laDir[1,4] - lnHour=VAL(lcTime) - IF lnHour<12 - lcTime=ALLTRIM(STR(IIF(lnHour=0,12,lnHour),2))+SUBSTR(lcTime,3)+" AM" - ELSE - lcTime=ALLTRIM(STR(IIF(lnHour=12,24,lnHour)-12,2))+SUBSTR(lcTime,3)+" PM" + + *-- Esto fuerza la conversión a formato 12 hs, que no me interesa. + *lcTime=laDir[1,4] + *lnHour=VAL(lcTime) + *IF lnHour<12 + * lcTime=ALLTRIM(STR(IIF(lnHour=0,12,lnHour),2))+SUBSTR(lcTime,3)+" AM" + *ELSE + * lcTime=ALLTRIM(STR(IIF(lnHour=12,24,lnHour)-12,2))+SUBSTR(lcTime,3)+" PM" + *ENDIF + *IF VAL(lcTime)<10 + * lcTime="0"+lcTime + *ENDIF + *lcTimeStamp_Ret = DTOC(laDir[1,3])+" "+lcTime + + ltTimeStamp = EVALUATE( '{^' + DTOC(laDir(1,3)) + ' ' + TRANSFORM(laDir(1,4)) + '}' ) + + *-- En mi arreglo, si la hora pasada tiene 32 segundos o más, redondeo al siguiente minuto, ya que + *-- la descodificación posterior de GetTimeStamp tiene ese margen de error. + IF SEC(m.ltTimeStamp) >= 32 + ltTimeStamp = m.ltTimeStamp + 28 ENDIF - IF VAL(lcTime)<10 - lcTime="0"+lcTime - ENDIF - lcTimeStamp_Ret = DTOC(laDir[1,3])+" "+lcTime + + lcTimeStamp_Ret = TTOC( ltTimeStamp ) EXIT ENDIF - tnTimeStamp=THIS.nClassTimeStamp + tnTimeStamp = THIS.nClassTimeStamp IF EMPTY(tnTimeStamp) EXIT @@ -768,12 +816,15 @@ DEFINE CLASS c_conversor_base AS SESSION lnResto = lnResto % 2**5 lnSeconds = lnResto - lcTimeStamp = STR(lnYear,4) + "-" + STR(lnMonth,2) + "-" + STR(lnDay,2) + " " ; + lcTimeStamp = STR(lnYear,4) + "/" + STR(lnMonth,2) + "/" + STR(lnDay,2) + " " ; + STR(lnHour,2) + ":" + STR(lnMinutes,2) + ":" + STR(lnSeconds,2) - lcTimeStamp_Ret = TTOC( EVALUATE( "{^" + lcTimeStamp + "}" ) ) + + ltTimeStamp = EVALUATE( "{^" + lcTimeStamp + "}" ) + + lcTimeStamp_Ret = TTOC( ltTimeStamp ) CATCH TO loEx - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -797,30 +848,102 @@ DEFINE CLASS c_conversor_base AS SESSION ******************************************************************************************************************* - FUNCTION desnormalizarAsignacion( tcAsignacion ) - LOCAL lcPropName, lcValor, lnCodError, lcExpNormalizada, lnPos, lcComentario - lnPos = AT( '=', tcAsignacion ) - lcPropName = ALLTRIM( LEFT( tcAsignacion, lnPos - 2 ) ) - lcValor = ALLTRIM( SUBSTR( tcAsignacion, lnPos + 2 ) ) - lcComentario = '' + 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 - THIS.desnormalizarValorPropiedad( @lcPropName, @lcValor, @lcComentario ) - - RETURN lcPropName + ' = ' + lcValor - ENDFUNC + RETURN tcValor + ENDPROC ******************************************************************************************************************* - FUNCTION desnormalizarValorPropiedad(tcProp, tcValue, tcComentario) - LOCAL lnCodError, lnPos + 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 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 - SET STEP ON - tcValue = CHRTRAN( STREXTRACT( tcValue, '', '', 1, 1+4 ), CR_LF + C_TAB, '' ) + 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 @@ -828,34 +951,53 @@ DEFINE CLASS c_conversor_base AS SESSION ******************************************************************************************************************* - FUNCTION normalizarAsignacion( tcAsignacion, tcComentario ) + PROCEDURE normalizarAsignacion + LPARAMETERS tcAsignacion, tcComentario LOCAL lcPropName, lcValor, lnCodError, lcExpNormalizada, lnPos - lnPos = AT( '=', tcAsignacion ) - lcPropName = ALLTRIM( LEFT( tcAsignacion, lnPos - 2 ) ) - lcValor = ALLTRIM( SUBSTR( tcAsignacion, lnPos + 2 ) ) + THIS.get_SeparatedPropAndValue( @tcAsignacion, @lcPropName, @lcValor ) tcComentario = '' - THIS.normalizarValorPropiedad( @lcPropName, @lcValor, @tcComentario ) - - RETURN lcPropName + ' = ' + lcValor - ENDFUNC + tcAsignacion = lcPropName + ' = ' + lcValor + RETURN tcAsignacion + ENDPROC ******************************************************************************************************************* - FUNCTION normalizarValorPropiedad(tcProp, tcValue, tcComentario) - LOCAL lnCodError, lnPos + PROCEDURE normalizarValorPropiedad + LPARAMETERS tcProp, tcValue, tcComentario + LOCAL lcValue, I 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 - * SET STEP ON - * tcValue = CHRTRAN( STREXTRACT( tcValue, '', '', 1, 1+4 ), CR_LF + C_TAB, '' ) - *ENDCASE + DO CASE + CASE tcProp == '_memberdata' + 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 + + CASE LEFT( tcValue, C_LEN_FB2P_VALUE_I ) == C_FB2P_VALUE_I + *-- Valor especial Fox con cabecera CHR(1): Debo quitarla y normalizar el valor + tcValue = C_FB2P_VALUE_I ; + + STRTRAN( STRTRAN( STRTRAN( STRTRAN( ; + STREXTRACT( tcValue, C_FB2P_VALUE_I, C_FB2P_VALUE_F, 1, 1 ) ; + , CR_LF, ' +10;' ), C_CR, ' ' ), C_LF, ' ' ), ' +10;', CR_LF ) ; + + C_FB2P_VALUE_F + + + ENDCASE RETURN tcValue - ENDFUNC + ENDPROC ******************************************************************************************************************* @@ -884,24 +1026,39 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base LOCAL THIS AS c_conversor_prg_a_bin OF 'FOXBIN2PRG.PRG' #ENDIF _MEMBERDATA = [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + [] ; - + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + [] ; - + [] ; - + [] ; + [] ; + [] ; + [] ; + [] ; - + [] ; + + [] ; + [] ; - + [] ; - + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + [] ; + [] ; + [] ; + [] ; - + [] ; + + [] ; + + [] ; + [] @@ -914,16 +1071,16 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ******************************************************************************************************************* FUNCTION get_ValueByName_FromListNamesWithValues *-- ASIGNO EL VALOR DEL ARRAY DE DATOS Y VALORES PARA LA PROPIEDAD INDICADA - LPARAMETERS tcPropName, tcValueType, taPropsAndValues_List + LPARAMETERS tcPropName, tcValueType, taPropsAndValues LOCAL lnPos, luPropValue - lnPos = ASCAN( taPropsAndValues_List, tcPropName, 1, 0, 1, 1+2+4+8) + lnPos = ASCAN( taPropsAndValues, tcPropName, 1, 0, 1, 1+2+4+8) - IF lnPos = 0 OR EMPTY( taPropsAndValues_List( lnPos, 2 ) ) + IF lnPos = 0 OR EMPTY( taPropsAndValues( lnPos, 2 ) ) *-- Valores no encontrados o vacíos luPropValue = '' ELSE - luPropValue = taPropsAndValues_List( lnPos, 2 ) + luPropValue = taPropsAndValues( lnPos, 2 ) ENDIF DO CASE @@ -958,9 +1115,17 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base *-- Ejemplo: *< FileMetadata: Type="V" Cpid="1252" Timestamp="1131901580" ID="1129207528" ObjRev="544" /> *< OLE: Nombre="frm_form.Pageframe1.Page1.Cnt_controles_h.Olecontrol1" Parent="frm_form.Pageframe1.Page1.Cnt_controles_h" ObjName="Olecontrol1" Checksum="1685567300" Value="0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPg...ADAP7AAAA==" /> - *-- - LPARAMETERS tcLineWithMetadata, taPropsAndValues_List, tnPropsAndValues_Count, tcLeftTag, tcRightTag - EXTERNAL ARRAY taPropsAndValues_List + *-------------------------------------------------------------------------------------------------------------- + * PARÁMETROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT) + * tcLineWithMetadata (@! IN ) Línea con metadatos y un tag de metadatos + * taPropsAndValues (@! OUT) Array a devolver con las propiedades y valores encontrados + * tnPropsAndValues_Count (@! OUT) Cantidad de propiedades encontradas + * tcLeftTag (v! IN ) TAG de inicio de los metadatos + * tcRightTag (v! IN ) TAG de fin de los metadatos + *-------------------------------------------------------------------------------------------------------------- + LPARAMETERS tcLineWithMetadata, taPropsAndValues, tnPropsAndValues_Count, tcLeftTag, tcRightTag + EXTERNAL ARRAY taPropsAndValues + LOCAL lcMetadatos, I, X, lnEqualSigns, lcNextVar, lcStr, lcVirtualMeta, lnPos1, lnPos2, lnLastPos, lnCantComillas STORE '' TO lcVirtualMeta STORE 0 TO lnPos1, lnPos2, lnLastPos, tnPropsAndValues_Count, I, X @@ -973,7 +1138,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ENDIF lnLastPos = 1 - DIMENSION taPropsAndValues_List( lnCantComillas / 2, 2 ) + DIMENSION taPropsAndValues( lnCantComillas / 2, 2 ) FOR I = 1 TO lnCantComillas STEP 2 X = X + 1 @@ -985,8 +1150,8 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base * Type="V" Cpid="1252" * ^ ^ ^ => LastPos, lnPos1 y lnPos2 - taPropsAndValues_List(X,1) = ALLTRIM( GETWORDNUM( SUBSTR( lcMetadatos, lnLastPos, lnPos1 - lnLastPos ), 1, '=' ) ) - taPropsAndValues_List(X,2) = SUBSTR( lcMetadatos, lnPos1 + 1, lnPos2 - lnPos1 - 1 ) + taPropsAndValues(X,1) = ALLTRIM( GETWORDNUM( SUBSTR( lcMetadatos, lnLastPos, lnPos1 - lnLastPos ), 1, '=' ) ) + taPropsAndValues(X,2) = SUBSTR( lcMetadatos, lnPos1 + 1, lnPos2 - lnPos1 - 1 ) lnLastPos = lnPos2 + 1 ENDFOR @@ -995,131 +1160,26 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ENDPROC - ******************************************************************************************************************* - PROCEDURE evaluarDefinicionDeProcedure - LPARAMETERS toClase, tnX, tcProcedureAbierto, tcAddobjectAbierto ; - , 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 - IF NOT EMPTY(tcAddobjectAbierto) - ERROR 'Se ha encontrado "PROCEDURE" en la línea ' + TRANSFORM(tnX) ; - + ' cuando se esperaba encontrar el metatag "END OBJECT"' - ENDIF - - loProcedure = CREATEOBJECT("CL_PROCEDURE") - loProcedure._Nombre = tcProcName - loProcedure._ProcType = tcProcType - loProcedure._Comentario = tc_Comentario - tcProcedureAbierto = loProcedure._Nombre - - *-- 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 - lnCodError = loEx.ERRORNO - - IF THIS.l_Debug AND _VFP.StartMode = 0 - SET STEP ON - ENDIF - - THROW - - FINALLY - STORE NULL TO loProcedure - - ENDTRY - - RELEASE loProcedure - ENDPROC - - - ******************************************************************************************************************* - PROCEDURE evaluarLineaDeProcedure - LPARAMETERS tcLine, tcLine_Orig, toProcedure, tcProcedureAbierto - *-------------------------------------------------------------------------------------------------------------- - * ta_Lineas (!@ IN ) El array con las líneas del bloque de texto donde buscar - * ta_ID_Bloques (?@ IN ) Array de pares de identificadores (2 cols). Ej: '#IF .F.','#ENDI' ; 'TEXT','ENDTEXT' ; etc - * ta_Ubicacion_Bloques (?@ OUT) Array con las posiciones de los bloques (2 cols). Ej: 3,14 ; 23,58 ; etc - *-------------------------------------------------------------------------------------------------------------- - EXTERNAL ARRAY toProcedure - #IF .F. - LOCAL toProcedure AS CL_PROCEDURE OF 'FOXBIN2PRG.PRG' - #ENDIF - - IF LEFT( tcLine, 8 ) + ' ' == C_ENDPROC + ' ' && Fin del PROCEDURE - tcProcedureAbierto = '' - ELSE - *-- Quito 2 TABS de la izquierda (si se puede y si el integrador/desarrollador no la lió quitándolos) - DO CASE - CASE LEFT( tcLine_Orig,2 ) = C_TAB + C_TAB - toProcedure.add_Line( SUBSTR(tcLine_Orig, 3) ) - CASE LEFT( tcLine_Orig,1 ) = C_TAB - toProcedure.add_Line( SUBSTR(tcLine_Orig, 2) ) - OTHERWISE - toProcedure.add_Line( tcLine_Orig ) - ENDCASE - ENDIF - ENDPROC - - ******************************************************************************************************************* PROCEDURE identificarBloquesDeExclusion - LPARAMETERS ta_Lineas, ta_ID_Bloques, ta_Ubicacion_Bloques + LPARAMETERS taCodeLines, tnCodeLines, ta_ID_Bloques, taBloquesExclusion, tnBloquesExclusion + * LOS BLOQUES DE EXCLUSIÓN SON AQUELLOS QUE TIENEN TEXT/ENDTEXT OF #IF .F./#ENDIF Y SE USAN PARA NO BUSCAR + * INSTRUCCIONES COMO "DEFINE CLASS" O "PROCEDURE" EN LOS MISMOS. *-------------------------------------------------------------------------------------------------------------- - * ta_Lineas (!@ IN ) El array con las líneas del bloque de texto donde buscar + * taCodeLines (!@ IN ) El array con las líneas del código de texto donde buscar + * tnCodeLines (?@ IN ) Cantidad de líneas de código * ta_ID_Bloques (?@ IN ) Array de pares de identificadores (2 cols). Ej: '#IF .F.','#ENDI' ; 'TEXT','ENDTEXT' ; etc - * ta_Ubicacion_Bloques (?@ OUT) Array con las posiciones de los bloques (2 cols). Ej: 3,14 ; 23,58 ; etc + * taBloquesExclusion (?@ OUT) Array con las posiciones de los bloques (2 cols). Ej: 3,14 ; 23,58 ; etc + * tnBloquesExclusion (?@ OUT) Cantidad de bloques de exclusión *-------------------------------------------------------------------------------------------------------------- - EXTERNAL ARRAY ta_ID_Bloques, ta_Ubicacion_Bloques + EXTERNAL ARRAY ta_ID_Bloques, taBloquesExclusion TRY - LOCAL lnBloques, I, X, lnPrimerID, lnLineas, lnLen_IDFinBQ - DIMENSION ta_Ubicacion_Bloques(1,2) - STORE 0 TO lnBloques, lnPrimerID, I, X, lnLen_IDFinBQ + LOCAL lnBloques, I, X, lnPrimerID, lnLen_IDFinBQ + DIMENSION taBloquesExclusion(1,2) + STORE 0 TO tnBloquesExclusion, lnPrimerID, I, X, lnLen_IDFinBQ - lnLineas = ALEN(ta_Lineas,1) - - IF lnLineas > 1 + IF tnCodeLines > 1 IF EMPTY(ta_ID_Bloques) DIMENSION ta_ID_Bloques(2,2) ta_ID_Bloques(1,1) = '#IF .F.' @@ -1129,42 +1189,40 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ENDIF *-- Búsqueda del ID de inicio de bloque - FOR I = 1 TO lnLineas - lcLine = LTRIM( STRTRAN( STRTRAN( CHRTRAN( ta_Lineas(I), CHR(9), ' ' ), ' ', ' ' ), ' ', ' ' ) ) && Reduzco los espacios. Ej: '#IF .F. && cmt' ==> '#IF .F.&&cmt' + FOR I = 1 TO tnCodeLines + lcLine = LTRIM( STRTRAN( STRTRAN( CHRTRAN( taCodeLines(I), CHR(9), ' ' ), ' ', ' ' ), ' ', ' ' ) ) && Reduzco los espacios. Ej: '#IF .F. && cmt' ==> '#IF .F.&&cmt' - IF THIS.lineIsOnlyComment( @lcLine ) + IF THIS.lineIsOnlyCommentAndNoMetadata( @lcLine ) LOOP ENDIF lnPrimerID = ASCAN( ta_ID_Bloques, lcLine, 1, 0, 1, 1+8 ) IF lnPrimerID > 0 && Se ha identificado un ID de bloque excluyente - lnBloques = lnBloques + 1 - lnLen_IDFinBQ = LEN( ta_ID_Bloques(lnPrimerID,2) ) - DIMENSION ta_Ubicacion_Bloques(lnBloques,2) - ta_Ubicacion_Bloques(lnBloques,1) = I + tnBloquesExclusion = tnBloquesExclusion + 1 + lnLen_IDFinBQ = LEN( ta_ID_Bloques(lnPrimerID,2) ) + DIMENSION taBloquesExclusion(tnBloquesExclusion,2) + taBloquesExclusion(tnBloquesExclusion,1) = I * Búsqueda del ID de fin de bloque - FOR X = ta_Ubicacion_Bloques(lnBloques,1) + 1 TO lnLineas - lcLine = LTRIM( STRTRAN( STRTRAN( CHRTRAN( ta_Lineas(X), CHR(9), ' ' ), ' ', ' ' ), ' ', ' ' ) ) && Reduzco los espacios. Ej: '#IF .F. && cmt' ==> '#IF .F.&&cmt' + FOR I = I + 1 TO tnCodeLines + lcLine = LTRIM( STRTRAN( STRTRAN( CHRTRAN( taCodeLines(I), CHR(9), ' ' ), ' ', ' ' ), ' ', ' ' ) ) && Reduzco los espacios. Ej: '#IF .F. && cmt' ==> '#IF .F.&&cmt' - IF THIS.lineIsOnlyComment( @lcLine ) + IF THIS.lineIsOnlyCommentAndNoMetadata( @lcLine ) LOOP ENDIF IF LEFT( lcLine, lnLen_IDFinBQ ) == ta_ID_Bloques(lnPrimerID,2) && Fin de bloque encontrado (#ENDI, ENDTEXT, etc) - ta_Ubicacion_Bloques(lnBloques,2) = X + taBloquesExclusion(tnBloquesExclusion,2) = I EXIT ENDIF ENDFOR - I = X - *-- Validación - IF EMPTY(ta_Ubicacion_Bloques(lnBloques,2)) + IF EMPTY(taBloquesExclusion(tnBloquesExclusion,2)) ERROR 'No se ha encontrado el marcador de fin [' + ta_ID_Bloques(lnPrimerID,2) ; + '] que cierra al marcador de inicio [' + ta_ID_Bloques(lnPrimerID,1) ; - + '] de la línea ' + TRANSFORM(ta_Ubicacion_Bloques(lnBloques,1)) + + '] de la línea ' + TRANSFORM(taBloquesExclusion(tnBloquesExclusion,1)) ENDIF ENDIF ENDFOR @@ -1173,7 +1231,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base CATCH TO loEx lnCodError = loEx.ERRORNO - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -1190,18 +1248,17 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base *------------------------------------------------------ *-- Analiza el bloque *------------------------------------------------------ - LPARAMETERS toModulo, tcLine, ta_Lineas, I, tnLineas + LPARAMETERS toModulo, tcLine, taCodeLines, I, tnCodeLines - LOCAL llBloqueEncontrado, X, laPropsAndValues_List(1,2), lnPropsAndValues_Count + LOCAL llBloqueEncontrado, laPropsAndValues(1,2), lnPropsAndValues_Count IF LEFT( tcLine + ' ', LEN(C_FB2PRG_META_I) + 1 ) == C_FB2PRG_META_I + ' ' llBloqueEncontrado = .T. *-- Metadatos del módulo - THIS.get_ListNamesWithValuesFrom_InLine_MetadataTag( @tcLine, @laPropsAndValues_List, @lnPropsAndValues_Count ; - , C_FB2PRG_META_I, C_FB2PRG_META_F ) - toModulo._Version = THIS.get_ValueByName_FromListNamesWithValues( 'Version', 'N', @laPropsAndValues_List ) - toModulo._SourceFile = THIS.get_ValueByName_FromListNamesWithValues( 'SourceFile', 'C', @laPropsAndValues_List ) + THIS.get_ListNamesWithValuesFrom_InLine_MetadataTag( @tcLine, @laPropsAndValues, @lnPropsAndValues_Count, C_FB2PRG_META_I, C_FB2PRG_META_F ) + toModulo._Version = THIS.get_ValueByName_FromListNamesWithValues( 'Version', 'N', @laPropsAndValues ) + toModulo._SourceFile = THIS.get_ValueByName_FromListNamesWithValues( 'SourceFile', 'C', @laPropsAndValues ) ENDIF RETURN llBloqueEncontrado @@ -1216,12 +1273,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' #ENDIF - *-- Esto no funciona con el runtime - *STRTOFILE( '', '__newproject.f2b' ) - *BUILD PROJECT (THIS.c_outputFile) FROM '__newproject.f2b' - *ERASE ( '__newproject.f2b' ) - - CREATE TABLE (THIS.c_outputFile) ; + CREATE TABLE (THIS.c_OutputFile) ; ( NAME M ; , TYPE C(1) ; , ID N(10) ; @@ -1251,7 +1303,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , KEY C(32) ; , USER M ) - USE (THIS.c_outputFile) ALIAS TABLABIN AGAIN SHARED + USE (THIS.c_OutputFile) ALIAS TABLABIN AGAIN SHARED INSERT INTO TABLABIN ; ( NAME ; , TYPE ; @@ -1271,7 +1323,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , LOCAL ; , KEY ) ; VALUES ; - ( UPPER(THIS.c_outputFile) ; + ( UPPER(THIS.c_OutputFile) ; , 'H' ; , 0 ; , '' + CHR(0) ; @@ -1284,10 +1336,10 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , 260 ; , toProject.getRowDeviceInfo() ; , toProject._HomeDir + CHR(0) ; - , UPPER(THIS.c_outputFile) ; + , UPPER(THIS.c_OutputFile) ; , toProject._ServerHead.getRowServerInfo() ; , .T. ; - , UPPER( JUSTSTEM( THIS.c_outputFile) ) ) + , UPPER( JUSTSTEM( THIS.c_OutputFile) ) ) ENDPROC @@ -1298,7 +1350,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base * No funciona con el EXE *CREATE CLASSLIB (THIS.c_outputFile) - CREATE TABLE (THIS.c_outputFile) ; + CREATE TABLE (THIS.c_OutputFile) ; ( PLATFORM C(8) ; , UNIQUEID C(10) ; , TIMESTAMP N(10) ; @@ -1323,7 +1375,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , RESERVED8 M ; , USER M ) - USE (THIS.c_outputFile) ALIAS TABLABIN AGAIN SHARED + USE (THIS.c_OutputFile) ALIAS TABLABIN AGAIN SHARED INSERT INTO TABLABIN ; ( PLATFORM ; , UNIQUEID ; @@ -1339,7 +1391,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ******************************************************************************************************************* PROCEDURE createForm - CREATE TABLE (THIS.c_outputFile) ; + CREATE TABLE (THIS.c_OutputFile) ; ( PLATFORM C(8) ; , UNIQUEID C(10) ; , TIMESTAMP N(10) ; @@ -1364,7 +1416,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , RESERVED8 M ; , USER M ) - USE (THIS.c_outputFile) ALIAS TABLABIN AGAIN SHARED + USE (THIS.c_OutputFile) ALIAS TABLABIN AGAIN SHARED INSERT INTO TABLABIN ; ( PLATFORM ; , UNIQUEID ; @@ -1385,21 +1437,76 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ******************************************************************************************************************* PROCEDURE classProps2Memo + *-- ARMA EL MEMO DE PROPERTIES CON LAS PROPIEDADES Y SUS VALORES LPARAMETERS toClase #IF .F. LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' #ENDIF - LOCAL lcMemo, I - lcMemo = '' + *-- ESTRUCTURA A ANALIZAR: Propiedades normales, con CR codificado () y con CR+LF () + #IF .F. + HEIGHT = 2.73 + NAME = "c1" + prop1 = .F. && Mi prop 1 + prop_especial_cr = Este es el valor 1 Este el 2 Y Este bajo Shift_Enter el 3 + prop_especial_crlf = + Este es el valor 1 + Este el 2 + Y Este bajo Shift_Enter el 3 + + WIDTH = 27.40 + _MEMBERDATA = + + + && XML Metadata for customizable properties + #ENDIF + *-- Fin: ESTRUCTURA A ANALIZAR: - FOR I = 1 TO toClase._Prop_Count - TEXT TO lcMemo ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 - <> + TRY + LOCAL lcDefinedPAM, lnPos, lnPos2, laProps(1,2), lcLine, lcPropName, lcValue, I, lcAsignacion, lcMemo + lcMemo = '' - ENDTEXT - ENDFOR + IF toClase._Prop_Count > 0 + DIMENSION laProps( toClase._Prop_Count, 2 ) + ACOPY( toClase._Props, laProps ) + + WITH THIS + FOR I = 1 TO toClase._Prop_Count + .get_SeparatedPropAndValue( toClase._Props(I,1), @lcPropName, @lcValue ) + + DO CASE + CASE EMPTY(lcPropName) + LOOP + + CASE THIS.analizarAsignacion_TAG_Indicado( @lcPropName, @lcValue, @laProps, toClase._Prop_Count, @I ; + , C_FB2P_VALUE_I, C_FB2P_VALUE_F, C_LEN_FB2P_VALUE_I, C_LEN_FB2P_VALUE_F, @lcAsignacion ) + *-- FB2P_VALUE + + CASE THIS.analizarAsignacion_TAG_Indicado( @lcPropName, @lcValue, @laProps, toClase._Prop_Count, @I ; + , C_MEMBERDATA_I, C_MEMBERDATA_F, C_LEN_MEMBERDATA_I, C_LEN_MEMBERDATA_F, @lcAsignacion ) + *-- MEMBERDATA + + OTHERWISE + *-- Propiedad normal + THIS.desnormalizarValorPropiedad( @lcPropName, @lcValue, '' ) + + ENDCASE + + lcMemo = lcMemo + lcPropName + ' = ' + lcValue + CR_LF + + ENDFOR + ENDWITH && THIS + ENDIF && laProps > 0 + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + ENDTRY RETURN lcMemo ENDPROC @@ -1577,76 +1684,61 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ******************************************************************************************************************* - PROCEDURE defined_PEM2Memo + PROCEDURE defined_PAM2Memo + LPARAMETERS toClase + RETURN toClase._Defined_PAM + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE strip_Dimensions + LPARAMETERS tcSeparatedCommaVars + LOCAL lnPos1, lnPos2, I + + FOR I = OCCURS( '[', tcSeparatedCommaVars ) TO 1 STEP -1 + lnPos1 = AT( '[', tcSeparatedCommaVars, I ) + lnPos2 = AT( ']', tcSeparatedCommaVars, I ) + tcSeparatedCommaVars = STUFF( tcSeparatedCommaVars, lnPos1, lnPos2 - lnPos1 + 1, '' ) + ENDFOR + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE hiddenAndProtected_PAM LPARAMETERS toClase #IF .F. LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' #ENDIF - LOCAL lcMemo, I, lcPEM, lcComentario + LOCAL lcMemo, I, lcPAM, lcComentario lcMemo = '' - IF NOT EMPTY( toClase._Defined_PEM ) - FOR I = 1 TO OCCURS( ',', toClase._Defined_PEM ) + 1 - lcPEM = RTRIM( GETWORDNUM( toClase._Defined_PEM + ',', I, ',' ) ) - lcComentario = '' - - IF LEFT( lcPEM, 1 ) == '*' - *-- Método - lcComentario = THIS.getClassMethodComment( SUBSTR(lcPEM,2), toClase ) - ELSE - *-- Propiedad - lcComentario = THIS.getClassPropertyComment( lcPEM, toClase ) - ENDIF - - TEXT TO lcMemo ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 - <> <> - - ENDTEXT - ENDFOR - ENDIF + THIS.Evaluate_PAM( @lcMemo, toClase._ProtectedProps, 'property', 'protected' ) + THIS.Evaluate_PAM( @lcMemo, toClase._HiddenProps, 'property', 'hidden' ) + THIS.Evaluate_PAM( @lcMemo, toClase._ProtectedMethods, 'method', 'protected' ) + THIS.Evaluate_PAM( @lcMemo, toClase._HiddenMethods, 'method', 'hidden' ) RETURN lcMemo ENDPROC ******************************************************************************************************************* - PROCEDURE hiddenAndProtected_PEM - LPARAMETERS toClase + PROCEDURE Evaluate_PAM + LPARAMETERS tcMemo AS STRING, tcPAM AS STRING, tcPAM_Type AS STRING, tcPAM_Visibility AS STRING - #IF .F. - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - #ENDIF + LOCAL lcPAM, I - LOCAL lcMemo, I, lcPEM, lcComentario - lcMemo = '' + FOR I = 1 TO OCCURS( ',', tcPAM + ',' ) + lcPAM = ALLTRIM( GETWORDNUM( tcPAM, I, ',' ) ) - THIS.Evaluate_PEM( @lcMemo, toClase._ProtectedProps, 'property', 'protected' ) - THIS.Evaluate_PEM( @lcMemo, toClase._HiddenProps, 'property', 'hidden' ) - THIS.Evaluate_PEM( @lcMemo, toClase._ProtectedMethods, 'method', 'protected' ) - THIS.Evaluate_PEM( @lcMemo, toClase._HiddenMethods, 'method', 'hidden' ) - - RETURN lcMemo - ENDPROC - - - ******************************************************************************************************************* - PROCEDURE Evaluate_PEM - LPARAMETERS tcMemo AS STRING, tcPEM AS STRING, tcPEM_Type AS STRING, tcPEM_Visibility AS STRING - - LOCAL lcPEM, I - - FOR I = 1 TO OCCURS( ',', tcPEM + ',' ) - lcPEM = ALLTRIM( GETWORDNUM( tcPEM, I, ',' ) ) - - IF NOT EMPTY(lcPEM) - IF EVL(tcPEM_Visibility, 'normal') == 'hidden' - lcPEM = lcPEM + '^' + IF NOT EMPTY(lcPAM) + IF EVL(tcPAM_Visibility, 'normal') == 'hidden' + lcPAM = lcPAM + '^' ENDIF TEXT TO tcMemo ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 - <> + <> ENDTEXT ENDIF @@ -1658,60 +1750,63 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base PROCEDURE insert_Object LPARAMETERS toClase, toObjeto - *-- Inserto el objeto - INSERT INTO TABLABIN ; - ( PLATFORM ; - , UNIQUEID ; - , TIMESTAMP ; - , CLASS ; - , CLASSLOC ; - , BASECLASS ; - , OBJNAME ; - , PARENT ; - , PROPERTIES ; - , PROTECTED ; - , METHODS ; - , OLE ; - , OLE2 ; - , RESERVED1 ; - , RESERVED2 ; - , RESERVED3 ; - , RESERVED4 ; - , RESERVED5 ; - , RESERVED6 ; - , RESERVED7 ; - , RESERVED8 ; - , USER) ; - VALUES ; - ( 'WINDOWS' ; - , toObjeto._UniqueID ; - , toObjeto._TimeStamp ; - , toObjeto._Class ; - , toObjeto._ClassLib ; - , toObjeto._BaseClass ; - , toObjeto._ObjName ; - , toObjeto._Parent ; - , THIS.objectProps2Memo( toObjeto, toClase ) ; - , '' ; - , THIS.objectMethods2Memo( toObjeto, toClase ) ; - , toObjeto._Ole ; - , toObjeto._Ole2 ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , toObjeto._User ) + IF NOT THIS.l_Test + *-- Inserto el objeto + INSERT INTO TABLABIN ; + ( PLATFORM ; + , UNIQUEID ; + , TIMESTAMP ; + , CLASS ; + , CLASSLOC ; + , BASECLASS ; + , OBJNAME ; + , PARENT ; + , PROPERTIES ; + , PROTECTED ; + , METHODS ; + , OLE ; + , OLE2 ; + , RESERVED1 ; + , RESERVED2 ; + , RESERVED3 ; + , RESERVED4 ; + , RESERVED5 ; + , RESERVED6 ; + , RESERVED7 ; + , RESERVED8 ; + , USER) ; + VALUES ; + ( 'WINDOWS' ; + , toObjeto._UniqueID ; + , toObjeto._TimeStamp ; + , toObjeto._Class ; + , toObjeto._ClassLib ; + , toObjeto._BaseClass ; + , toObjeto._ObjName ; + , toObjeto._Parent ; + , THIS.objectProps2Memo( toObjeto, toClase ) ; + , '' ; + , THIS.objectMethods2Memo( toObjeto, toClase ) ; + , toObjeto._Ole ; + , toObjeto._Ole2 ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , toObjeto._User ) + ENDIF ENDPROC ******************************************************************************************************************* PROCEDURE insert_AllObjects *-- Recorro primero los objetos con ZOrder definido, y luego los demás - *-- NOTA: Como consecuencia de una integración de código, puede que se hayan agregado objetos nuevos (desconocidos). + *-- NOTA: Como consecuencia de una integración de código, puede que se hayan agregado objetos nuevos (desconocidos), + *-- pero todo lo demás tiene un ZOrder definido, que es el número de registro original * 100. LPARAMETERS toClase #IF .F. @@ -1719,16 +1814,17 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base #ENDIF TRY - LOCAL loObjeto, X, lcObjName + LOCAL N, X, lcObjName, loObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' IF toClase._AddObject_Count > 0 + N = 0 *-- Armo array con el orden Z de los objetos DIMENSION laObjNames( toClase._AddObject_Count, 2 ) FOR X = 1 TO toClase._AddObject_Count loObjeto = toClase._AddObjects( X ) - laObjNames( X, 1 ) = JUSTEXT( loObjeto._Nombre ) + laObjNames( X, 1 ) = loObjeto._Nombre laObjNames( X, 2 ) = loObjeto._ZOrder ENDFOR @@ -1741,8 +1837,9 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base FOR EACH loObjeto IN toClase._AddObjects FOXOBJECT *-- Verifico que sea el objeto que corresponde - IF loObjeto._Pendiente AND loObjeto._ObjName == lcObjName - loObjeto._Pendiente = .F. + IF loObjeto._WriteOrder = 0 AND loObjeto._Nombre == lcObjName + N = N + 1 + loObjeto._WriteOrder = N THIS.insert_Object( toClase, loObjeto ) EXIT ENDIF @@ -1752,7 +1849,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base *-- Recorro los objetos Desconocidos FOR EACH loObjeto IN toClase._AddObjects FOXOBJECT - IF loObjeto._Pendiente + IF loObjeto._WriteOrder = 0 THIS.insert_Object( toClase, loObjeto ) ENDIF ENDFOR @@ -1760,7 +1857,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ENDIF && toClase._AddObject_Count > 0 CATCH TO loEx - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -1773,354 +1870,797 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ******************************************************************************************************************* - PROCEDURE identificarBloquesDeCodigo - LPARAMETERS ta_Lineas, ta_Pos_BloquesExclusion, toModulo - *-------------------------------------------------------------------------------------------------------------- - * ta_Lineas (!@ IN ) El array con las líneas del bloque de texto donde buscar - * ta_Pos_BloquesExclusion (!@ IN ) Array con las posiciones de inicio/fin de los bloques de exclusion - * toModulo (?@ OUT) Objeto con toda la información del módulo analizado - * - * NOTA: - * Como identificador se usa el nombre de clase o de procedimiento, según corresponda. - *-------------------------------------------------------------------------------------------------------------- - EXTERNAL ARRAY ta_Lineas, ta_Pos_BloquesExclusion + PROCEDURE set_Line + LPARAMETERS tcLine, taCodeLines, I + tcLine = LTRIM( taCodeLines(I), 0, ' ', CHR(9) ) + ENDPROC - #IF .F. - LOCAL toModulo AS CL_MODULO OF 'FOXBIN2PRG.PRG' - #ENDIF + + ******************************************************************************************************************* + PROCEDURE analizarAsignacion_TAG_Indicado + 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 TRY - LOCAL I, X, Z, lnCodError, loEx AS EXCEPTION, lnPrimerID, lnLineas, lnBloquesExclusion ; - , ln_ID_LimitesDeCabecera, ln_AT_Cmt, lc_Comentario, la_cab_props(1) ; - , ln_cab_props, lcProp, lnPropsObj, ln_AT, lnOle_Len, laPropsAndValues_List(1,2), lnPropsAndValues_Count ; - , lcProcedureAbierto, lcAddobjectAbierto, lcLine, lnLine_Len, lcProcName ; - , loOle AS CL_OLE OF 'FOXBIN2PRG.PRG' ; - , loObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' ; - , loClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - DIMENSION ta_Ubicacion_Bloques(1,2) - STORE 0 TO lnPrimerID, I, X, lnOle_Len - STORE '' TO lcProcedureAbierto, lcAddobjectAbierto + IF LEFT( tcValue, tnLEN_TAG_I) == tcTAG_I + llBloqueEncontrado = .T. + LOCAL lcLine - THIS.c_Type = UPPER(JUSTEXT(THIS.c_outputFile)) - lnLineas = ALEN(ta_Lineas,1) - - IF lnLineas > 1 - - *-- Defino el objeto de módulo y sus propiedades - toModulo = NULL - toModulo = CREATEOBJECT('CL_MODULO') - lnOle_Len = LEN(C_OLE_I) - - *-- Determino la cantidad de exclusiones del array - IF EMPTY(ta_Pos_BloquesExclusion) - lnBloquesExclusion = 0 - ELSE - lnBloquesExclusion = ALEN(ta_Pos_BloquesExclusion,1) + *-- Propiedad especial + IF tcTAG_F $ tcValue && El fin de tag está "inline" + THIS.desnormalizarValorPropiedad( @tcPropName, @tcValue, '' ) + EXIT ENDIF - *-- Búsqueda del ID de inicio de bloque (DEFINE CLASS / PROCEDURE) - WITH THIS - FOR I = 1 TO lnLineas - STORE '' TO lc_Comentario, lcProp, lcAddobjectAbierto - STORE 0 TO lnPropsObj + tcValue = '' - lcLine = LTRIM( ta_Lineas(I), 0, ' ', CHR(9) ) + FOR I = I + 1 TO tnProp_Count + lcLine = LTRIM( taProps(I,1), 0, ' ', CHR(9) ) && Quito espacios y TABS de la izquierda - IF THIS.lineaExcluida( I, lnBloquesExclusion, @ta_Pos_BloquesExclusion ) ; - OR .lineIsOnlyComment( @lcLine, @lc_Comentario ) && Excluida, vacía o solo Comentarios + DO CASE + CASE LEFT( lcLine, tnLEN_TAG_F ) == tcTAG_F + tcValue = tcTAG_I + SUBSTR( tcValue, 3 ) + tcTAG_F + THIS.desnormalizarValorPropiedad( @tcPropName, @tcValue, '' ) + I = I + 1 + EXIT - IF NOT EMPTY(lcProcedureAbierto) && Líneas del PROCEDURE (de Clase u Objeto) - IF '.' $ lcProcedureAbierto AND loObjeto._Procedure_Count > 0 - .evaluarLineaDeProcedure( @lcLine, ta_Lineas(I), loObjeto._Procedures(loObjeto._Procedure_Count), @lcProcedureAbierto ) - ELSE - .evaluarLineaDeProcedure( @lcLine, ta_Lineas(I), loClase._Procedures(loClase._Procedure_Count), @lcProcedureAbierto ) - ENDIF - ENDIF + *CASE .lineIsOnlyCommentAndNoMetadata( @tcLine ) + * LOOP && Saltear comentarios - LOOP - ENDIF + OTHERWISE + tcValue = tcValue + CR_LF + lcLine + ENDCASE + ENDFOR - lnPrimerID = 0 + I = I - 1 - DO CASE - CASE LEFT(lcLine + ' ', 13) == C_DEFINE_CLASS + ' ' - *-- Se encontró el inicio de una clase (DEFINE CLASS) - lnPrimerID = 1 - - CASE THIS.c_Type = 'SCX' AND LEFT(lcLine, 9) == '#INCLUDE ' - *FDB* - * Específico para SCX que lo tiene al inicio - .includeFile = ALLTRIM( CHRTRAN( SUBSTR( lcLine, 10 ), ["'], [] ) ) - - CASE LEFT( lcLine + ' ', lnOle_Len + 1 ) == C_OLE_I + ' ' - *-- Se encontró una definición de objeto OLE - *< OLE: Nombre="frm_d.ole_ImageControl2" parent="frm_d" objname="ole_ImageControl2" checksum="4171274922" value="b64-value" /> - loOle = NULL - loOle = CREATEOBJECT('CL_OLE') - - .get_ListNamesWithValuesFrom_InLine_MetadataTag( @lcLine, @laPropsAndValues_List, @lnPropsAndValues_Count ; - , C_OLE_I, C_OLE_F ) - - loOle._Nombre = .get_ValueByName_FromListNamesWithValues( 'Nombre', 'C', @laPropsAndValues_List ) - loOle._Parent = .get_ValueByName_FromListNamesWithValues( 'Parent', 'C', @laPropsAndValues_List ) - loOle._ObjName = .get_ValueByName_FromListNamesWithValues( 'ObjName', 'C', @laPropsAndValues_List ) - loOle._CheckSum = .get_ValueByName_FromListNamesWithValues( 'CheckSum', 'C', @laPropsAndValues_List ) - loOle._Value = STRCONV( .get_ValueByName_FromListNamesWithValues( 'Value', 'C', @laPropsAndValues_List ), 14 ) - - toModulo.add_OLE( loOle ) - - IF EMPTY( loOle._Value ) - *-- Si el objeto OLE no tiene VALUE, es porque hay otro con el mismo contenido y no se duplicó para preservar espacio. - *-- Busco el VALUE del duplicado que se guardó y lo asigno nuevamente - FOR Z = 1 TO toModulo._Ole_Obj_count - 1 - IF toModulo._Ole_Objs(Z)._CheckSum == loOle._CheckSum ; - AND NOT EMPTY( toModulo._Ole_Objs(Z)._Value ) - loOle._Value = toModulo._Ole_Objs(Z)._Value - EXIT - ENDIF - ENDFOR - ENDIF - - LOOP - - CASE THIS.analizarBloque_FoxBin2Prg( toModulo, @lcLine, @ta_Lineas, @I, lnLineas ) - *-- Metadatos del módulo - LOOP - - ENDCASE - - IF lnPrimerID > 0 && Se ha identificado un ID de bloque (DEFINE CLASS) e inicio de cabecera - loClase = CREATEOBJECT('CL_CLASE') - loClase._Nombre = ALLTRIM( STREXTRACT( lcLine, 'DEFINE CLASS ', ' AS ', 1, 1 ) ) - loClase._ObjName = loClase._Nombre - loClase._Definicion = ALLTRIM( lcLine ) - IF NOT ' OF ' $ UPPER(lcLine) && Puede no tener "OF libreria.vcx" - loClase._Class = ALLTRIM( CHRTRAN( STREXTRACT( lcLine + ' OLEPUBLIC', ' AS ', ' OLEPUBLIC', 1, 1 ), ["'], [] ) ) - ELSE - loClase._Class = ALLTRIM( CHRTRAN( STREXTRACT( lcLine + ' OF ', ' AS ', ' OF ', 1, 1 ), ["'], [] ) ) - ENDIF - loClase._ClassLoc = ALLTRIM( CHRTRAN( STREXTRACT( lcLine + ' OLEPUBLIC', ' OF ', ' OLEPUBLIC', 1, 1 ), ["'], [] ) ) - loClase._OlePublic = ' OLEPUBLIC' $ UPPER(lcLine) - loClase._Comentario = lc_Comentario - loClase._Inicio = I - loClase._Ini_Cab = I + 1 - - toModulo.add_Class( loClase ) - - *-- Ubico el objeto ole por su nombre (parent+objname), que no se repite. - IF toModulo.existeObjetoOLE( loClase._Nombre, @Z ) - loClase._Ole = toModulo._Ole_Objs(Z)._Value - ENDIF - - * Búsqueda del ID de fin de bloque (ENDDEFINE) - FOR I = loClase._Ini_Cab TO lnLineas - lc_Comentario = '' - lcLine = LTRIM( ta_Lineas(I), 0, ' ', CHR(9) ) - - IF THIS.lineaExcluida( I, lnBloquesExclusion, @ta_Pos_BloquesExclusion ) ; - OR .lineIsOnlyComment( @lcLine, @lc_Comentario ) && Excluida, vacía o solo Comentarios - - IF NOT EMPTY(lcProcedureAbierto) && Líneas del PROCEDURE - IF '.' $ lcProcName AND VARTYPE(loObjeto) = 'O' AND loObjeto._Procedure_Count > 0 - .evaluarLineaDeProcedure( @lcLine, ta_Lineas(I), loObjeto._Procedures(loObjeto._Procedure_Count), @lcProcedureAbierto ) - ELSE - .evaluarLineaDeProcedure( @lcLine, ta_Lineas(I), loClase._Procedures(loClase._Procedure_Count), @lcProcedureAbierto ) - ENDIF - ENDIF - - LOOP - ENDIF - - lnLine_Len = LEN(lcLine) - - - DO CASE - CASE LEFT( lcLine, 20 ) == 'PROTECTED PROCEDURE ' - *-- Estructura a reconocer: PROTECTED PROCEDURE nombre_del_procedimiento - lcProcName = ALLTRIM( SUBSTR( lcLine, 21 ) ) - .evaluarDefinicionDeProcedure( loClase, I ; - , @lcProcedureAbierto, lcAddobjectAbierto, @lc_Comentario, lcProcName, 'protected', @loObjeto ) - - - CASE LEFT( lcLine, 17 ) == 'HIDDEN PROCEDURE ' - *-- Estructura a reconocer: HIDDEN PROCEDURE nombre_del_procedimiento - lcProcName = ALLTRIM( SUBSTR( lcLine, 18 ) ) - .evaluarDefinicionDeProcedure( loClase, I ; - , @lcProcedureAbierto, lcAddobjectAbierto, @lc_Comentario, lcProcName, 'hidden', @loObjeto ) - - - CASE LEFT(lcLine, 10) == 'PROTECTED ' - loClase._ProtectedProps = ALLTRIM( SUBSTR( lcLine, 11 ) ) - - - CASE LEFT(lcLine, 7) == 'HIDDEN ' - loClase._HiddenProps = ALLTRIM( SUBSTR( lcLine, 8 ) ) - - - CASE LEFT(lcLine, 9) == '#INCLUDE ' - loClase._IncludeFile = ALLTRIM( CHRTRAN( SUBSTR( lcLine, 10 ), ["'], [] ) ) - - - CASE LEFT(lcLine, LEN(C_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" /> - - .get_ListNamesWithValuesFrom_InLine_MetadataTag( @lcLine, @laPropsAndValues_List, @lnPropsAndValues_Count ; - , C_METADATA_I, C_METADATA_F ) - - loClase._BaseClass = .get_ValueByName_FromListNamesWithValues( 'BaseClass', 'C', @laPropsAndValues_List ) - loClase._TimeStamp = INT( .RowTimeStamp( .get_ValueByName_FromListNamesWithValues( 'TimeStamp', 'T', @laPropsAndValues_List ) ) ) - loClase._Scale = .get_ValueByName_FromListNamesWithValues( 'Scale', 'C', @laPropsAndValues_List ) - loClase._UniqueID = .get_ValueByName_FromListNamesWithValues( 'UniqueID', 'C', @laPropsAndValues_List ) - loClase._ProjectClassIcon = .get_ValueByName_FromListNamesWithValues( 'ProjectClassIcon', 'C', @laPropsAndValues_List ) - loClase._ClassIcon = .get_ValueByName_FromListNamesWithValues( 'ClassIcon', 'C', @laPropsAndValues_List ) - loClase._Ole2 = .get_ValueByName_FromListNamesWithValues( 'Ole2', 'C', @laPropsAndValues_List ) - - IF NOT EMPTY( loClase._Ole2 ) && Le agrego "OLEObject = " delante - loClase._Ole2 = 'OLEObject = ' + loClase._Ole2 + CR_LF - ENDIF - - - CASE LEFT(lcLine, LEN(C_DEFINED_PEM_I)) == C_DEFINED_PEM_I - loClase._Defined_PEM = ALLTRIM( STREXTRACT( lcLine, C_DEFINED_PEM_I, C_DEFINED_PEM_F, 1, 1) ) - - - CASE LEFT( lcLine, 11 ) == 'ADD OBJECT ' - *-- Estructura a reconocer: ADD OBJECT 'frm_a.Check1' AS check [WITH] - lcLine = CHRTRAN( lcLine, ['], ["] ) - - IF EMPTY(loClase._Fin_Cab) - loClase._Fin_Cab = I-1 - loClase._Ini_Cuerpo = I - ENDIF - - loObjeto = NULL - loObjeto = CREATEOBJECT('CL_OBJETO') - loClase.add_Object( loObjeto ) - loObjeto._Nombre = ALLTRIM( CHRTRAN( STREXTRACT(lcLine, 'ADD OBJECT ', ' AS ', 1, 1), ['"], [] ) ) - - IF '.' $ loObjeto._Nombre - loObjeto._ObjName = JUSTEXT( loObjeto._Nombre ) - loObjeto._Parent = loClase._ObjName + '.' + JUSTSTEM( loObjeto._Nombre ) - ELSE - loObjeto._ObjName = loObjeto._Nombre - loObjeto._Parent = loClase._ObjName - ENDIF - - loObjeto._Nombre = loObjeto._Parent + '.' + loObjeto._ObjName - loObjeto._Class = ALLTRIM( STREXTRACT(lcLine + ' WITH', ' AS ', ' WITH', 1, 1) ) - lcAddobjectAbierto = loObjeto._Nombre - - - CASE LEFT( lcLine, 10 ) == 'PROCEDURE ' - *-- Estructura a reconocer: PROCEDURE [objeto.]nombre_del_procedimiento - lcProcName = ALLTRIM( SUBSTR( lcLine, 11 ) ) - .evaluarDefinicionDeProcedure( loClase, I ; - , @lcProcedureAbierto, lcAddobjectAbierto, @lc_Comentario, lcProcName, 'normal', @loObjeto ) - - - CASE LEFT( lcLine + ' ', 10 ) == C_ENDDEFINE + ' ' && Fin de bloque (ENDDEF / ENDPROC) encontrado - loClase._Fin = I - - IF EMPTY( loClase._Ini_Cuerpo ) - loClase._Ini_Cuerpo = I-1 - ENDIF - - loClase._Fin_Cuerpo = I-1 - - IF EMPTY( loClase._Fin_Cab ) - loClase._Fin_Cab = I-1 - ENDIF - - STORE '' TO lclProcedureAbierto, lcAddobjectAbierto - EXIT - - - CASE EMPTY( loClase._Fin_Cab ) && Propiedades del DEFINE CLASS - *loClase.add_Property( THIS.desnormalizarAsignacion( RTRIM(lcLine) ), RTRIM(lc_Comentario) ) - loClase.add_Property( RTRIM(lcLine), RTRIM(lc_Comentario) ) - - - CASE NOT EMPTY(lcAddobjectAbierto) && Propiedades del ADD OBJECT - IF NOT LEFT(lcLine,2) == '*<' - IF RIGHT(lcLine, 3) == ', ;' - *loObjeto.add_Property( .desnormalizarAsignacion( LEFT(lcLine, lnLine_Len - 3) ) ) - loObjeto.add_Property( LEFT(lcLine, lnLine_Len - 3) ) - ELSE - *loObjeto.add_Property( .desnormalizarAsignacion( RTRIM(lcLine) ) ) - loObjeto.add_Property( RTRIM(lcLine) ) - ENDIF - ENDIF - - IF NOT EMPTY(lc_Comentario) AND C_END_OBJECT_I $ lc_Comentario && Fin del ADD OBJECT y METADATOS - *< END OBJECT: baseclass = "olecontrol" Uniqueid = "_3X50L3I7V" OLEObject = "C:\WINDOWS\system32\FOXTLIB.OCX" checksum = "4101493921" /> - - .get_ListNamesWithValuesFrom_InLine_MetadataTag( @lc_Comentario, @laPropsAndValues_List, @lnPropsAndValues_Count ; - , C_END_OBJECT_I, C_END_OBJECT_F ) - - loObjeto._ClassLib = .get_ValueByName_FromListNamesWithValues( 'ClassLib', 'C', @laPropsAndValues_List ) - loObjeto._BaseClass = .get_ValueByName_FromListNamesWithValues( 'BaseClass', 'C', @laPropsAndValues_List ) - loObjeto._UniqueID = .get_ValueByName_FromListNamesWithValues( 'UniqueID', 'C', @laPropsAndValues_List ) - loObjeto._Ole2 = .get_ValueByName_FromListNamesWithValues( 'OLEObject', 'C', @laPropsAndValues_List ) - loObjeto._ZOrder = .get_ValueByName_FromListNamesWithValues( 'ZOrder', 'I', @laPropsAndValues_List ) - loObjeto._TimeStamp = INT( .RowTimeStamp( .get_ValueByName_FromListNamesWithValues( 'TimeStamp', 'T', @laPropsAndValues_List ) ) ) - - IF NOT EMPTY( loObjeto._Ole2 ) && Le agrego "OLEObject = " delante - loObjeto._Ole2 = 'OLEObject = ' + loObjeto._Ole2 + CR_LF - ENDIF - - *-- Ubico el objeto ole por su nombre (parent+objname), que no se repite. - IF toModulo.existeObjetoOLE( loObjeto._Nombre, @Z ) - loObjeto._Ole = toModulo._Ole_Objs(Z)._Value - ENDIF - - lcAddobjectAbierto = '' - lnPropsObj = 0 - ENDIF - - CASE NOT EMPTY(lcProcedureAbierto) && Líneas del PROCEDURE (de Clase u Objeto) - IF '.' $ lcProcName AND VARTYPE(loObjeto) = 'O' AND loObjeto._Procedure_Count > 0 - .evaluarLineaDeProcedure( @lcLine, ta_Lineas(I), loObjeto._Procedures(loObjeto._Procedure_Count), @lcProcedureAbierto ) - ELSE - .evaluarLineaDeProcedure( @lcLine, ta_Lineas(I), loClase._Procedures(loClase._Procedure_Count), @lcProcedureAbierto ) - ENDIF - - OTHERWISE - IF .l_Debug - MESSAGEBOX( 'Se escapó esta línea del análisis. Ver que es en el DEBUG que se va a abrir.' ) - IF _VFP.StartMode = 0 - SET STEP ON - ENDIF - ENDIF - ENDCASE - - ENDFOR - - *-- Validación - IF EMPTY( loClase._Fin ) - ERROR 'No se ha encontrado el marcador de fin [ENDDEFINE] ' ; - + 'que cierra al marcador de inicio [DEFINE CLASS] ' ; - + 'de la línea ' + TRANSFORM( loClase._Inicio ) + ' ' ; - + 'para el identificador [' + loClase._Nombre + ']' - ENDIF - ENDIF - ENDFOR - ENDWITH && THIS ENDIF CATCH TO loEx - lnCodError = loEx.ERRORNO - *loEx.UserValue = 'ATENCION: EL ERROR PODRIA SER DEL PROGRAMA FUENTE' + CR_LF + CR_LF ; - + JUSTEXT(THIS.c_inputFile) + ' Line ' + TRANSFORM(I) + ':' + ta_Lineas(I) + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF - IF THIS.l_Debug AND _VFP.StartMode = 0 + THROW + + ENDTRY + + 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 loObjeto, loOle, loClase - RELEASE loObjeto, loOle, loClase + STORE NULL TO loProcedure + RELEASE loProcedure + + ENDTRY + + RETURN + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE analizarLineasDeProcedure + LPARAMETERS toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto, tc_Comentario ; + , taBloquesExclusion, tnBloquesExclusion + EXTERNAL ARRAY taCodeLines + + #IF .F. + LOCAL toObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' + LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' + #ENDIF + + TRY + LOCAL loProcedure AS CL_PROCEDURE OF 'FOXBIN2PRG.PRG' + + IF '.' $ tcProcedureAbierto AND VARTYPE(toObjeto) = 'O' AND toObjeto._Procedure_Count > 0 + loProcedure = toObjeto._Procedures(toObjeto._Procedure_Count) + ELSE + loProcedure = toClase._Procedures(toClase._Procedure_Count) + ENDIF + + WITH THIS + FOR I = I + 1 TO tnCodeLines + .set_Line( @tcLine, @taCodeLines, I ) + + IF NOT .lineaExcluida( I, tnBloquesExclusion, @taBloquesExclusion ) ; + AND NOT .lineIsOnlyCommentAndNoMetadata( @tcLine, @tc_Comentario ) + + IF LEFT( tcLine, 8 ) + ' ' == C_ENDPROC + ' ' && Fin del PROCEDURE + *tcProcedureAbierto = '' + EXIT + ENDIF + ENDIF + + *-- Quito 2 TABS de la izquierda (si se puede y si el integrador/desarrollador no la lió quitándolos) + DO CASE + CASE LEFT( taCodeLines(I),2 ) = C_TAB + C_TAB + loProcedure.add_Line( SUBSTR(taCodeLines(I), 3) ) + CASE LEFT( taCodeLines(I),1 ) = C_TAB + loProcedure.add_Line( SUBSTR(taCodeLines(I), 2) ) + OTHERWISE + loProcedure.add_Line( taCodeLines(I) ) + ENDCASE + ENDFOR + ENDWITH && THIS + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + ENDTRY + + RETURN + 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 + + EXTERNAL ARRAY taCodeLines + + #IF .F. + LOCAL toModulo AS CL_MODULO OF 'FOXBIN2PRG.PRG' + LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' + LOCAL toObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' + #ENDIF + + TRY + LOCAL llBloqueEncontrado + + 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 + tcLine = CHRTRAN( tcLine, ['], ["] ) + + IF EMPTY(toClase._Fin_Cab) + toClase._Fin_Cab = I-1 + toClase._Ini_Cuerpo = I + ENDIF + + toObjeto = NULL + toObjeto = CREATEOBJECT('CL_OBJETO') + toClase.add_Object( toObjeto ) + toObjeto._Nombre = ALLTRIM( CHRTRAN( STREXTRACT(tcLine, 'ADD OBJECT ', ' AS ', 1, 1), ['"], [] ) ) + + IF '.' $ toObjeto._Nombre + toObjeto._ObjName = JUSTEXT( toObjeto._Nombre ) + toObjeto._Parent = toClase._ObjName + '.' + JUSTSTEM( toObjeto._Nombre ) + ELSE + toObjeto._ObjName = toObjeto._Nombre + toObjeto._Parent = toClase._ObjName + ENDIF + + toObjeto._Nombre = toObjeto._Parent + '.' + toObjeto._ObjName + toObjeto._Class = ALLTRIM( STREXTRACT(tcLine + ' WITH', ' AS ', ' WITH', 1, 1) ) + + + *-- Propiedades del ADD OBJECT + WITH THIS + FOR I = I + 1 TO tnCodeLines + .set_Line( @tcLine, @taCodeLines, I ) + + IF LEFT( tcLine, C_LEN_END_OBJECT_I) == C_END_OBJECT_I && Fin del ADD OBJECT y METADATOS + *< END OBJECT: baseclass = "olecontrol" Uniqueid = "_3X50L3I7V" OLEObject = "C:\WINDOWS\system32\FOXTLIB.OCX" checksum = "4101493921" /> + + .get_ListNamesWithValuesFrom_InLine_MetadataTag( @tcLine, @laPropsAndValues, @lnPropsAndValues_Count ; + , C_END_OBJECT_I, C_END_OBJECT_F ) + + toObjeto._ClassLib = .get_ValueByName_FromListNamesWithValues( 'ClassLib', 'C', @laPropsAndValues ) + toObjeto._BaseClass = .get_ValueByName_FromListNamesWithValues( 'BaseClass', 'C', @laPropsAndValues ) + toObjeto._UniqueID = .get_ValueByName_FromListNamesWithValues( 'UniqueID', 'C', @laPropsAndValues ) + toObjeto._Ole2 = .get_ValueByName_FromListNamesWithValues( 'OLEObject', 'C', @laPropsAndValues ) + toObjeto._ZOrder = .get_ValueByName_FromListNamesWithValues( 'ZOrder', 'I', @laPropsAndValues ) + toObjeto._TimeStamp = INT( .RowTimeStamp( .get_ValueByName_FromListNamesWithValues( 'TimeStamp', 'T', @laPropsAndValues ) ) ) + + IF NOT EMPTY( toObjeto._Ole2 ) && Le agrego "OLEObject = " delante + toObjeto._Ole2 = 'OLEObject = ' + toObjeto._Ole2 + CR_LF + ENDIF + + *-- Ubico el objeto ole por su nombre (parent+objname), que no se repite. + IF toModulo.existeObjetoOLE( toObjeto._Nombre, @Z ) + toObjeto._Ole = toModulo._Ole_Objs(Z)._Value + ENDIF + + EXIT + ENDIF + + IF RIGHT(tcLine, 3) == ', ;' + *toObjeto.add_Property( .desnormalizarAsignacion( LEFT(tcLine, LEN(tcLine) - 3) ) ) + toObjeto.add_Property( LEFT(tcLine, LEN(tcLine) - 3) ) + ELSE + *toObjeto.add_Property( .desnormalizarAsignacion( RTRIM(tcLine) ) ) + toObjeto.add_Property( RTRIM(tcLine) ) + ENDIF + + ENDFOR + ENDWITH && THIS + ENDIF + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + ENDTRY + + RETURN llBloqueEncontrado + 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_DEFINE_CLASS + LPARAMETERS toModulo, toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto ; + , taBloquesExclusion, tnBloquesExclusion, tc_Comentario + + EXTERNAL ARRAY taCodeLines, tnBloquesExclusion, taBloquesExclusion + + #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 + + IF LEFT(tcLine + ' ', 13) == C_DEFINE_CLASS + ' ' + TRY + llBloqueEncontrado = .T. + LOCAL Z, loEx AS EXCEPTION ; + , llMETADATA_Completed, llPROTECTED_Completed, llHIDDEN_Completed, llDEFINED_PAM_Completed ; + , llINCLUDE_Completed, llCLASS_PROPERTY_Completed + + STORE '' TO tcProcedureAbierto + toClase = CREATEOBJECT('CL_CLASE') + toClase._Nombre = ALLTRIM( STREXTRACT( tcLine, 'DEFINE CLASS ', ' AS ', 1, 1 ) ) + toClase._ObjName = toClase._Nombre + toClase._Definicion = ALLTRIM( tcLine ) + IF NOT ' OF ' $ UPPER(tcLine) && Puede no tener "OF libreria.vcx" + toClase._Class = ALLTRIM( CHRTRAN( STREXTRACT( tcLine + ' OLEPUBLIC', ' AS ', ' OLEPUBLIC', 1, 1 ), ["'], [] ) ) + ELSE + toClase._Class = ALLTRIM( CHRTRAN( STREXTRACT( tcLine + ' OF ', ' AS ', ' OF ', 1, 1 ), ["'], [] ) ) + ENDIF + toClase._ClassLoc = ALLTRIM( CHRTRAN( STREXTRACT( tcLine + ' OLEPUBLIC', ' OF ', ' OLEPUBLIC', 1, 1 ), ["'], [] ) ) + toClase._OlePublic = ' OLEPUBLIC' $ UPPER(tcLine) + toClase._Comentario = tc_Comentario + toClase._Inicio = I + toClase._Ini_Cab = I + 1 + + toModulo.add_Class( toClase ) + + *-- Ubico el objeto ole por su nombre (parent+objname), que no se repite. + IF toModulo.existeObjetoOLE( toClase._Nombre, @Z ) + toClase._Ole = toModulo._Ole_Objs(Z)._Value + ENDIF + + * Búsqueda del ID de fin de bloque (ENDDEFINE) + WITH THIS + FOR I = toClase._Ini_Cab TO tnCodeLines + tc_Comentario = '' + .set_Line( @tcLine, @taCodeLines, I ) + + + .lineIsOnlyCommentAndNoMetadata( @tcLine, @tc_Comentario ) + + DO CASE + CASE .analizarBloque_PROCEDURE( @toModulo, @toClase, @toObjeto, @tcLine, @taCodeLines, @I, @tnCodeLines ; + , @tcProcedureAbierto, @tc_Comentario, @taBloquesExclusion, @tnBloquesExclusion ) + *-- OJO: Esta se analiza primero a propósito, solo porque no puede estar detrás de PROTECTED y HIDDEN + llCLASS_PROPERTY_Completed = .T. + llPROTECTED_Completed = .T. + llHIDDEN_Completed = .T. + llINCLUDE_Completed = .T. + llMETADATA_Completed = .T. + llDEFINED_PAM_Completed = .T. + + + CASE NOT llPROTECTED_Completed AND .analizarBloque_PROTECTED( @toClase, @tcLine ) + llPROTECTED_Completed = .T. + + + CASE NOT llHIDDEN_Completed AND .analizarBloque_HIDDEN( @toClase, @tcLine ) + llHIDDEN_Completed = .T. + + + CASE NOT llINCLUDE_Completed AND .c_Type <> "SCX" AND .analizarBloque_INCLUDE( @toModulo, @toClase, @toObjeto, @tcLine, @taCodeLines ; + , @I, @tnCodeLines, @tcProcedureAbierto ) + llINCLUDE_Completed = .T. + + + CASE NOT llMETADATA_Completed AND .analizarBloque_METADATA( @toClase, @tcLine ) + llMETADATA_Completed = .T. + + + CASE NOT llDEFINED_PAM_Completed AND .analizarBloque_DEFINED_PAM( @toClase, @tcLine, @taCodeLines, tnCodeLines, @I ) + llDEFINED_PAM_Completed = .T. + + + CASE .analizarBloque_ADD_OBJECT( @toModulo, @toClase, @tcLine, @I, @taCodeLines, @tnCodeLines ) + llCLASS_PROPERTY_Completed = .T. + llPROTECTED_Completed = .T. + llHIDDEN_Completed = .T. + llINCLUDE_Completed = .T. + llMETADATA_Completed = .T. + llDEFINED_PAM_Completed = .T. + + + CASE .analizarBloque_ENDDEFINE( @toClase, @tcLine, @I, @tcProcedureAbierto ) + EXIT + + + 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) ) + + + OTHERWISE + *-- Las líneas que pasan por aquí deberían estar vacías y ser de relleno del embellecimiento + + ENDCASE + + ENDFOR + ENDWITH && THIS + + *-- Validación + IF EMPTY( toClase._Fin ) + ERROR 'No se ha encontrado el marcador de fin [ENDDEFINE] ' ; + + 'que cierra al marcador de inicio [DEFINE CLASS] ' ; + + 'de la línea ' + TRANSFORM( toClase._Inicio ) + ' ' ; + + 'para el identificador [' + toClase._Nombre + ']' + ENDIF + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + ENDTRY + ENDIF + + RETURN llBloqueEncontrado + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE analizarBloque_INCLUDE + LPARAMETERS toModulo, toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto + LOCAL llBloqueEncontrado + + #IF .F. + LOCAL toModulo AS CL_MODULO OF 'FOXBIN2PRG.PRG' + LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' + #ENDIF + + IF LEFT(tcLine, 9) == '#INCLUDE ' + llBloqueEncontrado = .T. + IF THIS.c_Type = 'SCX' + toModulo._includeFile = ALLTRIM( CHRTRAN( SUBSTR( tcLine, 10 ), ["'], [] ) ) + ELSE + toClase._includeFile = ALLTRIM( CHRTRAN( SUBSTR( tcLine, 10 ), ["'], [] ) ) + ENDIF + ENDIF + + RETURN llBloqueEncontrado + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE analizarBloque_OLE_DEF + LPARAMETERS toModulo, toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto + LOCAL llBloqueEncontrado + + #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 + + IF LEFT( tcLine + ' ', C_LEN_OLE_I + 1 ) == C_OLE_I + ' ' + llBloqueEncontrado = .T. + *-- Se encontró una definición de objeto OLE + *< OLE: Nombre="frm_d.ole_ImageControl2" parent="frm_d" objname="ole_ImageControl2" checksum="4171274922" value="b64-value" /> + LOCAL laPropsAndValues(1,2), lnPropsAndValues_Count ; + , loOle AS CL_OLE OF 'FOXBIN2PRG.PRG' + loOle = NULL + loOle = CREATEOBJECT('CL_OLE') + + WITH THIS + .get_ListNamesWithValuesFrom_InLine_MetadataTag( @tcLine, @laPropsAndValues, @lnPropsAndValues_Count, C_OLE_I, C_OLE_F ) + + loOle._Nombre = .get_ValueByName_FromListNamesWithValues( 'Nombre', 'C', @laPropsAndValues ) + loOle._Parent = .get_ValueByName_FromListNamesWithValues( 'Parent', 'C', @laPropsAndValues ) + loOle._ObjName = .get_ValueByName_FromListNamesWithValues( 'ObjName', 'C', @laPropsAndValues ) + loOle._CheckSum = .get_ValueByName_FromListNamesWithValues( 'CheckSum', 'C', @laPropsAndValues ) + loOle._Value = STRCONV( .get_ValueByName_FromListNamesWithValues( 'Value', 'C', @laPropsAndValues ), 14 ) + ENDWITH + + toModulo.add_OLE( loOle ) + + IF EMPTY( loOle._Value ) + *-- Si el objeto OLE no tiene VALUE, es porque hay otro con el mismo contenido y no se duplicó para preservar espacio. + *-- Busco el VALUE del duplicado que se guardó y lo asigno nuevamente + FOR Z = 1 TO toModulo._Ole_Obj_count - 1 + IF toModulo._Ole_Objs(Z)._CheckSum == loOle._CheckSum AND NOT EMPTY( toModulo._Ole_Objs(Z)._Value ) + loOle._Value = toModulo._Ole_Objs(Z)._Value + EXIT + ENDIF + ENDFOR + ENDIF + + loOle = NULL + RELEASE loOle + ENDIF + + RETURN llBloqueEncontrado + ENDPROC + + ******************************************************************************************************************* + PROCEDURE identificarBloquesDeCodigo + LPARAMETERS taCodeLines, tnCodeLines, taBloquesExclusion, tnBloquesExclusion, toModulo + *-------------------------------------------------------------------------------------------------------------- + * taCodeLines (!@ IN ) El array con las líneas del código donde buscar + * tnCodeLines (!@ IN ) Cantidad de líneas de código + * taBloquesExclusion (!@ IN ) Array con las posiciones de inicio/fin de los bloques de exclusion + * tnBloquesExclusion (!@ IN ) Cantidad de bloques de exclusión + * toModulo (?@ OUT) Objeto con toda la información del módulo analizado + * + * NOTA: + * Como identificador se usa el nombre de clase o de procedimiento, según corresponda. + *-------------------------------------------------------------------------------------------------------------- + EXTERNAL ARRAY taCodeLines, taBloquesExclusion + + #IF .F. + LOCAL toModulo AS CL_MODULO OF 'FOXBIN2PRG.PRG' + #ENDIF + + TRY + LOCAL I, loEx AS EXCEPTION ; + , llFoxBin2Prg_Completed, llOLE_DEF_Completed, llINCLUDE_SCX_Completed ; + , lc_Comentario, lcProcedureAbierto, lcLine ; + , loObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' ; + , loClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' + + STORE '' TO lcProcedureAbierto + + THIS.c_Type = UPPER(JUSTEXT(THIS.c_OutputFile)) + + IF tnCodeLines > 1 + + *-- Defino el objeto de módulo y sus propiedades + toModulo = NULL + toModulo = CREATEOBJECT('CL_MODULO') + + *-- Búsqueda del ID de inicio de bloque (DEFINE CLASS / PROCEDURE) + WITH THIS + FOR I = 1 TO tnCodeLines + STORE '' TO lc_Comentario + .set_Line( @lcLine, @taCodeLines, I ) + + DO CASE + CASE THIS.lineaExcluida( I, tnBloquesExclusion, @taBloquesExclusion ) ; + OR .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Excluida, vacía o solo Comentarios + + *.analizarLineasDeProcedure( @loClase, @loObjeto, @lcLine, @taCodeLines, @I, tnCodeLines, @lcProcedureAbierto ) + + CASE NOT llFoxBin2Prg_Completed AND .analizarBloque_FoxBin2Prg( toModulo, @lcLine, @taCodeLines, @I, tnCodeLines ) + llFoxBin2Prg_Completed = .T. + + CASE NOT llOLE_DEF_Completed AND .analizarBloque_OLE_DEF( @toModulo, @loClase, @loObjeto, @lcLine, @taCodeLines ; + , @I, tnCodeLines, @lcProcedureAbierto ) + *-- Puede haber varios + + CASE NOT llINCLUDE_SCX_Completed AND .c_Type = 'SCX' AND .analizarBloque_INCLUDE( @toModulo, @loClase, @loObjeto, @lcLine ; + , @taCodeLines, @I, tnCodeLines, @lcProcedureAbierto ) + * Específico para SCX que lo tiene al inicio + llINCLUDE_SCX_Completed = .T. + + CASE .analizarBloque_DEFINE_CLASS( @toModulo, @loClase, @loObjeto, @lcLine, @taCodeLines, @I, tnCodeLines ; + , @lcProcedureAbierto, @taBloquesExclusion, @tnBloquesExclusion, @lc_Comentario ) + *-- Puede haber varias + + ENDCASE + + ENDFOR + ENDWITH && THIS + ENDIF + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + FINALLY + STORE NULL TO loObjeto, loClase + RELEASE loObjeto, loClase ENDTRY RETURN @@ -2145,20 +2685,20 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin DODEFAULT() TRY - LOCAL lnCodError, loEx AS EXCEPTION, loReg, lcLine, laCode(1), lnCodeLines, lnFB2P_Version, lcSourceFile ; - , laUbicacionBloquesExclusion(1,2), I, toModulo + LOCAL lnCodError, loEx AS EXCEPTION, loReg, lcLine, laCodeLines(1), lnCodeLines, lnFB2P_Version, lcSourceFile ; + , laBloquesExclusion(1,2), lnBloquesExclusion, I, toModulo 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( laCode, C_FB2PRG_CODE ) + C_FB2PRG_CODE = FILETOSTR( THIS.c_InputFile ) + lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) *-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF - THIS.identificarBloquesDeExclusion( @laCode, .F., @laUbicacionBloquesExclusion ) + THIS.identificarBloquesDeExclusion( @laCodeLines, lnCodeLines, .F., @laBloquesExclusion, @lnBloquesExclusion ) *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo de cada clase - THIS.identificarBloquesDeCodigo( @laCode, @laUbicacionBloquesExclusion, @toModulo ) + THIS.identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @toModulo ) THIS.escribirArchivoBin( @toModulo ) @@ -2166,7 +2706,7 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin CATCH TO loEx lnCodError = loEx.ERRORNO - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -2209,11 +2749,11 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin *-- Scale Scale de la clase (pixels, foxels) *-- Definicion La definición de la clase (ej: "AS Custom OF LIBRERIA.VCX") *-- Inicio/Fin Línea de inicio/fin de la clase (DEFINE CLASS/ENDDEFINE) - *-- Ini_Cab/Fin_Cab Línea de inicio/fin de la cabecera (def.propiedades, Hidden, Protected, #Include, CLASSDATA, DEFINED_PEM) + *-- Ini_Cab/Fin_Cab Línea de inicio/fin de la cabecera (def.propiedades, Hidden, Protected, #Include, CLASSDATA, DEFINED_PAM) *-- Ini_Cuerpo/Fin_Cuerpo Línea de inicio/fin del cuerpo (ADD OBJECTs y PROCEDURES) *-- HiddenProps Propiedades definidas como HIDDEN (ocultas) *-- ProtectedProps Propiedades definidas como PROTECTED (protegidas) - *-- Defined_PEM Propiedades, eventos o métodos definidos por el usuario + *-- Defined_PAM Propiedades, eventos o métodos definidos por el usuario *-- IncludeFile Nombre del archivo de inclusión *-- Props_Count Cantidad de propiedades de la clase definicas en el array props[] *-- Props[1,2] Array con todas las propiedades de la clase y sus valores. (col.1=Nombre, col.2=Comentario) @@ -2298,18 +2838,18 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin , loClase._ObjName ; , loClase._Parent ; , THIS.classProps2Memo( loClase ) ; - , THIS.hiddenAndProtected_PEM( loClase ) ; + , THIS.hiddenAndProtected_PAM( loClase ) ; , THIS.classMethods2Memo( loClase ) ; , loClase._Ole ; , loClase._Ole2 ; , 'Class' ; , TRANSFORM( loClase._AddObject_Count + 1 ) ; - , THIS.defined_PEM2Memo( loClase ) ; + , THIS.defined_PAM2Memo( loClase ) ; , loClase._ClassIcon ; , loClase._ProjectClassIcon ; , loClase._Scale ; , loClase._Comentario ; - , loClase._IncludeFile ; + , loClase._includeFile ; , loClase._User ) @@ -2367,13 +2907,13 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin ENDFOR && I = 1 TO toModulo._Clases_Count USE IN (SELECT("TABLABIN")) - COMPILE CLASSLIB (THIS.c_outputFile) + COMPILE CLASSLIB (THIS.c_OutputFile) CATCH TO loEx lnCodError = loEx.ERRORNO - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -2405,20 +2945,20 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin DODEFAULT() TRY - LOCAL lnCodError, loEx AS EXCEPTION, loReg, lcLine, laCode(1), lnCodeLines, lnFB2P_Version, lcSourceFile ; - , laUbicacionBloquesExclusion(1,2), I, toModulo + LOCAL lnCodError, loEx AS EXCEPTION, loReg, lcLine, laCodeLines(1), lnCodeLines, lnFB2P_Version, lcSourceFile ; + , laBloquesExclusion(1,2), lnBloquesExclusion, I, toModulo 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( laCode, C_FB2PRG_CODE ) + C_FB2PRG_CODE = FILETOSTR( THIS.c_InputFile ) + lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) *-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF - THIS.identificarBloquesDeExclusion( @laCode, .F., @laUbicacionBloquesExclusion ) + THIS.identificarBloquesDeExclusion( @laCodeLines, lnCodeLines, .F., @laBloquesExclusion, @lnBloquesExclusion ) *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo de cada clase - THIS.identificarBloquesDeCodigo( @laCode, @laUbicacionBloquesExclusion, @toModulo ) + THIS.identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @toModulo ) THIS.escribirArchivoBin( @toModulo ) @@ -2426,7 +2966,7 @@ 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 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -2469,11 +3009,11 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin *-- Scale Scale de la clase (pixels, foxels) *-- Definicion La definición de la clase (ej: "AS Custom OF LIBRERIA.VCX") *-- Inicio/Fin Línea de inicio/fin de la clase (DEFINE CLASS/ENDDEFINE) - *-- Ini_Cab/Fin_Cab Línea de inicio/fin de la cabecera (def.propiedades, Hidden, Protected, #Include, CLASSDATA, DEFINED_PEM) + *-- Ini_Cab/Fin_Cab Línea de inicio/fin de la cabecera (def.propiedades, Hidden, Protected, #Include, CLASSDATA, DEFINED_PAM) *-- Ini_Cuerpo/Fin_Cuerpo Línea de inicio/fin del cuerpo (ADD OBJECTs y PROCEDURES) *-- HiddenProps Propiedades definidas como HIDDEN (ocultas) *-- ProtectedProps Propiedades definidas como PROTECTED (protegidas) - *-- Defined_PEM Propiedades, eventos o métodos definidos por el usuario + *-- Defined_PAM Propiedades, eventos o métodos definidos por el usuario *-- IncludeFile Nombre del archivo de inclusión *-- Props_Count Cantidad de propiedades de la clase definicas en el array props[] *-- Props[1,2] Array con todas las propiedades de la clase y sus valores. (col.1=Nombre, col.2=Comentario) @@ -2519,8 +3059,8 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin THIS.createForm() *-- El SCX tiene el INCLUDE en el primer registro - IF NOT EMPTY(THIS.includeFile) - REPLACE RESERVED8 WITH THIS.includeFile + IF NOT EMPTY(toModulo._includeFile) + REPLACE RESERVED8 WITH toModulo._includeFile ENDIF @@ -2563,18 +3103,18 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin , loClase._ObjName ; , loClase._Parent ; , THIS.classProps2Memo( loClase ) ; - , THIS.hiddenAndProtected_PEM( loClase ) ; + , THIS.hiddenAndProtected_PAM( loClase ) ; , THIS.classMethods2Memo( loClase ) ; , loClase._Ole ; , loClase._Ole2 ; , '' ; , TRANSFORM( loClase._AddObject_Count + 1 ) ; - , THIS.defined_PEM2Memo( loClase ) ; + , THIS.defined_PAM2Memo( loClase ) ; , loClase._ClassIcon ; , loClase._ProjectClassIcon ; , loClase._Scale ; , loClase._Comentario ; - , loClase._IncludeFile ; + , loClase._includeFile ; , loClase._User ) @@ -2634,13 +3174,13 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin ENDFOR && I = 1 TO toModulo._Clases_Count USE IN (SELECT("TABLABIN")) - COMPILE FORM (THIS.c_outputFile) + COMPILE FORM (THIS.c_OutputFile) CATCH TO loEx lnCodError = loEx.ERRORNO - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -2680,21 +3220,21 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin DODEFAULT() TRY - LOCAL lnCodError, loEx AS EXCEPTION, loReg, lcLine, laCode(1), lnCodeLines, lnFB2P_Version, lcSourceFile ; - , laUbicacionBloquesExclusion(1,2), I ; + 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' 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( laCode, C_FB2PRG_CODE ) + C_FB2PRG_CODE = FILETOSTR( THIS.c_InputFile ) + lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) *-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF - *THIS.identificarBloquesDeExclusion( @laCode, .F., @laUbicacionBloquesExclusion ) + *THIS.identificarBloquesDeExclusion( @laCodeLines, .F., @laBloquesExclusion, @lnBloquesExclusion ) *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo de cada clase - THIS.identificarBloquesDeCodigo( @laCode, @laUbicacionBloquesExclusion, @loProject ) + THIS.identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @loProject ) THIS.escribirArchivoBin( @loProject ) @@ -2702,7 +3242,7 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin CATCH TO loEx lnCodError = loEx.ERRORNO - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -2738,33 +3278,6 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin lcMainProg = LOWER( SYS(2014, toProject._MainProg, ADDBS(JUSTPATH(toProject._HomeDir)) ) ) ENDIF - *-- Actualizo información del HEADER - *SCATTER FIELDS DEVINFO,RESERVED2,CMNTSTYLE,NOLOGO,SAVECODE MEMO NAME loReg - *loReg.DEVINFO = toProject.getRowDeviceInfo() - *loServerHead = toProject._ServerHead - *loReg.RESERVED2 = loServerHead.getRowServerInfo() - *loReg.CMNTSTYLE = toProject._CmntStyle - *loReg.NOLOGO = toProject._NoLogo - *loReg.SAVECODE = toProject._SaveCode - *GATHER NAME loReg FIELDS DEVINFO,RESERVED2,CMNTSTYLE,NOLOGO,SAVECODE MEMO - - *-- Si hay ProjectHook, reutilizo registro del archivo dummy - *GOTO RECORD 2 - - *IF EMPTY(toProject._ProjectHookLibrary) - * *-- Erase Dummy file record '__newproject.f2b' - * DELETE - *ELSE - * *-- PROJECT HOOK - * REPLACE ; - * NAME WITH toProject._ProjectHookLibrary + CHR(0), ; - * TYPE WITH 'W', ; - * EXCLUDE WITH .T., ; - * KEY WITH UPPER(JUSTSTEM(toProject._ProjectHookLibrary)), ; - * RESERVED1 WITH toProject._ProjectHookClass + CHR(0) - *ENDIF - - *-- Si hay ProjectHook de proyecto, lo inserto IF NOT EMPTY(toProject._ProjectHookLibrary) INSERT INTO TABLABIN ; @@ -2830,7 +3343,7 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin CATCH TO loEx lnCodError = loEx.ERRORNO - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -2847,69 +3360,69 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin ******************************************************************************************************************* PROCEDURE identificarBloquesDeCodigo - LPARAMETERS ta_Lineas, ta_Pos_BloquesExclusion, toProject + LPARAMETERS taCodeLines, tnCodeLines, taBloquesExclusion, tnBloquesExclusion, toProject *-------------------------------------------------------------------------------------------------------------- - * ta_Lineas (!@ IN ) El array con las líneas del bloque de texto donde buscar - * ta_Pos_BloquesExclusion (!@ IN ) Array con las posiciones de inicio/fin de los bloques de exclusion + * taCodeLines (!@ IN ) El array con las líneas del código donde buscar + * tnCodeLines (!@ IN ) Cantidad de líneas de código + * taBloquesExclusion (!@ IN ) Array con las posiciones de inicio/fin de los bloques de exclusion + * tnBloquesExclusion (!@ IN ) Cantidad de bloques de exclusión * toProject (?@ OUT) Objeto con toda la información del proyecto analizado * * NOTA: * Como identificador se usa el nombre de clase o de procedimiento, según corresponda. *-------------------------------------------------------------------------------------------------------------- - EXTERNAL ARRAY ta_Lineas, ta_Pos_BloquesExclusion + EXTERNAL ARRAY taCodeLines, taBloquesExclusion #IF .F. LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' #ENDIF TRY - LOCAL I, lc_Comentario, lcLine, lnLineas, llBuildProj_Completed, llDevInfo_Completed ; + LOCAL I, lc_Comentario, lcLine, llBuildProj_Completed, llDevInfo_Completed ; , llServerHead_Completed, llFileComments_Completed, llFoxBin2Prg_Completed ; , llExcludedFiles_Completed, llTextFiles_Completed, llProjectProperties_Completed - DIMENSION ta_Ubicacion_Bloques(1,2) STORE 0 TO I - THIS.c_Type = UPPER(JUSTEXT(THIS.c_outputFile)) - lnLineas = ALEN(ta_Lineas,1) + THIS.c_Type = UPPER(JUSTEXT(THIS.c_OutputFile)) - IF lnLineas > 1 + IF tnCodeLines > 1 toProject = CREATEOBJECT('CL_PROJECT') - toProject._HomeDir = ADDBS(JUSTPATH(THIS.c_outputFile)) + toProject._HomeDir = ADDBS(JUSTPATH(THIS.c_OutputFile)) WITH THIS - FOR I = 1 TO lnLineas - lcLine = LTRIM( ta_Lineas(I), 0, ' ', CHR(9) ) + FOR I = 1 TO tnCodeLines + .set_Line( @lcLine, @taCodeLines, I ) - IF .lineIsOnlyComment( @lcLine, @lc_Comentario ) && Vacía o solo Comentarios + IF .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Vacía o solo Comentarios LOOP ENDIF DO CASE - CASE NOT llFoxBin2Prg_Completed AND .analizarBloque_FoxBin2Prg( toProject, @lcLine, @ta_Lineas, @I, lnLineas ) + CASE NOT llFoxBin2Prg_Completed AND .analizarBloque_FoxBin2Prg( toProject, @lcLine, @taCodeLines, @I, tnCodeLines ) llFoxBin2Prg_Completed = .T. - CASE NOT llDevInfo_Completed AND .analizarBloque_DevInfo( toProject, @lcLine, @ta_Lineas, @I, lnLineas ) + CASE NOT llDevInfo_Completed AND .analizarBloque_DevInfo( toProject, @lcLine, @taCodeLines, @I, tnCodeLines ) llDevInfo_Completed = .T. - CASE NOT llServerHead_Completed AND .analizarBloque_ServerHead( toProject, @lcLine, @ta_Lineas, @I, lnLineas ) + CASE NOT llServerHead_Completed AND .analizarBloque_ServerHead( toProject, @lcLine, @taCodeLines, @I, tnCodeLines ) llServerHead_Completed = .T. - CASE .analizarBloque_ServerData( toProject, @lcLine, @ta_Lineas, @I, lnLineas ) + CASE .analizarBloque_ServerData( toProject, @lcLine, @taCodeLines, @I, tnCodeLines ) *-- Puede haber varios servidores, por eso se siguen valuando - CASE NOT llBuildProj_Completed AND .analizarBloque_BuildProj( toProject, @lcLine, @ta_Lineas, @I, lnLineas ) + CASE NOT llBuildProj_Completed AND .analizarBloque_BuildProj( toProject, @lcLine, @taCodeLines, @I, tnCodeLines ) llBuildProj_Completed = .T. - CASE NOT llFileComments_Completed AND .analizarBloque_FileComments( toProject, @lcLine, @ta_Lineas, @I, lnLineas ) + CASE NOT llFileComments_Completed AND .analizarBloque_FileComments( toProject, @lcLine, @taCodeLines, @I, tnCodeLines ) llFileComments_Completed = .T. - CASE NOT llExcludedFiles_Completed AND .analizarBloque_ExcludedFiles( toProject, @lcLine, @ta_Lineas, @I, lnLineas ) + CASE NOT llExcludedFiles_Completed AND .analizarBloque_ExcludedFiles( toProject, @lcLine, @taCodeLines, @I, tnCodeLines ) llExcludedFiles_Completed = .T. - CASE NOT llTextFiles_Completed AND .analizarBloque_TextFiles( toProject, @lcLine, @ta_Lineas, @I, lnLineas ) + CASE NOT llTextFiles_Completed AND .analizarBloque_TextFiles( toProject, @lcLine, @taCodeLines, @I, tnCodeLines ) llTextFiles_Completed = .T. - CASE NOT llProjectProperties_Completed AND .analizarBloque_ProjectProperties( toProject, @lcLine, @ta_Lineas, @I, lnLineas ) + CASE NOT llProjectProperties_Completed AND .analizarBloque_ProjectProperties( toProject, @lcLine, @taCodeLines, @I, tnCodeLines ) llProjectProperties_Completed = .T. ENDCASE @@ -2919,9 +3432,7 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin ENDIF CATCH TO loEx - lnCodError = loEx.ERRORNO - - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -2938,33 +3449,32 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin *------------------------------------------------------ *-- Analiza el bloque *------------------------------------------------------ - LPARAMETERS toProject, tcLine, ta_Lineas, I, tnLineas + LPARAMETERS toProject, tcLine, taCodeLines, I, tnCodeLines #IF .F. LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' #ENDIF TRY - LOCAL llBloqueEncontrado, lcComment, lcMetadatos, X, luValor ; - , laPropsAndValues_List(1,2), lnPropsAndValues_Count ; + LOCAL llBloqueEncontrado, lcComment, lcMetadatos, luValor ; + , laPropsAndValues(1,2), lnPropsAndValues_Count ; , loFile AS CL_PROJ_FILE OF 'FOXBIN2PRG.PRG' IF LEFT( tcLine, LEN(C_BUILDPROJ_I) ) == C_BUILDPROJ_I llBloqueEncontrado = .T. STORE NULL TO loProject, loFile - X = I + 1 WITH THIS - FOR I = X TO tnLineas + FOR I = I + 1 TO tnCodeLines lcComment = '' - tcLine = LTRIM( ta_Lineas(I), 0, ' ', CHR(9) ) + .set_Line( @tcLine, @taCodeLines, I ) DO CASE CASE LEFT( tcLine, LEN(C_BUILDPROJ_F) ) == C_BUILDPROJ_F I = I + 1 EXIT - CASE .lineIsOnlyComment( @tcLine, @lcComment ) + CASE .lineIsOnlyCommentAndNoMetadata( @tcLine, @lcComment ) LOOP && Saltear comentarios CASE UPPER( LEFT( tcLine, 14 ) ) == 'BUILD PROJECT ' @@ -2978,14 +3488,14 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin *-- Obtengo metadatos de los comentarios de FileMetadata: *< FileMetadata: Type="V" Cpid="1252" Timestamp="1131901580" ID="1129207528" ObjRev="544" /> - .get_ListNamesWithValuesFrom_InLine_MetadataTag( @lcComment, @laPropsAndValues_List ; + .get_ListNamesWithValuesFrom_InLine_MetadataTag( @lcComment, @laPropsAndValues ; , @lnPropsAndValues_Count, C_FILE_META_I, C_FILE_META_F ) - loFile._Type = .get_ValueByName_FromListNamesWithValues( 'Type', 'C', @laPropsAndValues_List ) - loFile._CPID = .get_ValueByName_FromListNamesWithValues( 'CPID', 'I', @laPropsAndValues_List ) - loFile._TimeStamp = .get_ValueByName_FromListNamesWithValues( 'Timestamp', 'I', @laPropsAndValues_List ) - loFile._ID = .get_ValueByName_FromListNamesWithValues( 'ID', 'I', @laPropsAndValues_List ) - loFile._ObjRev = .get_ValueByName_FromListNamesWithValues( 'ObjRev', 'I', @laPropsAndValues_List ) + loFile._Type = .get_ValueByName_FromListNamesWithValues( 'Type', 'C', @laPropsAndValues ) + loFile._CPID = .get_ValueByName_FromListNamesWithValues( 'CPID', 'I', @laPropsAndValues ) + loFile._TimeStamp = .get_ValueByName_FromListNamesWithValues( 'Timestamp', 'I', @laPropsAndValues ) + loFile._ID = .get_ValueByName_FromListNamesWithValues( 'ID', 'I', @laPropsAndValues ) + loFile._ObjRev = .get_ValueByName_FromListNamesWithValues( 'ObjRev', 'I', @laPropsAndValues ) toProject.ADD( loFile, loFile._Name ) ENDCASE @@ -2996,9 +3506,7 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin ENDIF CATCH TO loEx - lnCodError = loEx.ERRORNO - - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -3015,30 +3523,28 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin *------------------------------------------------------ *-- Analiza el bloque *------------------------------------------------------ - LPARAMETERS toProject, tcLine, ta_Lineas, I, tnLineas + LPARAMETERS toProject, tcLine, taCodeLines, I, tnCodeLines #IF .F. LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' #ENDIF TRY - LOCAL llBloqueEncontrado, X ; + LOCAL llBloqueEncontrado ; , loServerHead AS CL_PROJ_SRV_HEAD OF 'FOXBIN2PRG.PRG' IF LEFT( tcLine, LEN(C_DEVINFO_I) ) == C_DEVINFO_I llBloqueEncontrado = .T. - X = I + 1 - - FOR I = X TO tnLineas - tcLine = LTRIM( ta_Lineas(I), 0, ' ', CHR(9) ) + FOR I = I + 1 TO tnCodeLines + .set_Line( @tcLine, @taCodeLines, I ) DO CASE CASE LEFT( tcLine, LEN(C_DEVINFO_F) ) == C_DEVINFO_F I = I + 1 EXIT - CASE THIS.lineIsOnlyComment( @tcLine ) + CASE THIS.lineIsOnlyCommentAndNoMetadata( @tcLine ) LOOP && Saltear comentarios OTHERWISE @@ -3050,9 +3556,7 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin ENDIF CATCH TO loEx - lnCodError = loEx.ERRORNO - - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -3069,14 +3573,14 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin *------------------------------------------------------ *-- Analiza el bloque *------------------------------------------------------ - LPARAMETERS toProject, tcLine, ta_Lineas, I, tnLineas + LPARAMETERS toProject, tcLine, taCodeLines, I, tnCodeLines #IF .F. LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' #ENDIF TRY - LOCAL llBloqueEncontrado, X ; + LOCAL llBloqueEncontrado ; , loServerHead AS CL_PROJ_SRV_HEAD OF 'FOXBIN2PRG.PRG' IF LEFT( tcLine, LEN(C_SRV_HEAD_I) ) == C_SRV_HEAD_I @@ -3084,17 +3588,16 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin STORE NULL TO loServerHead, loServerData loServerHead = toProject._ServerHead - X = I + 1 - FOR I = X TO tnLineas - tcLine = LTRIM( ta_Lineas(I), 0, ' ', CHR(9) ) + FOR I = I + 1 TO tnCodeLines + .set_Line( @tcLine, @taCodeLines, I ) DO CASE CASE LEFT( tcLine, LEN(C_SRV_HEAD_F) ) == C_SRV_HEAD_F I = I + 1 EXIT - CASE THIS.lineIsOnlyComment( @tcLine ) + CASE THIS.lineIsOnlyCommentAndNoMetadata( @tcLine ) LOOP && Saltear comentarios OTHERWISE @@ -3106,9 +3609,7 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin ENDIF CATCH TO loEx - lnCodError = loEx.ERRORNO - - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -3125,14 +3626,14 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin *------------------------------------------------------ *-- Analiza el bloque *------------------------------------------------------ - LPARAMETERS toProject, tcLine, ta_Lineas, I, tnLineas + LPARAMETERS toProject, tcLine, taCodeLines, I, tnCodeLines #IF .F. LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' #ENDIF TRY - LOCAL llBloqueEncontrado, X ; + LOCAL llBloqueEncontrado ; , loServerHead AS CL_PROJ_SRV_HEAD OF 'FOXBIN2PRG.PRG' ; , loServerData AS CL_PROJ_SRV_DATA OF 'FOXBIN2PRG.PRG' @@ -3142,17 +3643,16 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin STORE NULL TO loServerHead, loServerData loServerHead = toProject._ServerHead loServerData = loServerHead.getServerDataObject() - X = I + 1 - FOR I = X TO tnLineas - tcLine = LTRIM( ta_Lineas(I), 0, ' ', CHR(9) ) + FOR I = I + 1 TO tnCodeLines + .set_Line( @tcLine, @taCodeLines, I ) DO CASE CASE LEFT( tcLine, LEN(C_SRV_DATA_F) ) == C_SRV_DATA_F I = I + 1 EXIT - CASE THIS.lineIsOnlyComment( @tcLine ) + CASE THIS.lineIsOnlyCommentAndNoMetadata( @tcLine ) LOOP && Saltear comentarios OTHERWISE @@ -3165,9 +3665,7 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin ENDIF CATCH TO loEx - lnCodError = loEx.ERRORNO - - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -3184,7 +3682,7 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin *------------------------------------------------------ *-- Analiza el bloque *------------------------------------------------------ - LPARAMETERS toProject, tcLine, ta_Lineas, I, tnLineas + LPARAMETERS toProject, tcLine, taCodeLines, I, tnCodeLines EXTERNAL ARRAY toProject #IF .F. @@ -3192,22 +3690,21 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin #ENDIF TRY - LOCAL llBloqueEncontrado, X, lcFile, lcComment ; + LOCAL llBloqueEncontrado, lcFile, lcComment ; , loFile AS CL_PROJ_FILE OF 'FOXBIN2PRG.PRG' IF LEFT( tcLine, LEN(C_FILE_CMTS_I) ) == C_FILE_CMTS_I llBloqueEncontrado = .T. - X = I + 1 - FOR I = X TO tnLineas - tcLine = LTRIM( ta_Lineas(I), 0, ' ', CHR(9) ) + FOR I = I + 1 TO tnCodeLines + .set_Line( @tcLine, @taCodeLines, I ) DO CASE CASE LEFT( tcLine, LEN(C_FILE_CMTS_F) ) == C_FILE_CMTS_F I = I + 1 EXIT - CASE THIS.lineIsOnlyComment( @tcLine ) + CASE THIS.lineIsOnlyCommentAndNoMetadata( @tcLine ) LOOP && Saltear comentarios OTHERWISE @@ -3223,9 +3720,7 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin ENDIF CATCH TO loEx - lnCodError = loEx.ERRORNO - - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -3242,7 +3737,7 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin *------------------------------------------------------ *-- Analiza el bloque *------------------------------------------------------ - LPARAMETERS toProject, tcLine, ta_Lineas, I, tnLineas + LPARAMETERS toProject, tcLine, taCodeLines, I, tnCodeLines EXTERNAL ARRAY toProject #IF .F. @@ -3250,22 +3745,21 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin #ENDIF TRY - LOCAL llBloqueEncontrado, X, lcFile, llExclude ; + LOCAL llBloqueEncontrado, lcFile, llExclude ; , loFile AS CL_PROJ_FILE OF 'FOXBIN2PRG.PRG' IF LEFT( tcLine, LEN(C_FILE_EXCL_I) ) == C_FILE_EXCL_I llBloqueEncontrado = .T. - X = I + 1 - FOR I = X TO tnLineas - tcLine = LTRIM( ta_Lineas(I), 0, ' ', CHR(9) ) + FOR I = I + 1 TO tnCodeLines + .set_Line( @tcLine, @taCodeLines, I ) DO CASE CASE LEFT( tcLine, LEN(C_FILE_EXCL_F) ) == C_FILE_EXCL_F I = I + 1 EXIT - CASE THIS.lineIsOnlyComment( @tcLine ) + CASE THIS.lineIsOnlyCommentAndNoMetadata( @tcLine ) LOOP && Saltear comentarios OTHERWISE @@ -3281,9 +3775,7 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin ENDIF CATCH TO loEx - lnCodError = loEx.ERRORNO - - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -3300,7 +3792,7 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin *------------------------------------------------------ *-- Analiza el bloque *------------------------------------------------------ - LPARAMETERS toProject, tcLine, ta_Lineas, I, tnLineas + LPARAMETERS toProject, tcLine, taCodeLines, I, tnCodeLines EXTERNAL ARRAY toProject #IF .F. @@ -3308,22 +3800,21 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin #ENDIF TRY - LOCAL llBloqueEncontrado, X, lcFile, lcType ; + LOCAL llBloqueEncontrado, lcFile, lcType ; , loFile AS CL_PROJ_FILE OF 'FOXBIN2PRG.PRG' IF LEFT( tcLine, LEN(C_FILE_TXT_I) ) == C_FILE_TXT_I llBloqueEncontrado = .T. - X = I + 1 - FOR I = X TO tnLineas - tcLine = LTRIM( ta_Lineas(I), 0, ' ', CHR(9) ) + FOR I = I + 1 TO tnCodeLines + .set_Line( @tcLine, @taCodeLines, I ) DO CASE CASE LEFT( tcLine, LEN(C_FILE_TXT_F) ) == C_FILE_TXT_F I = I + 1 EXIT - CASE THIS.lineIsOnlyComment( @tcLine ) + CASE THIS.lineIsOnlyCommentAndNoMetadata( @tcLine ) LOOP && Saltear comentarios OTHERWISE @@ -3339,9 +3830,7 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin ENDIF CATCH TO loEx - lnCodError = loEx.ERRORNO - - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -3358,28 +3847,27 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin *------------------------------------------------------ *-- Analiza el bloque *------------------------------------------------------ - LPARAMETERS toProject, tcLine, ta_Lineas, I, tnLineas + LPARAMETERS toProject, tcLine, taCodeLines, I, tnCodeLines #IF .F. LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' #ENDIF TRY - LOCAL llBloqueEncontrado, X, lcLine + LOCAL llBloqueEncontrado, lcLine IF LEFT( tcLine, LEN(C_PROJPROPS_I) ) == C_PROJPROPS_I llBloqueEncontrado = .T. - X = I + 1 - FOR I = X TO tnLineas - tcLine = LTRIM( ta_Lineas(I), 0, ' ', CHR(9) ) + FOR I = I + 1 TO tnCodeLines + .set_Line( @tcLine, @taCodeLines, I ) DO CASE CASE LEFT( tcLine, LEN(C_PROJPROPS_F) ) == C_PROJPROPS_F I = I + 1 EXIT - CASE THIS.lineIsOnlyComment( @tcLine ) + CASE THIS.lineIsOnlyCommentAndNoMetadata( @tcLine ) LOOP && Saltear comentarios CASE LEFT( tcLine ,2 ) == '*<' @@ -3403,9 +3891,7 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin ENDIF CATCH TO loEx - lnCodError = loEx.ERRORNO - - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -3435,12 +3921,12 @@ DEFINE CLASS c_conversor_vcx_a_prg AS c_conversor_bin_a_prg TRY LOCAL lnCodError, loEx AS EXCEPTION, loRegClass, loRegObj, lnMethodCount, laMethods(1), laCode(1), laProtected(1) ; - , laProps(1), laPropsWithComments(1), lnLastClass, lnRecno, lcMethods, lcObjName, la_NombresObjsOle(1) + , laPropsAndValues(1), laPropsAndComments(1), lnLastClass, lnRecno, lcMethods, lcObjName, la_NombresObjsOle(1) STORE 0 TO lnCodError, lnLastClass - STORE '' TO laMethods(1), laCode(1), laProtected(1), laPropsWithComments(1) + STORE '' TO laMethods(1), laCode(1), laProtected(1), laPropsAndComments(1) STORE NULL TO loRegClass, loRegObj - USE (THIS.c_inputFile) SHARED NOUPDATE ALIAS TABLABIN + USE (THIS.c_InputFile) SHARED NOUPDATE ALIAS TABLABIN *IF FILE('C_SUB_OBJS.CDX') * ERASE 'C_SUB_OBJS.CDX' @@ -3477,7 +3963,7 @@ DEFINE CLASS c_conversor_vcx_a_prg AS c_conversor_bin_a_prg THIS.write_INCLUDE( @loRegClass ) - THIS.write_CLASS_PROPERTIES( @loRegClass, @laProps, @laPropsWithComments, @laProtected ) + THIS.write_CLASS_PROPERTIES( @loRegClass, @laPropsAndValues, @laPropsAndComments, @laProtected ) *------------------------------------------------------------------------------- @@ -3500,7 +3986,7 @@ DEFINE CLASS c_conversor_vcx_a_prg AS c_conversor_bin_a_prg lcMethods = '' THIS.SortMethod( loRegClass.METHODS, @laMethods, @laCode, '', @lnMethodCount ) - THIS.write_CLASS_METHODS( @lnMethodCount, @laMethods, @laCode, @laProtected, @laPropsWithComments ) + THIS.write_CLASS_METHODS( @lnMethodCount, @laMethods, @laCode, @laProtected, @laPropsAndComments ) lnLastClass = 1 lcMethods = '' @@ -3525,12 +4011,12 @@ DEFINE CLASS c_conversor_vcx_a_prg AS c_conversor_bin_a_prg THIS.write_ENDDEFINE_SiCorresponde( lnLastClass ) *-- Genero el VC2 - STRTOFILE( C_FB2PRG_CODE, THIS.c_outputFile ) + STRTOFILE( C_FB2PRG_CODE, THIS.c_OutputFile ) CATCH TO loEx lnCodError = loEx.ERRORNO - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -3562,12 +4048,12 @@ DEFINE CLASS c_conversor_scx_a_prg AS c_conversor_bin_a_prg TRY LOCAL lnCodError, loEx AS EXCEPTION, loRegClass, loRegObj, lnMethodCount, laMethods(1), laCode(1), laProtected(1) ; - , laProps(1), laPropsWithComments(1), lnLastClass, lnRecno, lcMethods, lcObjName, la_NombresObjsOle(1) + , laPropsAndValues(1), laPropsAndComments(1), lnLastClass, lnRecno, lcMethods, lcObjName, la_NombresObjsOle(1) STORE 0 TO lnCodError, lnLastClass - STORE '' TO laMethods(1), laCode(1), laProtected(1), laPropsWithComments(1) + STORE '' TO laMethods(1), laCode(1), laProtected(1), laPropsAndComments(1) STORE NULL TO loRegClass, loRegObj - USE (THIS.c_inputFile) SHARED NOUPDATE ALIAS TABLABIN + USE (THIS.c_InputFile) SHARED NOUPDATE ALIAS TABLABIN *IF FILE('C_SUB_OBJS.CDX') * ERASE 'C_SUB_OBJS.CDX' @@ -3592,8 +4078,6 @@ DEFINE CLASS c_conversor_scx_a_prg AS c_conversor_bin_a_prg SET ORDER TO PARENT_OBJ GOTO RECORD 1 - *-- #INCLUDE - *FDB* SCATTER FIELDS RESERVED8 MEMO NAME loRegClass IF NOT EMPTY(loRegClass.RESERVED8) THEN @@ -3620,7 +4104,7 @@ DEFINE CLASS c_conversor_scx_a_prg AS c_conversor_bin_a_prg THIS.write_INCLUDE( @loRegClass ) - THIS.write_CLASS_PROPERTIES( @loRegClass, @laProps, @laPropsWithComments, @laProtected ) + THIS.write_CLASS_PROPERTIES( @loRegClass, @laPropsAndValues, @laPropsAndComments, @laProtected ) *------------------------------------------------------------------------------- @@ -3643,7 +4127,7 @@ DEFINE CLASS c_conversor_scx_a_prg AS c_conversor_bin_a_prg lcMethods = '' THIS.SortMethod( loRegClass.METHODS, @laMethods, @laCode, '', @lnMethodCount ) - THIS.write_CLASS_METHODS( @lnMethodCount, @laMethods, @laCode, @laProtected, @laPropsWithComments ) + THIS.write_CLASS_METHODS( @lnMethodCount, @laMethods, @laCode, @laProtected, @laPropsAndComments ) lnLastClass = 1 lcMethods = '' @@ -3670,12 +4154,12 @@ DEFINE CLASS c_conversor_scx_a_prg AS c_conversor_bin_a_prg THIS.write_ENDDEFINE_SiCorresponde( lnLastClass ) *-- Genero el SC2 - STRTOFILE( C_FB2PRG_CODE, THIS.c_outputFile ) + STRTOFILE( C_FB2PRG_CODE, THIS.c_OutputFile ) CATCH TO loEx lnCodError = loEx.ERRORNO - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -3709,7 +4193,7 @@ DEFINE CLASS c_conversor_pjx_a_prg AS c_conversor_bin_a_prg * (ES) AUTOGENERADO - PARA MANTENER INFORMACIÓN DE SERVIDORES DLL USAR "FOXBIN2PRG", SI NO IMPORTAN, EJECUTAR DIRECTAMENTE PARA REGENERAR EL PROYECTO. * (EN) AUTOGENERATED - TO KEEP DLL SERVER INFORMATION USE "FOXBIN2PRG", OTHERWISE YOU CAN EXECUTE DIRECTLY TO REGENERATE PROJECT. *-------------------------------------------------------------------------------------------------------------------------------------------------------- - <> Version="<>" SourceFile="<>" <> + <> Version="<>" SourceFile="<>" <> (Para uso con Visual FoxPro 9.0) * ENDTEXT ENDPROC @@ -3727,7 +4211,7 @@ DEFINE CLASS c_conversor_pjx_a_prg AS c_conversor_bin_a_prg , loServerData AS CL_PROJ_SRV_DATA OF 'FOXBIN2PRG.PRG' STORE NULL TO loProject, loReg, loServerHead, loServerData - USE (THIS.c_inputFile) SHARED NOUPDATE ALIAS TABLABIN + USE (THIS.c_InputFile) SHARED NOUPDATE ALIAS TABLABIN loServerHead = CREATEOBJECT('CL_PROJ_SRV_HEAD') @@ -3962,7 +4446,7 @@ DEFINE CLASS c_conversor_pjx_a_prg AS c_conversor_bin_a_prg *-- Genero el PJ2 - STRTOFILE( C_FB2PRG_CODE, THIS.c_outputFile ) + STRTOFILE( C_FB2PRG_CODE, THIS.c_OutputFile ) *COMPILE ( THIS.c_outputFile ) @@ -3974,7 +4458,7 @@ DEFINE CLASS c_conversor_pjx_a_prg AS c_conversor_bin_a_prg loEx.USERVALUE = 'Archivo duplicado: ' + loReg.NAME ENDCASE - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -3996,28 +4480,32 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base LOCAL THIS AS c_conversor_bin_a_prg OF 'FOXBIN2PRG.PRG' #ENDIF _MEMBERDATA = [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; + [] ; - + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + [] ; + [] ; - + [] ; + [] ; - + [] ; - + [] ; + + [] ; + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + [] @@ -4085,15 +4573,15 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base *-- Genero el método SIN indentar, ya que se hace luego TEXT TO tcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - PROCEDURE <> + <<'PROCEDURE'>> <> <> - ENDPROC + <<'ENDPROC'>> ENDTEXT ENDFOR ENDIF CATCH TO loEx - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -4113,12 +4601,12 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base #ENDIF TRY - LOCAL lcMemo, laProps(1,2), lnLineCount + LOCAL lcMemo, laPropsAndValues(1,2), lnPropsAndValues_Count *-- Defino los objetos a cargar - THIS.SortNames( toRegObj.PROPERTIES, @laProps, @lnLineCount, @lcMemo ) + THIS.get_PropsAndValuesFrom_PROPERTIES( toRegObj.PROPERTIES, .T., @laPropsAndValues, @lnPropsAndValues_Count, @lcMemo ) *lcMemo = THIS.set_MultilineMemoWithAddObjectProperties( lcMemo, C_TAB + C_TAB, .T. ) - lcMemo = THIS.set_MultilineMemoWithAddObjectProperties( @laProps, @lnLineCount, 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 @@ -4167,7 +4655,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDTEXT CATCH TO loEx - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -4180,10 +4668,10 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ******************************************************************************************************************* PROCEDURE write_CLASS_METHODS - LPARAMETERS tnMethodCount, taMethods, taCode, taProtected, taPropsWithComments + 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, taPropsWithComments + EXTERNAL ARRAY taMethods, taCode, taProtected, taPropsAndComments TRY LOCAL lcMethod, lnProtectedItem, lnCommentRow, lcProcDef, lcMethods @@ -4193,7 +4681,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base FOR I = 1 TO tnMethodCount lcMethod = CHRTRAN( taMethods(I,1), '^', '' ) lnProtectedItem = ASCAN( taProtected, taMethods(I,1), 1, 0, 0, 0) - lnCommentRow = ASCAN( taPropsWithComments, '*' + lcMethod, 1, 0, 1, 8) + lnCommentRow = ASCAN( taPropsAndComments, '*' + lcMethod, 1, 0, 1, 8) DO CASE CASE lnProtectedItem = 0 @@ -4215,9 +4703,9 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base <><> <> ENDTEXT - IF lnCommentRow > 0 AND NOT EMPTY(taPropsWithComments(lnCommentRow,2)) + IF lnCommentRow > 0 AND NOT EMPTY(taPropsAndComments(lnCommentRow,2)) TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 - <><>&& <> + <><>&& <> ENDTEXT ENDIF @@ -4235,7 +4723,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDIF CATCH TO loEx - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -4254,100 +4742,141 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base * (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="<>" <> + <> Version="<>" SourceFile="<>" <> (Para uso con Visual FoxPro 9.0) * ENDTEXT ENDPROC ******************************************************************************************************************* - PROCEDURE write_CLASS_PROPERTIES - LPARAMETERS toRegClass, taProps, taPropsWithComments, taProtected + PROCEDURE write_DEFINED_PAM + *-- Escribo propiedades DEFINED (Reserved3) en este formato: - EXTERNAL ARRAY taProps, taPropsWithComments + * + *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 + 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 + ENDFOR + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <><> + ENDTEXT + + ENDIF + 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_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_CLASS_PROPERTIES + LPARAMETERS toRegClass, taPropsAndValues, taPropsAndComments, taProtected + + EXTERNAL ARRAY taPropsAndValues, taPropsAndComments TRY - LOCAL lnLineCount, lcHiddenProp, lcProtectedProp, lcPropsMethodsDefd, lnComments, I ; + LOCAL lnPropsAndValues_Count, lcHiddenProp, lcProtectedProp, lcPropsMethodsDefd, lnPropsAndComments_Count, I ; , lcPropName, lnProtectedItem, lcComentarios WITH THIS - *-- DEFINIR PROPIEDADES ( HIDDEN, PROTECTED, *DEFINED_PEM ) + *-- DEFINIR PROPIEDADES ( HIDDEN, PROTECTED, *DEFINED_PAM ) DIMENSION taProtected(1) - THIS.SortNames( toRegClass.PROPERTIES, @taProps, @lnLineCount, '' ) STORE '' TO lcHiddenProp, lcProtectedProp, lcPropsMethodsDefd - THIS.Get_PropsWithComments( @taPropsWithComments, @lnComments, toRegClass.RESERVED3 ) - =ALINES(taProtected, toRegClass.PROTECTED) + THIS.get_PropsAndValuesFrom_PROPERTIES( toRegClass.PROPERTIES, .T., @taPropsAndValues, @lnPropsAndValues_Count, '' ) + THIS.get_PropsAndCommentsFrom_RESERVED3( toRegClass.RESERVED3, .T., @taPropsAndComments, @lnPropsAndComments_Count, '' ) + THIS.get_PropsFrom_PROTECTED( toRegClass.PROTECTED, .T., @taProtected, 0, '' ) - IF lnLineCount > 0 THEN - *-- Recorro las propiedades (campo Properties) - FOR I = 1 TO lnLineCount - *lcPropName = RTRIM( GETWORDNUM( taProps(I), 1, '=' ) ) - *lcPropName = taProps(I,1) - lnProtectedItem = ASCAN(taProtected, taProps(I,1), 1, 0, 0, 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 - *-- Ajustes de algunos casos especiales - *FDB* - *taProps(I) = THIS.normalizarAsignacion( taProps(I), @lcComentarios ) - taProps(I,2) = THIS.normalizarValorPropiedad( taProps(I,1), taProps(I,2), @lcComentarios ) - - *-- Estos comentarios solo son los generados como metadados por los autoajustes especiales - *IF NOT EMPTY( lcComentarios ) - * taProps(I) = taProps(I) + C_TAB + C_TAB + lcComentarios - *ENDIF + lnProtectedItem = ASCAN(taProtected, taPropsAndValues(I,1), 1, 0, 0, 0) DO CASE CASE lnProtectedItem = 0 *-- Propiedad común - CASE taProtected(lnProtectedItem) == taProps(I,1) + CASE taProtected(lnProtectedItem) == taPropsAndValues(I,1) *-- Propiedad protegida - lcProtectedProp = lcProtectedProp + ',' + taProps(I,1) + lcProtectedProp = lcProtectedProp + ',' + taPropsAndValues(I,1) - CASE taProtected(lnProtectedItem) == taProps(I,1) + '^' + CASE taProtected(lnProtectedItem) == taPropsAndValues(I,1) + '^' *-- Propiedad oculta - lcHiddenProp = lcHiddenProp + ',' + taProps(I,1) + lcHiddenProp = lcHiddenProp + ',' + taPropsAndValues(I,1) ENDCASE ENDFOR - *-- Escribo propiedades DEFINED (Reserved3) - IF NOT EMPTY(taPropsWithComments) - FOR I = 1 TO lnComments - lcPropsMethodsDefd = lcPropsMethodsDefd + ',' + taPropsWithComments(I,1) - 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 - ENDIF - - *-- Escribo propiedades HIDDEN - IF NOT EMPTY(lcHiddenProp) - TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <>HIDDEN <> - ENDTEXT - ENDIF - - *-- Escribo propiedades PROTECTED - IF NOT EMPTY(lcProtectedProp) - TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <>PROTECTED <> - ENDTEXT - ENDIF - - *-- Escribo las propiedades de la clase y sus comentarios - FOR I = 1 TO ALEN(taProps, 1) - *lcPropName = RTRIM( GETWORDNUM( taProps(I), 1, '=' ) ) - - TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <><> = <> + <><> = <> ENDTEXT - lnComment = ASCAN( taPropsWithComments, taProps(I,1), 1, 0, 1, 8) + lnComment = ASCAN( taPropsAndComments, taPropsAndValues(I,1), 1, 0, 1, 8) - IF lnComment > 0 AND NOT EMPTY(taPropsWithComments(lnComment,2)) + 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 @@ -4359,7 +4888,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDWITH && THIS CATCH TO loEx - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -4449,7 +4978,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base *-- 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 <> <> + <<'DEFINE CLASS'>> <> AS <> <> ENDTEXT ENDPROC @@ -4460,7 +4989,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base LPARAMETERS tnLastClass IF tnLastClass = 1 TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - ENDDEFINE + <<'ENDDEFINE'>> ENDTEXT ENDIF @@ -4531,7 +5060,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDTEXT CATCH TO loEx - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -4543,28 +5072,48 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ******************************************************************************************************************* - PROCEDURE Get_PropsWithComments( taLines, tnLines, tcMemo ) - EXTERNAL ARRAY taLines + 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 - tnLines = ALINES(laLines, tcMemo) - DIMENSION taLines(tnLines,2) + tcSortedMemo = '' + tnPropsAndComments_Count = ALINES(laLines, tcMemo) + DIMENSION taPropsAndComments(tnPropsAndComments_Count,2) - FOR I = 1 TO tnLines - lnPos = AT(' ', laLines(I)) + IF tnPropsAndComments_Count = 1 AND EMPTY(taPropsAndComments) + tnPropsAndComments_Count = 0 + EXIT + ENDIF + + FOR I = 1 TO tnPropsAndComments_Count + lnPos = AT(' ', laLines(I)) && Un espacio separa la propiedad de su comentario (si tiene) IF lnPos = 0 - taLines(I,1) = laLines(I) - taLines(I,2) = '' + taPropsAndComments(I,1) = laLines(I) + taPropsAndComments(I,2) = '' ELSE - taLines(I,1) = LEFT( laLines(I), lnPos - 1 ) - taLines(I,2) = SUBSTR( laLines(I), lnPos + 1 ) + taPropsAndComments(I,1) = LEFT( laLines(I), lnPos - 1 ) + taPropsAndComments(I,2) = SUBSTR( laLines(I), lnPos + 1 ) ENDIF ENDFOR + IF tlSort + ASORT( taPropsAndComments, 1, -1, 0, 1 ) + ENDIF + CATCH TO loEx - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -4575,6 +5124,203 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDPROC + ******************************************************************************************************************* + PROCEDURE get_PropsAndValuesFrom_PROPERTIES + *-- Sirve para el memo PROPERTIES + *--------------------------------------------------------------------------------------------------- + * 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 + * taPropsAndValues (@! OUT) Array con las propiedades y comentarios + * tnPropsAndValues_Count (@! OUT) Cantidad de propiedades + * tcSortedMemo (@? OUT) Contenido del campo memo ordenado + *--------------------------------------------------------------------------------------------------- + * 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) + *--------------------------------------------------------------------------------------------------- + LPARAMETERS tcMemo, tlSort, taPropsAndValues, tnPropsAndValues_Count, tcSortedMemo + EXTERNAL ARRAY taPropsAndValues + TRY + LOCAL laItems(1), I, X, lnLenAcum, lnPosEQ, lcPropName, lnLenVal, lcValue, lcMethods, laPropsAndValues(1,2) + 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 + + *-- 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 laPropsAndValues(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 + laPropsAndValues(X,1) = lcPropName + laPropsAndValues(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) ) + laPropsAndValues(X,1) = LEFT( laItems(I), lnPosEQ - 2 ) + laPropsAndValues(X,2) = THIS.normalizarValorPropiedad( laPropsAndValues(X,1), LTRIM( SUBSTR( laItems(I), lnPosEQ + 2 ) ), '' ) + ENDIF + ENDFOR + + tnPropsAndValues_Count = X + lcMethods = '' + + IF m.tlSort + *-- CON SORT: A las que no tienen '.' les pongo 'A' por delante, y al resto 'B' por delante para que queden al final + FOR I = 1 TO m.tnPropsAndValues_Count + IF '.' $ laPropsAndValues(I,1) + laPropsAndValues(I,1) = 'B' + laPropsAndValues(I,1) + ELSE + laPropsAndValues(I,1) = 'A' + laPropsAndValues(I,1) + ENDIF + ENDFOR + + ASORT(laPropsAndValues,1,-1,0,1) + + *-- Quitar el agregado + DIMENSION taPropsAndValues( tnPropsAndValues_Count, 2 ) + + FOR I = 1 TO m.tnPropsAndValues_Count + taPropsAndValues(I,1) = SUBSTR( laPropsAndValues(I,1), 2 ) + taPropsAndValues(I,2) = laPropsAndValues(I,2) + ENDFOR + ELSE + *-- SIN SORT: Creo 2 arrays, el bueno y el otro, y al terminar agrego el otro al bueno. + *-- Debo separar las props.normales de las de los objetos (ocurre cuando es un ADD OBJECT) + X = 0 + DIMENSION taPropsAndValues( tnPropsAndValues_Count, 2 ) + + *-- PRIMERO las que no tienen punto + FOR I = 1 TO m.tnPropsAndValues_Count + IF EMPTY( laPropsAndValues(I,1) ) + LOOP + ENDIF + + IF NOT '.' $ laPropsAndValues(I,1) + X = X + 1 + taPropsAndValues(X,1) = laPropsAndValues(I,1) + taPropsAndValues(X,2) = laPropsAndValues(I,2) + ENDIF + ENDFOR + + *-- LUEGO las demás props. + FOR I = 1 TO m.tnPropsAndValues_Count + IF EMPTY( laPropsAndValues(I,1) ) + LOOP + ENDIF + + IF '.' $ laPropsAndValues(I,1) + X = X + 1 + taPropsAndValues(X,1) = laPropsAndValues(I,1) + taPropsAndValues(X,2) = laPropsAndValues(I,2) + ENDIF + ENDFOR + ENDIF + + *-- 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) + + IF tnProtected_Count = 1 AND EMPTY(taProtected) + tnProtected_Count = 0 + ELSE + IF tlSort + ASORT( taProtected, 1, -1, 0, 1 ) + ENDIF + + FOR I = 1 TO tnProtected_Count + tcSortedMemo = tcSortedMemo + taProtected(I) + CR_LF + ENDFOR + ENDIF + + RETURN + ENDPROC + + ******************************************************************************************************************* PROCEDURE MemoInOneLine( tcMethod ) TRY @@ -4590,7 +5336,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDIF CATCH TO loEx - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -4603,8 +5349,9 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ******************************************************************************************************************* *PROCEDURE set_MultilineMemoWithAddObjectProperties( tcMethod, tcLeftIndentation, tlNormalizeLine ) - PROCEDURE set_MultilineMemoWithAddObjectProperties( taProps, tnPropCount, tcLeftIndentation, tlNormalizeLine ) - EXTERNAL ARRAY taProps + PROCEDURE set_MultilineMemoWithAddObjectProperties + LPARAMETERS taPropsAndValues, tnPropCount, tcLeftIndentation, tlNormalizeLine + EXTERNAL ARRAY taPropsAndValues TRY LOCAL lcLine, I, lcComentarios, laLines(1), lcFinDeLinea_Coma_PuntoComa_CR @@ -4624,7 +5371,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base *-- Ajustes de algunos casos especiales *laLines(I) = THIS.normalizarAsignacion( laLines(I), @lcComentarios ) - taProps(I,2) = THIS.normalizarValorPropiedad( taProps(I,1), taProps(I,2), @lcComentarios ) + *taPropsAndValues(I,2) = THIS.normalizarValorPropiedad( taPropsAndValues(I,1), taPropsAndValues(I,2), @lcComentarios ) *lcLine = lcLine + laLines(I) + ', ;' *-- Estos comentarios solo con los metadatos autogenerados por los ajustes especiales @@ -4634,7 +5381,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base *lcLine = lcLine + CR_LF - lcLine = lcLine + tcLeftIndentation + taProps(I,1) + ' = ' + taProps(I,2) + lcFinDeLinea + lcLine = lcLine + tcLeftIndentation + taPropsAndValues(I,1) + ' = ' + taPropsAndValues(I,2) + lcFinDeLinea ENDFOR *-- Si la última propiedad tiene comentarios, los quito temporalmente @@ -4655,7 +5402,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base *loEx.UserValue = 'ATENCION: EL ERROR PODRIA SER DEL PROGRAMA FUENTE' + CR_LF + CR_LF ; + JUSTEXT(THIS.c_inputFile) + ' MEMO Line ' + TRANSFORM(I) + ':' + laLines(I) + CR_LF + CR_LF ; + 'Analyzed memo content:' + CR_LF + tcMethod - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -4667,7 +5414,8 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ******************************************************************************************************************* - PROCEDURE IndentarMemo( tcMethod, tcIndentation ) + 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 @@ -4695,7 +5443,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base lcMethod = SUBSTR(lcMethod,3) && Quito el primer ENTER CATCH TO loEx - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -4707,7 +5455,8 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ******************************************************************************************************************* - PROCEDURE SortMethod( tcMethod, taMethods, taCode, tcSorted, tnMethodCount ) + 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. @@ -4820,7 +5569,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDIF CATCH TO loEx - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -4831,102 +5580,18 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDPROC && SordMethod - ******************************************************************************************************************* - PROCEDURE SortNames( tcMemo, taSortedItems, tnLineCount, tcSortedMemo ) - *-- 29/10/2013 Fernando D. Bozzo - *-- Sort method used for RESERVED3, PROPERTIES and PROTECTED memo fields - TRY - LOCAL lcMethods, laItems(1), lnItemCount, I, X, lnPosEQ, lcProp, lcValue, lcPart, lnLenVal, lnLenAcum ; - , loEx AS EXCEPTION - DIMENSION taSortedItems(1,2) - STORE '' TO tcSortedMemo, lcMethods, taSortedItems, I - STORE 0 TO tnLineCount, lnItemCount, I, X, lnLenVal, lnLenAcum - - IF NOT EMPTY(m.tcMemo) - lnItemCount = ALINES(laItems, m.tcMemo, 1+4, CR_LF) && Específicamente CR+LF para que no reconozca los CR - - *-- Crear un array con los valores especiales que pueden estar repartidos entre varias lineas - FOR I = 1 TO m.lnItemCount - X = X + 1 - DIMENSION taSortedItems(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) ) - lcProp = 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 - ENDIF - - *-- Es un valor especial, por lo que se encapsula en un marcador especial - taSortedItems(X,1) = lcProp - taSortedItems(X,2) = C_FB2P_VALUE_I + lcValue + C_FB2P_VALUE_F - - ELSE - IF LEFT(laItems(I), 1) == '*' && Only Reserved3 have this - LOOP - ENDIF - - lnPosEQ = AT( '=', laItems(I) ) - taSortedItems(X,1) = LEFT( laItems(I), lnPosEQ - 2 ) - taSortedItems(X,2) = SUBSTR( laItems(I), lnPosEQ + 2 ) - ENDIF - ENDFOR - - tnLineCount = X - - ASORT(taSortedItems,1,-1,0,1) - - *-- Add properties first - FOR I = 1 TO m.tnLineCount - IF LEFT(taSortedItems(I), 1) == '*' && Only Reserved3 have this - lcMethods = m.lcMethods + m.taSortedItems(I,1) + ' = ' + m.taSortedItems(I,2) + CR_LF - LOOP - ENDIF - - tcSortedMemo = m.tcSortedMemo + m.taSortedItems(I,1) + ' = ' + m.taSortedItems(I,2) + CR_LF - ENDFOR - - *-- Add methods to the end - 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 - - - ******************************************************************************************************************* - * (This method is taken from Open Source project TwoFox, from Christof Wallenhaupt - http://www.foxpert.com/downloads.htm) - * OLE2 contains the physical name of the OCX or DLL when a record refers to an ActiveX - * control. On different developer machines these controls can be located in different - * folders without affecting the code. - * - * When a control is stored outside the project directory, we assume that every developer - * is responsible for installing and registering the control. Therefore we only leave - * the file name which should be fixed. It's also sufficient for VFP to locate an OCX - * file when the control is not registered and the OCX file is stored in the current - * directory or the application path. PROCEDURE FixOle2Fields - + ******************************************************************************************************************* + * (This method is taken from Open Source project TwoFox, from Christof Wallenhaupt - http://www.foxpert.com/downloads.htm) + * OLE2 contains the physical name of the OCX or DLL when a record refers to an ActiveX + * control. On different developer machines these controls can be located in different + * folders without affecting the code. + * + * When a control is stored outside the project directory, we assume that every developer + * is responsible for installing and registering the control. Therefore we only leave + * the file name which should be fixed. It's also sufficient for VFP to locate an OCX + * file when the control is not registered and the OCX file is stored in the current + * directory or the application path. *-------------------------------------------------------------------------------------- * Project directory for comparision purposes *-------------------------------------------------------------------------------------- @@ -4950,10 +5615,11 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDPROC - ******************************************************************************************************************* - * (This method is taken from Open Source project TwoFox, from Christof Wallenhaupt - http://www.foxpert.com/downloads.htm) - * Returns .T. when the OCX control resides outside the project directory - FUNCTION OcxOutsideProjDir (tcOcx, tcProjDir) + FUNCTION OcxOutsideProjDir + LPARAMETERS tcOcx, tcProjDir + ******************************************************************************************************************* + * (This method is taken from Open Source project TwoFox, from Christof Wallenhaupt - http://www.foxpert.com/downloads.htm) + * Returns .T. when the OCX control resides outside the project directory LOCAL lcOcxDir, llOutside lcOcxDir = UPPER (JUSTPATH (m.tcOcx)) @@ -4982,11 +5648,7 @@ ENDDEFINE ******************************************************************************************************************* -DEFINE CLASS CL_MODULO AS CUSTOM - #IF .F. - LOCAL THIS AS CL_MODULO OF 'FOXBIN2PRG.PRG' - #ENDIF - +DEFINE CLASS CL_BASE AS CUSTOM *-- Propiedades. CLASS, HIDDEN BASECLASS, TOP, WIDTH, CLASSLIB, CONTROLS, CLASSLIBRARY, COMMENT ; , CONTROLCOUNT, HEIGHT, HELPCONTEXTID, LEFT, NAME, OBJECTS, PARENT ; @@ -4996,12 +5658,41 @@ DEFINE CLASS CL_MODULO AS CUSTOM HIDDEN ADDOBJECT, ADDPROPERTY, NEWOBJECT, READEXPRESSION, READMETHOD, REMOVEOBJECT ; , RESETTODEFAULT, SAVEASCLASS, SHOWWHATSTHIS, WRITEEXPRESSION, WRITEMETHOD + _MEMBERDATA = [] ; + + [] ; + + [] + + l_Debug = .F. + + + PROCEDURE INIT + SET DELETED ON + SET DATE YMD + SET HOURS TO 24 + SET CENTURY ON + SET SAFETY OFF + SET TABLEPROMPT OFF + + THIS.l_Debug = (_VFP.STARTMODE=0) + ENDPROC + + +ENDDEFINE + + +******************************************************************************************************************* +DEFINE CLASS CL_MODULO AS CL_BASE + #IF .F. + LOCAL THIS AS CL_MODULO OF 'FOXBIN2PRG.PRG' + #ENDIF + _MEMBERDATA = [] ; + [] ; + [] ; + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -5009,17 +5700,11 @@ DEFINE CLASS CL_MODULO AS CUSTOM + [] DIMENSION _Ole_Objs[1], _Clases[1] - _Version = 0 - _SourceFile = '' - _Ole_Obj_count = 0 - _Clases_Count = 0 - l_Debug = .F. - - - ************************************************************************************************ - PROCEDURE INIT - l_Debug = (_VFP.STARTMODE=0) - ENDPROC + _Version = 0 + _SourceFile = '' + _Ole_Obj_count = 0 + _Clases_Count = 0 + _includeFile = '' ************************************************************************************************ @@ -5070,20 +5755,11 @@ ENDDEFINE ******************************************************************************************************************* -DEFINE CLASS CL_OLE AS CUSTOM +DEFINE CLASS CL_OLE AS CL_BASE #IF .F. LOCAL THIS AS CL_OLE OF 'FOXBIN2PRG.PRG' #ENDIF - *-- Propiedades. CLASS, - HIDDEN BASECLASS, TOP, WIDTH, CLASSLIB, CONTROLS, CLASSLIBRARY, COMMENT ; - , CONTROLCOUNT, HEIGHT, HELPCONTEXTID, LEFT, NAME, OBJECTS, PARENT ; - , PARENTCLASS, PICTURE, TAG, WHATSTHISHELPID - - *-- Métodos (Se preservan: init, destroy, error) - HIDDEN ADDOBJECT, ADDPROPERTY, NEWOBJECT, READEXPRESSION, READMETHOD, REMOVEOBJECT ; - , RESETTODEFAULT, SAVEASCLASS, SHOWWHATSTHIS, WRITEEXPRESSION, WRITEMETHOD - _MEMBERDATA = [] ; + [] ; + [] ; @@ -5101,20 +5777,11 @@ ENDDEFINE ******************************************************************************************************************* -DEFINE CLASS CL_CLASE AS CUSTOM +DEFINE CLASS CL_CLASE AS CL_BASE #IF .F. LOCAL THIS AS CL_CLASE OF 'FOXBIN2PRG.PRG' #ENDIF - *-- Propiedades. CLASS, - HIDDEN BASECLASS, TOP, WIDTH, CLASSLIB, CONTROLS, CLASSLIBRARY, COMMENT ; - , CONTROLCOUNT, HEIGHT, HELPCONTEXTID, LEFT, NAME, OBJECTS, PARENT ; - , PARENTCLASS, PICTURE, TAG, WHATSTHISHELPID - - *-- Métodos (Se preservan: init, destroy, error) - HIDDEN ADDOBJECT, ADDPROPERTY, NEWOBJECT, READEXPRESSION, READMETHOD, REMOVEOBJECT ; - , RESETTODEFAULT, SAVEASCLASS, SHOWWHATSTHIS, WRITEEXPRESSION, WRITEMETHOD - _MEMBERDATA = [] ; + [] ; + [] ; @@ -5126,7 +5793,7 @@ DEFINE CLASS CL_CLASE AS CUSTOM + [] ; + [] ; + [] ; - + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -5186,8 +5853,8 @@ DEFINE CLASS CL_CLASE AS CUSTOM _BaseClass = '' _TimeStamp = '' _Scale = '' - _Defined_PEM = '' - _IncludeFile = '' + _Defined_PAM = '' + _includeFile = '' _AddObject_Count = 0 _Procedure_Count = 0 _User = '' @@ -5235,20 +5902,11 @@ ENDDEFINE ******************************************************************************************************************* -DEFINE CLASS CL_PROCEDURE AS CUSTOM +DEFINE CLASS CL_PROCEDURE AS CL_BASE #IF .F. LOCAL THIS AS CL_PROCEDURE OF 'FOXBIN2PRG.PRG' #ENDIF - *-- Propiedades. CLASS, - HIDDEN BASECLASS, TOP, WIDTH, CLASSLIB, CONTROLS, CLASSLIBRARY, COMMENT ; - , CONTROLCOUNT, HEIGHT, HELPCONTEXTID, LEFT, NAME, OBJECTS, PARENT ; - , PARENTCLASS, PICTURE, TAG, WHATSTHISHELPID - - *-- Métodos (Se preservan: init, destroy, error) - HIDDEN ADDOBJECT, ADDPROPERTY, NEWOBJECT, READEXPRESSION, READMETHOD, REMOVEOBJECT ; - , RESETTODEFAULT, SAVEASCLASS, SHOWWHATSTHIS, WRITEEXPRESSION, WRITEMETHOD - _MEMBERDATA = [] ; + [] ; + [] ; @@ -5278,20 +5936,11 @@ ENDDEFINE ******************************************************************************************************************* -DEFINE CLASS CL_OBJETO AS CUSTOM +DEFINE CLASS CL_OBJETO AS CL_BASE #IF .F. LOCAL THIS AS CL_OBJETO OF 'FOXBIN2PRG.PRG' #ENDIF - *-- Propiedades. CLASS, - HIDDEN BASECLASS, TOP, WIDTH, CLASSLIB, CONTROLS, CLASSLIBRARY, COMMENT ; - , CONTROLCOUNT, HEIGHT, HELPCONTEXTID, LEFT, NAME, OBJECTS, PARENT ; - , PARENTCLASS, PICTURE, TAG, WHATSTHISHELPID - - *-- Métodos (Se preservan: init, destroy, error) - HIDDEN ADDOBJECT, ADDPROPERTY, NEWOBJECT, READEXPRESSION, READMETHOD, REMOVEOBJECT ; - , RESETTODEFAULT, SAVEASCLASS, SHOWWHATSTHIS, WRITEEXPRESSION, WRITEMETHOD - _MEMBERDATA = [] ; + [] ; + [] ; @@ -5303,7 +5952,7 @@ DEFINE CLASS CL_OBJETO AS CUSTOM + [] ; + [] ; + [] ; - + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -5328,7 +5977,7 @@ DEFINE CLASS CL_OBJETO AS CUSTOM _Prop_Count = 0 _Procedure_Count = 0 _User = '' - _Pendiente = .T. + _WriteOrder = 0 _ZOrder = 0 @@ -5417,6 +6066,7 @@ DEFINE CLASS CL_PROJECT AS COLLECTION + [] ; + [] ; + [] ; + + [] ; + [] *-- Proj.Info @@ -5463,12 +6113,14 @@ DEFINE CLASS CL_PROJECT AS COLLECTION ************************************************************************************************ PROCEDURE INIT - l_Debug = (_VFP.STARTMODE=0) - ENDPROC + SET DELETED ON + SET DATE YMD + SET HOURS TO 24 + SET CENTURY ON + SET SAFETY OFF + SET TABLEPROMPT OFF - - ************************************************************************************************ - PROCEDURE INIT + THIS.l_Debug = (_VFP.STARTMODE=0) THIS._ServerHead = CREATEOBJECT('CL_PROJ_SRV_HEAD') ENDPROC @@ -5522,9 +6174,7 @@ DEFINE CLASS CL_PROJECT AS COLLECTION ENDWITH && THIS CATCH TO loEx - lnCodError = loEx.ERRORNO - - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -5569,7 +6219,7 @@ DEFINE CLASS CL_PROJECT AS COLLECTION CATCH TO loEx lnCodError = loEx.ERRORNO - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -5615,9 +6265,7 @@ DEFINE CLASS CL_PROJECT AS COLLECTION ENDWITH && THIS CATCH TO loEx - lnCodError = loEx.ERRORNO - - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -5633,20 +6281,11 @@ ENDDEFINE ******************************************************************************************************************* -DEFINE CLASS CL_PROJ_SRV_HEAD AS CUSTOM +DEFINE CLASS CL_PROJ_SRV_HEAD AS CL_BASE #IF .F. LOCAL THIS AS CL_PROJ_SRV_HEAD OF 'FOXBIN2PRG.PRG' #ENDIF - *-- Propiedades. CLASS, - HIDDEN BASECLASS, TOP, WIDTH, CLASSLIB, CONTROLS, CLASSLIBRARY, COMMENT ; - , CONTROLCOUNT, HEIGHT, HELPCONTEXTID, LEFT, NAME, OBJECTS, PARENT ; - , PARENTCLASS, PICTURE, TAG, WHATSTHISHELPID - - *-- Métodos (Se preservan: init, destroy, error) - HIDDEN ADDOBJECT, ADDPROPERTY, NEWOBJECT, READEXPRESSION, READMETHOD, REMOVEOBJECT ; - , RESETTODEFAULT, SAVEASCLASS, SHOWWHATSTHIS, WRITEEXPRESSION, WRITEMETHOD - _MEMBERDATA = [] ; + [] ; + [] ; @@ -5675,13 +6314,6 @@ DEFINE CLASS CL_PROJ_SRV_HEAD AS CUSTOM _TypeLibDesc = '' _ServerType = '' _TypeLib = '' - l_Debug = .F. - - - ************************************************************************************************ - PROCEDURE INIT - l_Debug = (_VFP.STARTMODE=0) - ENDPROC ************************************************************************************************ @@ -5777,9 +6409,7 @@ DEFINE CLASS CL_PROJ_SRV_HEAD AS CUSTOM loServerData = NULL CATCH TO loEx - lnCodError = loEx.ERRORNO - - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -5823,9 +6453,7 @@ DEFINE CLASS CL_PROJ_SRV_HEAD AS CUSTOM ENDIF CATCH TO loEx - lnCodError = loEx.ERRORNO - - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -5863,9 +6491,7 @@ DEFINE CLASS CL_PROJ_SRV_HEAD AS CUSTOM ENDFOR CATCH TO loEx - lnCodError = loEx.ERRORNO - - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -5879,20 +6505,11 @@ ENDDEFINE ******************************************************************************************************************* -DEFINE CLASS CL_PROJ_SRV_DATA AS CUSTOM +DEFINE CLASS CL_PROJ_SRV_DATA AS CL_BASE #IF .F. LOCAL THIS AS CL_PROJ_SRV_DATA OF 'FOXBIN2PRG.PRG' #ENDIF - *-- Propiedades. CLASS, - HIDDEN BASECLASS, TOP, WIDTH, CLASSLIB, CONTROLS, CLASSLIBRARY, COMMENT ; - , CONTROLCOUNT, HEIGHT, HELPCONTEXTID, LEFT, NAME, OBJECTS, PARENT ; - , PARENTCLASS, PICTURE, TAG, WHATSTHISHELPID - - *-- Métodos (Se preservan: init, destroy, error) - HIDDEN ADDOBJECT, ADDPROPERTY, NEWOBJECT, READEXPRESSION, READMETHOD, REMOVEOBJECT ; - , RESETTODEFAULT, SAVEASCLASS, SHOWWHATSTHIS, WRITEEXPRESSION, WRITEMETHOD - _MEMBERDATA = [] ; + [] ; + [] ; @@ -5916,13 +6533,6 @@ DEFINE CLASS CL_PROJ_SRV_DATA AS CUSTOM _Instancing = 0 _CLSID = '' _Interface = '' - l_Debug = .F. - - - ************************************************************************************************ - PROCEDURE INIT - l_Debug = (_VFP.STARTMODE=0) - ENDPROC ************************************************************************************************ @@ -5951,9 +6561,7 @@ DEFINE CLASS CL_PROJ_SRV_DATA AS CUSTOM ENDIF CATCH TO loEx - lnCodError = loEx.ERRORNO - - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -5988,9 +6596,7 @@ DEFINE CLASS CL_PROJ_SRV_DATA AS CUSTOM ENDWITH CATCH TO loEx - lnCodError = loEx.ERRORNO - - IF THIS.l_Debug AND _VFP.StartMode = 0 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -6005,20 +6611,11 @@ ENDDEFINE ******************************************************************************************************************* -DEFINE CLASS CL_PROJ_FILE AS CUSTOM +DEFINE CLASS CL_PROJ_FILE AS CL_BASE #IF .F. LOCAL THIS AS CL_PROJ_FILE OF 'FOXBIN2PRG.PRG' #ENDIF - *-- Propiedades. - HIDDEN CLASS, BASECLASS, TOP, WIDTH, CLASSLIB, CONTROLS, CLASSLIBRARY, COMMENT ; - , CONTROLCOUNT, HEIGHT, HELPCONTEXTID, LEFT, NAME, OBJECTS, PARENT ; - , PARENTCLASS, PICTURE, TAG, WHATSTHISHELPID - - *-- Métodos (Se preservan: init, destroy, error) - HIDDEN ADDOBJECT, ADDPROPERTY, NEWOBJECT, READEXPRESSION, READMETHOD, REMOVEOBJECT ; - , RESETTODEFAULT, SAVEASCLASS, SHOWWHATSTHIS, WRITEEXPRESSION, WRITEMETHOD - _MEMBERDATA = [] ; + [] ; + [] ;