diff --git a/foxbin2prg.prg b/foxbin2prg.prg index 6cb430b..1c798ca 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -38,6 +38,12 @@ * 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 +* +*--------------------------------------------------------------------------------------------------- +* 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 +* *--------------------------------------------------------------------------------------------------- * TRAMIENTOS ESPECIALES DE ASIGNACIONES DE PROPIEDADES: * PROPIEDAD ARREGLO Y EJEMPLO @@ -99,10 +105,13 @@ LPARAMETERS tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErro #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 ) *-- Fin / End *-- From FOXPRO.H @@ -140,7 +149,8 @@ IF EMPTY(tc_InputFile) ELSE lcSys16 = SYS(16) lcPath = SET("Path") - SET PATH TO (JUSTPATH(lcSys16)) + *SET PATH TO (JUSTPATH(lcSys16)) + SET PATH TO loCnv = CREATEOBJECT("c_foxbin2prg") loCnv.l_Debug = (TRANSFORM(tcDebug)=='1') loCnv.l_ShowErrors = NOT (TRANSFORM(tcDontShowErrors) == '1') @@ -154,7 +164,7 @@ 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, ALLTRIM( GETWORDNUM( laConfig(I), 2, '=' ) ) ) + loCnv.AddProperty( lcExt, UPPER( ALLTRIM( GETWORDNUM( laConfig(I), 2, '=' ) ) ) ) ENDIF ENDFOR ENDIF @@ -249,7 +259,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM l_ShowErrors = .F. lFileMode = .F. nClassTimeStamp = '' - n_FB2PRG_Version = 1.4 + n_FB2PRG_Version = 1.6 o_Conversor = NULL c_VC2 = 'VC2' c_SC2 = 'SC2' @@ -404,6 +414,7 @@ DEFINE CLASS c_conversor_base AS SESSION + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -413,21 +424,23 @@ DEFINE CLASS c_conversor_base AS SESSION + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; - + [] ; + + [] ; + [] ; - + [] ; + + [] ; + [] ; + [] ; + [] ; + [] ; + [] + l_Debug = .F. - c_inputFile = '' - c_outputFile = '' - lFileMode = .F. + c_InputFile = '' + c_OutputFile = '' + lFileMode = .T. nClassTimeStamp = '' n_FB2PRG_Version = 1.0 c_Type = '' @@ -673,7 +686,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 @@ -691,10 +704,10 @@ DEFINE CLASS c_conversor_base AS SESSION LOCAL cTimeValue, tnTimeStamp IF VARTYPE(m.tDateTime) <> 'T' - m.tDateTime = DATETIME() - m.cTimeValue = TIME() + m.tDateTime = DATETIME() + m.cTimeValue = TIME() ELSE - m.cTimeValue = TTOC(m.tDateTime, 2) + m.cTimeValue = TTOC(m.tDateTime, 2) ENDIF tnTimeStamp = ((YEAR(m.tDateTime) - 1980) * 2 ** 25); @@ -709,50 +722,66 @@ DEFINE CLASS c_conversor_base AS SESSION ******************************************************************************************************************* FUNCTION GetTimeStamp(tnTimeStamp) - LOCAL lcTimeStamp,lnYear,lnMonth,lnDay,lnHour,lnMinutes,lnSeconds,lcTime,lnHour,ldTimeStamp,lnResto - LOCAL laDir[1] + TRY + LOCAL lcTimeStamp,lnYear,lnMonth,lnDay,lnHour,lnMinutes,lnSeconds,lcTime,lnHour,ldTimeStamp,lnResto ; + ,lcTimeStamp_Ret, laDir[1], loEx as Exception + + lcTimeStamp_Ret = '' - IF EMPTY(tnTimeStamp) - IF THIS.lFileMode - IF ADIR(laDir,THIS.cFileName)=0 - RETURN "" - 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" - ENDIF - IF VAL(lcTime)<10 - lcTime="0"+lcTime - ENDIF - RETURN DTOC(laDir[1,3])+" "+lcTime - ENDIF - tnTimeStamp=THIS.nClassTimeStamp IF EMPTY(tnTimeStamp) - RETURN "" + IF THIS.lFileMode + 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" + ENDIF + IF VAL(lcTime)<10 + lcTime="0"+lcTime + ENDIF + lcTimeStamp_Ret = DTOC(laDir[1,3])+" "+lcTime + EXIT + ENDIF + + tnTimeStamp=THIS.nClassTimeStamp + + IF EMPTY(tnTimeStamp) + EXIT + ENDIF ENDIF - ENDIF - *-- YYYY YYYM MMMD DDDD HHHH HMMM MMMS SSSS - lnResto = tnTimeStamp - lnYear = INT( lnResto / 2**25 + 1980) - lnResto = lnResto % 2**25 - lnMonth = INT( lnResto / 2**21 ) - lnResto = lnResto % 2**21 - lnDay = INT( lnResto / 2**16 ) - lnResto = lnResto % 2**16 - lnHour = INT( lnResto / 2**11 ) - lnResto = lnResto % 2**11 - lnMinutes = INT( lnResto / 2**5 ) - lnResto = lnResto % 2**5 - lnSeconds = lnResto + *-- YYYY YYYM MMMD DDDD HHHH HMMM MMMS SSSS + lnResto = tnTimeStamp + lnYear = INT( lnResto / 2**25 + 1980) + lnResto = lnResto % 2**25 + lnMonth = INT( lnResto / 2**21 ) + lnResto = lnResto % 2**21 + lnDay = INT( lnResto / 2**16 ) + lnResto = lnResto % 2**16 + lnHour = INT( lnResto / 2**11 ) + lnResto = lnResto % 2**11 + lnMinutes = INT( lnResto / 2**5 ) + lnResto = lnResto % 2**5 + lnSeconds = lnResto - lcTimeStamp = STR(lnYear,4) + "-" + STR(lnMonth,2) + "-" + STR(lnDay,2) + " " ; - + STR(lnHour,2) + ":" + STR(lnMinutes,2) + ":" + STR(lnSeconds,2) - ldTimeStamp = TTOC( EVALUATE( "{^" + lcTimeStamp + "}" ) ) - RETURN ldTimeStamp + lcTimeStamp = STR(lnYear,4) + "-" + STR(lnMonth,2) + "-" + STR(lnDay,2) + " " ; + + STR(lnHour,2) + ":" + STR(lnMinutes,2) + ":" + STR(lnSeconds,2) + lcTimeStamp_Ret = TTOC( EVALUATE( "{^" + lcTimeStamp + "}" ) ) + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.StartMode = 0 + SET STEP ON + ENDIF + + THROW + + ENDTRY + + RETURN lcTimeStamp_Ret ENDPROC @@ -768,31 +797,64 @@ DEFINE CLASS c_conversor_base AS SESSION ******************************************************************************************************************* - FUNCTION desnormalizarAsignacion(tcAsignacion) - LOCAL lcPropName, lcValor, lnCodError, lcExpNormalizada - *-- Tipos de asignación posibles: - *lcPropName = ALLTRIM( STREXTRACT( tcAsignacion, '', '=' ) ) - *lcValor = ALLTRIM( STREXTRACT( tcAsignacion, '=', '' ) ) + 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 = '' - RETURN tcAsignacion + THIS.desnormalizarValorPropiedad( @lcPropName, @lcValor, @lcComentario ) + + RETURN lcPropName + ' = ' + lcValor ENDFUNC ******************************************************************************************************************* - FUNCTION normalizarAsignacion(tcAsignacion, tcComentario) - LOCAL lcPropName, lcValor, lnCodError, lcExpNormalizada - lcPropName = ALLTRIM( STREXTRACT( tcAsignacion, '', '=' ) ) - lcValor = ALLTRIM( STREXTRACT( tcAsignacion, '=', '' ) ) + FUNCTION desnormalizarValorPropiedad(tcProp, tcValue, tcComentario) + LOCAL lnCodError, lnPos tcComentario = '' *-- Ajustes de algunos casos especiales DO CASE - CASE lcPropName == '_memberdata' + CASE tcProp == '_memberdata' *-- Me quedo con lo importante y quito los CHR(0) y longitud que a veces agrega al inicio - tcAsignacion = lcPropName + ' = ' + STREXTRACT( lcValor, '', '', 1, 1+4 ) + SET STEP ON + tcValue = CHRTRAN( STREXTRACT( tcValue, '', '', 1, 1+4 ), CR_LF + C_TAB, '' ) ENDCASE - RETURN tcAsignacion + RETURN tcValue + ENDFUNC + + + ******************************************************************************************************************* + FUNCTION normalizarAsignacion( tcAsignacion, tcComentario ) + LOCAL lcPropName, lcValor, lnCodError, lcExpNormalizada, lnPos + lnPos = AT( '=', tcAsignacion ) + lcPropName = ALLTRIM( LEFT( tcAsignacion, lnPos - 2 ) ) + lcValor = ALLTRIM( SUBSTR( tcAsignacion, lnPos + 2 ) ) + tcComentario = '' + + THIS.normalizarValorPropiedad( @lcPropName, @lcValor, @tcComentario ) + + RETURN lcPropName + ' = ' + lcValor + ENDFUNC + + + ******************************************************************************************************************* + FUNCTION normalizarValorPropiedad(tcProp, tcValue, tcComentario) + LOCAL lnCodError, lnPos + 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 + + RETURN tcValue ENDFUNC @@ -996,7 +1058,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 @@ -1111,7 +1173,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 @@ -1698,7 +1760,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 @@ -1803,7 +1865,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base 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 = .get_ValueByName_FromListNamesWithValues( 'Value', 'C', @laPropsAndValues_List ) + loOle._Value = STRCONV( .get_ValueByName_FromListNamesWithValues( 'Value', 'C', @laPropsAndValues_List ), 14 ) toModulo.add_OLE( loOle ) @@ -1998,7 +2060,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base 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( 'Ole2', '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 ) ) ) @@ -2025,7 +2087,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base 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 + IF _VFP.StartMode = 0 SET STEP ON ENDIF ENDIF @@ -2050,7 +2112,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base *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 + IF THIS.l_Debug AND _VFP.StartMode = 0 SET STEP ON ENDIF @@ -2104,7 +2166,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 @@ -2311,7 +2373,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 @@ -2364,7 +2426,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 @@ -2578,7 +2640,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 @@ -2640,7 +2702,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 @@ -2768,7 +2830,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 @@ -2859,7 +2921,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 @@ -2936,7 +2998,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 @@ -2990,7 +3052,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 @@ -3046,7 +3108,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 @@ -3105,7 +3167,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 @@ -3163,7 +3225,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 @@ -3221,7 +3283,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 @@ -3279,7 +3341,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 @@ -3343,7 +3405,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 @@ -3468,7 +3530,7 @@ DEFINE CLASS c_conversor_vcx_a_prg AS c_conversor_bin_a_prg 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 @@ -3542,7 +3604,9 @@ DEFINE CLASS c_conversor_scx_a_prg AS c_conversor_bin_a_prg ENDIF - SCAN ALL FOR TABLABIN.PLATFORM = "WINDOWS" AND (TABLABIN.CLASS == 'dataenvironment' OR TABLABIN.CLASS == 'form') + SCAN ALL FOR TABLABIN.PLATFORM = "WINDOWS" ; + AND (EMPTY(TABLABIN.PARENT) ; + AND (TABLABIN.BASECLASS == 'dataenvironment' OR TABLABIN.BASECLASS == 'form' OR TABLABIN.BASECLASS == 'formset' ) ) SCATTER MEMO NAME loRegClass lcObjName = ALLTRIM(loRegClass.OBJNAME) @@ -3589,7 +3653,9 @@ DEFINE CLASS c_conversor_scx_a_prg AS c_conversor_bin_a_prg LOCATE FOR TABLABIN.PLATFORM = "WINDOWS" AND ALLTRIM(GETWORDNUM(TABLABIN.PARENT, 1, '.')) == lcObjName SCAN REST ; - FOR TABLABIN.PLATFORM = "WINDOWS" AND NOT (TABLABIN.CLASS == 'dataenvironment' OR TABLABIN.CLASS == 'form') ; + FOR TABLABIN.PLATFORM = "WINDOWS" ; + AND NOT (EMPTY(TABLABIN.PARENT) ; + AND (TABLABIN.BASECLASS == 'dataenvironment' OR TABLABIN.BASECLASS == 'form' OR TABLABIN.BASECLASS == 'formset' ) ) ; WHILE ALLTRIM(GETWORDNUM(TABLABIN.PARENT, 1, '.')) == lcObjName SCATTER MEMO NAME loRegObj @@ -3609,7 +3675,7 @@ DEFINE CLASS c_conversor_scx_a_prg AS c_conversor_bin_a_prg 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 @@ -3908,7 +3974,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 @@ -4027,7 +4093,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 @@ -4047,11 +4113,12 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base #ENDIF TRY - LOCAL lcMemo + LOCAL lcMemo, laProps(1,2), lnLineCount *-- Defino los objetos a cargar - THIS.SortNames( toRegObj.PROPERTIES, '', '', @lcMemo ) - lcMemo = THIS.set_MultilineMemoWithAddObjectProperties( lcMemo, C_TAB + C_TAB, .T. ) + THIS.SortNames( toRegObj.PROPERTIES, @laProps, @lnLineCount, @lcMemo ) + *lcMemo = THIS.set_MultilineMemoWithAddObjectProperties( lcMemo, C_TAB + C_TAB, .T. ) + lcMemo = THIS.set_MultilineMemoWithAddObjectProperties( @laProps, @lnLineCount, C_TAB + C_TAB, .T. ) IF '.' $ toRegObj.PARENT *-- Este caso: clase.objeto.objeto ==> se quita clase @@ -4100,7 +4167,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 @@ -4168,7 +4235,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 @@ -4214,11 +4281,14 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base IF lnLineCount > 0 THEN *-- Recorro las propiedades (campo Properties) FOR I = 1 TO lnLineCount - lcPropName = RTRIM( GETWORDNUM( taProps(I), 1, '=' ) ) - lnProtectedItem = ASCAN(taProtected, lcPropName, 1, 0, 0, 0) + *lcPropName = RTRIM( GETWORDNUM( taProps(I), 1, '=' ) ) + *lcPropName = taProps(I,1) + lnProtectedItem = ASCAN(taProtected, taProps(I,1), 1, 0, 0, 0) *-- Ajustes de algunos casos especiales - taProps(I) = THIS.normalizarAsignacion( taProps(I), @lcComentarios ) + *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 ) @@ -4229,13 +4299,13 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base CASE lnProtectedItem = 0 *-- Propiedad común - CASE taProtected(lnProtectedItem) == lcPropName + CASE taProtected(lnProtectedItem) == taProps(I,1) *-- Propiedad protegida - lcProtectedProp = lcProtectedProp + ',' + lcPropName + lcProtectedProp = lcProtectedProp + ',' + taProps(I,1) - CASE taProtected(lnProtectedItem) == lcPropName + '^' + CASE taProtected(lnProtectedItem) == taProps(I,1) + '^' *-- Propiedad oculta - lcHiddenProp = lcHiddenProp + ',' + lcPropName + lcHiddenProp = lcHiddenProp + ',' + taProps(I,1) ENDCASE ENDFOR @@ -4267,13 +4337,13 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base *-- Escribo las propiedades de la clase y sus comentarios FOR I = 1 TO ALEN(taProps, 1) - lcPropName = RTRIM( GETWORDNUM( taProps(I), 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, lcPropName, 1, 0, 1, 8) + lnComment = ASCAN( taPropsWithComments, taProps(I,1), 1, 0, 1, 8) IF lnComment > 0 AND NOT EMPTY(taPropsWithComments(lnComment,2)) TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 @@ -4289,7 +4359,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 @@ -4461,7 +4531,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 @@ -4494,7 +4564,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDFOR CATCH TO loEx - IF THIS.l_Debug AND _VFP.StartMode > 0 + IF THIS.l_Debug AND _VFP.StartMode = 0 SET STEP ON ENDIF @@ -4520,7 +4590,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 @@ -4532,23 +4602,29 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ******************************************************************************************************************* - PROCEDURE set_MultilineMemoWithAddObjectProperties( tcMethod, tcLeftIndentation, tlNormalizeLine ) + *PROCEDURE set_MultilineMemoWithAddObjectProperties( tcMethod, tcLeftIndentation, tlNormalizeLine ) + PROCEDURE set_MultilineMemoWithAddObjectProperties( taProps, tnPropCount, tcLeftIndentation, tlNormalizeLine ) + EXTERNAL ARRAY taProps + TRY LOCAL lcLine, I, lcComentarios, laLines(1), lcFinDeLinea_Coma_PuntoComa_CR lcLine = '' lcFinDeLinea = ', ;' + CR_LF - IF NOT EMPTY(tcMethod) + *IF NOT EMPTY(tcMethod) + IF tnPropCount > 0 IF VARTYPE(tcLeftIndentation) # 'C' tcLeftIndentation = '' ENDIF - FOR I = 1 TO ALINES(laLines, m.tcMethod, 0) + *FOR I = 1 TO ALINES(laLines, m.tcMethod, 0) + FOR I = 1 TO tnPropCount *lcComentarios = '' *lcLine = lcLine + tcLeftIndentation *-- Ajustes de algunos casos especiales - laLines(I) = THIS.normalizarAsignacion( laLines(I), @lcComentarios ) + *laLines(I) = THIS.normalizarAsignacion( laLines(I), @lcComentarios ) + taProps(I,2) = THIS.normalizarValorPropiedad( taProps(I,1), taProps(I,2), @lcComentarios ) *lcLine = lcLine + laLines(I) + ', ;' *-- Estos comentarios solo con los metadatos autogenerados por los ajustes especiales @@ -4558,7 +4634,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base *lcLine = lcLine + CR_LF - lcLine = lcLine + tcLeftIndentation + laLines(I) + lcFinDeLinea + lcLine = lcLine + tcLeftIndentation + taProps(I,1) + ' = ' + taProps(I,2) + lcFinDeLinea ENDFOR *-- Si la última propiedad tiene comentarios, los quito temporalmente @@ -4579,7 +4655,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 @@ -4619,7 +4695,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 @@ -4744,7 +4820,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 @@ -4758,25 +4834,68 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ******************************************************************************************************************* PROCEDURE SortNames( tcMemo, taSortedItems, tnLineCount, tcSortedMemo ) *-- 29/10/2013 Fernando D. Bozzo - *-- Sort method for Reserved3, Properties and Protected memo fields + *-- Sort method used for RESERVED3, PROPERTIES and PROTECTED memo fields TRY - LOCAL lcMethods, loEx AS EXCEPTION - DIMENSION taSortedItems(1) + 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 - tnLineCount = 0 + STORE 0 TO tnLineCount, lnItemCount, I, X, lnLenVal, lnLenAcum IF NOT EMPTY(m.tcMemo) - tnLineCount = ALINES(taSortedItems, m.tcMemo, 1+4) + 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) + CR_LF + lcMethods = m.lcMethods + m.taSortedItems(I,1) + ' = ' + m.taSortedItems(I,2) + CR_LF LOOP ENDIF - tcSortedMemo = m.tcSortedMemo + m.taSortedItems(I) + CR_LF + tcSortedMemo = m.tcSortedMemo + m.taSortedItems(I,1) + ' = ' + m.taSortedItems(I,2) + CR_LF ENDFOR *-- Add methods to the end @@ -4784,7 +4903,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 @@ -5405,7 +5524,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 @@ -5450,7 +5569,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 @@ -5498,7 +5617,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 @@ -5660,7 +5779,7 @@ DEFINE CLASS CL_PROJ_SRV_HEAD AS CUSTOM 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 @@ -5706,7 +5825,7 @@ DEFINE CLASS CL_PROJ_SRV_HEAD AS CUSTOM 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 @@ -5746,7 +5865,7 @@ DEFINE CLASS CL_PROJ_SRV_HEAD AS CUSTOM 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 @@ -5834,7 +5953,7 @@ DEFINE CLASS CL_PROJ_SRV_DATA AS CUSTOM 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 @@ -5871,7 +5990,7 @@ DEFINE CLASS CL_PROJ_SRV_DATA AS CUSTOM 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