diff --git a/TESTS/ut__foxbin2prg.prg b/TESTS/ut__foxbin2prg.prg
index d446bd2..e43ac7a 100644
--- a/TESTS/ut__foxbin2prg.prg
+++ b/TESTS/ut__foxbin2prg.prg
@@ -889,6 +889,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg
loCnv = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG")
*loCnv.l_Debug = .F.
loCnv.l_ShowErrors = .F.
+ loCnv.n_PRG_COMPAT_LEVEL = 0
*loCnv.l_Test = .T.
*loCnv.l_PropSort_Enabled = .F. && Para buscar diferencias
*loCnv.l_MethodSort_Enabled = .F. && Para buscar diferencias
@@ -1474,6 +1475,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg
loEx = NULL
loCnv = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG")
loCnv.evaluateConfiguration( '1', '1', '1', '0', '1', '4', '1', '0' )
+ loCnv.n_PRG_COMPAT_LEVEL = 0
*loCnv.l_Test = .T.
diff --git a/foxbin2prg.cfg.txt b/foxbin2prg.cfg.txt
index aead4cf..a2afc1d 100644
--- a/foxbin2prg.cfg.txt
+++ b/foxbin2prg.cfg.txt
@@ -26,6 +26,7 @@
* RemoveZOrderSetFromProps: 0 && 0=Do not remove ZOrderSet property from object, 1=Remove ZOrderSet property from object / 0=No quitar la propiedad ZOrderSet de los objetos, 1=Quitar la propiedad ZOrderSet de los objetos
* Language: (auto) && Language of shown messages and LOGs. EN=English, FR=French, ES=Español, DE=German, Not defined = AUTOMATIC [DEFAULT]
* ExcludeDBFAutoincNextval: 0 && [0=Do not exclude this value from db2], 1=Exclude this value from db2
+* PRG_Compat_Level: 0 && [0=Legacy], 1=Use HELPSTRING as Class Procedure comment
*-- CONVERTION OPTIONS / OPCIONES DE CONVERSIÓN
* PJX_Conversion_Support: 2 && 0=No support, 1=Generate TXT only (Diff), 2=Generate TXT and BIN (Merge)
diff --git a/foxbin2prg.prg b/foxbin2prg.prg
index a0fb017..c9c7234 100644
--- a/foxbin2prg.prg
+++ b/foxbin2prg.prg
@@ -209,6 +209,7 @@
* 11/01/2018 FDBOZZO v1.19.49.7 Bug Fix: Cuando se convierte la estructura de un DBF puede dar error si existe un campo llamado I o X (Francisco Prieto)
* 30/01/2018 FDBOZZO v1.19.49.8 Bug Fix: Cuando se convierte a texto una libreria corrupta con registros duplicados, se genera el error "The specified key already exists" (Kirides)
* 03/03/2018 FDBOZZO v1.19.50 Mejora: La información DevInfo de los PJX estará inhabilitada por defecto y se podrá activar con el nuevo switch BodyDevInfo
+* 03/03/2018 FDBOZZO v1.19.50 Mejora: Nueva opción de configuración "PRG_Compat_Level": 0=Legacy
*
*
*---------------------------------------------------------------------------------------------------
@@ -824,6 +825,7 @@ DEFINE CLASS c_foxbin2prg AS Session
l_RemoveZOrderSetFromProps = .F.
l_Recompile = .T.
n_UseClassPerFile = 0
+ n_PRG_Compat_Level = 0 && 0=COMPATIBLE WITH FoxBin2Prg v1.19.49 and earlier, 1=Include HELPSTRING
n_ExcludeDBFAutoincNextval = 0
l_ClassPerFileCheck = .F.
l_RedirectClassPerFileToMain = .F.
@@ -1502,6 +1504,15 @@ DEFINE CLASS c_foxbin2prg AS Session
ENDPROC
+ PROCEDURE n_PRG_Compat_Level_ACCESS
+ IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) )
+ RETURN THIS.n_PRG_Compat_Level
+ ELSE
+ RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).n_PRG_Compat_Level, THIS.n_PRG_Compat_Level )
+ ENDIF
+ ENDPROC
+
+
PROCEDURE changeFileAttribute
* Using Win32 Functions in Visual FoxPro
* example=103
@@ -2286,6 +2297,11 @@ DEFINE CLASS c_foxbin2prg AS Session
.writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > BodyDevInfo: ' + TRANSFORM(lo_CFG.n_BodyDevInfo) )
ENDIF
+ CASE LEFT( laConfig(I), 17 ) == LOWER('PRG_Compat_Level:')
+ lcValue = ALLTRIM( SUBSTR( laConfig(I), 18 ) )
+ lo_CFG.n_PRG_Compat_Level = INT( VAL( lcValue ) )
+ .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > PRG_Compat_Level: ' + TRANSFORM(lo_CFG.n_PRG_Compat_Level) )
+
ENDCASE
ENDFOR
@@ -5188,7 +5204,6 @@ DEFINE CLASS c_foxbin2prg AS Session
ENDDEFINE
-
DEFINE CLASS frm_avance AS Form
Height = 110
Width = 628
@@ -8371,30 +8386,31 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
PROCEDURE getClassMethodComment
- LPARAMETERS tcMethodName AS STRING, toClase
+ *---------------------------------------------------------------------------------------------------
+ * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT)
+ * tcLine (@! IN/OUT) Línea a separar del comentario (En este punto, el único comentario puede ser un HELPSTRING)
+ * tcComment (@? OUT) Comentario
+ *---------------------------------------------------------------------------------------------------
+ LPARAMETERS tcLine AS STRING, tcComment as String
#IF .F.
LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG'
#ENDIF
- LOCAL I, lcComentario ;
- , loProcedure AS CL_PROCEDURE OF 'FOXBIN2PRG.PRG'
- lcComentario = ''
+ LOCAL lnATC
+ tcComment = ''
+ lnATC = ATC("HELPSTRING", tcLine)
+
+ IF lnATC > 0
+ tcComment = ALLTRIM(SUBSTR(tcLine, lnATC + 10 ))
+
+ * Quitar comillas
+ tcComment = SUBSTR(tcComment, 2, LEN(tcComment) - 2)
+
+ tcLine = RTRIM(LEFT(tcLine, lnATC - 1 ), 0, CHR(9), CHR(0), ' ')
+ ENDIF
- FOR I = 1 TO toClase._Procedure_Count
- loProcedure = NULL
- loProcedure = toClase._Procedures(m.I)
-
- IF loProcedure._Nombre == tcMethodName
- lcComentario = loProcedure._Comentario
- EXIT
- ENDIF
- ENDFOR
-
- loProcedure = NULL
- RELEASE tcMethodName, toClase, loProcedure, I
-
- RETURN lcComentario
+ RETURN tcComment
ENDPROC
@@ -9619,6 +9635,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
*-- Estructura a reconocer: PROTECTED PROCEDURE nombre_del_procedimiento
llBloqueEncontrado = .T.
tcProcedureAbierto = ALLTRIM( SUBSTR( tcLine, 21 ) )
+ .getClassMethodComment( @tcProcedureAbierto, @tc_Comentario )
.evaluateProcedureDefinition( @toClase, m.I, @tc_Comentario, tcProcedureAbierto, 'protected', @toObjeto )
@@ -9626,18 +9643,21 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
*-- Estructura a reconocer: HIDDEN PROCEDURE nombre_del_procedimiento
llBloqueEncontrado = .T.
tcProcedureAbierto = ALLTRIM( SUBSTR( tcLine, 18 ) )
+ .getClassMethodComment( @tcProcedureAbierto, @tc_Comentario )
.evaluateProcedureDefinition( @toClase, m.I, @tc_Comentario, tcProcedureAbierto, 'hidden', @toObjeto )
CASE UPPER( LEFT( tcLine, 10 ) ) == 'PROCEDURE '
*-- Estructura a reconocer: PROCEDURE [objeto.]nombre_del_procedimiento
llBloqueEncontrado = .T.
tcProcedureAbierto = ALLTRIM( SUBSTR( tcLine, 11 ) )
+ .getClassMethodComment( @tcProcedureAbierto, @tc_Comentario )
.evaluateProcedureDefinition( @toClase, m.I, @tc_Comentario, tcProcedureAbierto, 'normal', @toObjeto )
CASE UPPER( LEFT( tcLine, 19 ) ) == 'PROTECTED FUNCTION '
*-- Estructura a reconocer: PROTECTED PROCEDURE nombre_del_procedimiento
llBloqueEncontrado = .T.
tcProcedureAbierto = ALLTRIM( SUBSTR( tcLine, 20 ) )
+ .getClassMethodComment( @tcProcedureAbierto, @tc_Comentario )
.evaluateProcedureDefinition( @toClase, m.I, @tc_Comentario, tcProcedureAbierto, 'protected', @toObjeto )
@@ -9645,12 +9665,14 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
*-- Estructura a reconocer: HIDDEN FUNCTION nombre_del_procedimiento
llBloqueEncontrado = .T.
tcProcedureAbierto = ALLTRIM( SUBSTR( tcLine, 17 ) )
+ .getClassMethodComment( @tcProcedureAbierto, @tc_Comentario )
.evaluateProcedureDefinition( @toClase, m.I, @tc_Comentario, tcProcedureAbierto, 'hidden', @toObjeto )
CASE UPPER( LEFT( tcLine, 9 ) ) == 'FUNCTION '
*-- Estructura a reconocer: FUNCTION [objeto.]nombre_del_procedimiento
llBloqueEncontrado = .T.
tcProcedureAbierto = ALLTRIM( SUBSTR( tcLine, 10 ) )
+ .getClassMethodComment( @tcProcedureAbierto, @tc_Comentario )
.evaluateProcedureDefinition( @toClase, m.I, @tc_Comentario, tcProcedureAbierto, 'normal', @toObjeto )
ENDCASE
@@ -13617,11 +13639,15 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
PROCEDURE get_CLASS_METHODS
- LPARAMETERS tnMethodCount, taMethods, taCode, taProtected, taPropsAndComments
+ LPARAMETERS tnMethodCount, taMethods, taCode, taProtected, taPropsAndComments, toFoxBin2Prg
*-- DEFINIR MÉTODOS DE LA CLASE
*-- Ubico los métodos protegidos y les cambio la definición
EXTERNAL ARRAY taMethods, taCode, taProtected, taPropsAndComments
+ #IF .F.
+ LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG'
+ #ENDIF
+
TRY
LOCAL lcMethod, lcMethodName, lnProtectedItem, lnCommentRow, lcProcDef, lcMethods, lnLen
STORE '' TO lcMethod, lcMethodName, lcProcDef, lcMethods
@@ -13654,7 +13680,13 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
*-- Comentarios del método (si tiene)
IF lnCommentRow > 0 AND NOT EMPTY(taPropsAndComments(lnCommentRow,2))
- lcMethod = lcMethod + C_TAB + C_TAB + '&' + '& ' + taPropsAndComments(lnCommentRow,2)
+ * PRG_Compat_Level >= 1
+ IF BITAND(toFoxBin2Prg.n_PRG_Compat_Level, 1) > 0
+ lcMethod = lcMethod + C_TAB + C_TAB + 'HELPSTRING "' + taPropsAndComments(lnCommentRow,2) + '"'
+ ELSE
+ * PRG_Compat_Level = 0 (Default old setting)
+ lcMethod = lcMethod + C_TAB + C_TAB + '&' + '& ' + taPropsAndComments(lnCommentRow,2)
+ ENDIF
ENDIF
*-- Código del método
@@ -14407,7 +14439,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
CASE lnTextNodes = 0 AND UPPER( LEFT(lcLine, 10) ) == 'PROCEDURE '
tnMethodCount = tnMethodCount + 1
DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount)
- taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 11) )
+ taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 11), 0, CHR(9), CHR(0), ' ' )
taMethods(tnMethodCount, 2) = tnMethodCount
taMethods(tnMethodCount, 3) = ''
taCode(tnMethodCount) = 'PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(m.I) + CR_LF
@@ -14416,7 +14448,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
CASE lnTextNodes = 0 AND UPPER( LEFT(lcLine, 9) ) == 'FUNCTION ' && NOT VALID WITH VFP IDE, BUT 3rd. PARTY SOFTWARE CAN USE IT
tnMethodCount = tnMethodCount + 1
DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount)
- taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 10) )
+ taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 10), 0, CHR(9), CHR(0), ' ' )
taMethods(tnMethodCount, 2) = tnMethodCount
taMethods(tnMethodCount, 3) = ''
taCode(tnMethodCount) = 'PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(m.I) + CR_LF
@@ -14425,7 +14457,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
CASE lnTextNodes = 0 AND UPPER( LEFT(lcLine, 17) ) == 'HIDDEN PROCEDURE '
tnMethodCount = tnMethodCount + 1
DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount)
- taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 18) )
+ taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 18), 0, CHR(9), CHR(0), ' ' )
taMethods(tnMethodCount, 2) = tnMethodCount
taMethods(tnMethodCount, 3) = 'HIDDEN '
taCode(tnMethodCount) = 'HIDDEN PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(m.I) + CR_LF
@@ -14434,7 +14466,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
CASE lnTextNodes = 0 AND UPPER( LEFT(lcLine, 16) ) == 'HIDDEN FUNCTION ' && NOT VALID WITH VFP IDE, BUT 3rd. PARTY SOFTWARE CAN USE IT
tnMethodCount = tnMethodCount + 1
DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount)
- taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 17) )
+ taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 17), 0, CHR(9), CHR(0), ' ' )
taMethods(tnMethodCount, 2) = tnMethodCount
taMethods(tnMethodCount, 3) = 'HIDDEN '
taCode(tnMethodCount) = 'HIDDEN PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(m.I) + CR_LF
@@ -14443,7 +14475,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
CASE lnTextNodes = 0 AND UPPER( LEFT(lcLine, 20) ) == 'PROTECTED PROCEDURE '
tnMethodCount = tnMethodCount + 1
DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount)
- taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 21) )
+ taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 21), 0, CHR(9), CHR(0), ' ' )
taMethods(tnMethodCount, 2) = tnMethodCount
taMethods(tnMethodCount, 3) = 'PROTECTED '
taCode(tnMethodCount) = 'PROTECTED PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(m.I) + CR_LF
@@ -14452,7 +14484,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
CASE lnTextNodes = 0 AND UPPER( LEFT(lcLine, 19) ) == 'PROTECTED FUNCTION ' && NOT VALID WITH VFP IDE, BUT 3rd. PARTY SOFTWARE CAN USE IT
tnMethodCount = tnMethodCount + 1
DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount)
- taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 20) )
+ taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 20), 0, CHR(9), CHR(0), ' ' )
taMethods(tnMethodCount, 2) = tnMethodCount
taMethods(tnMethodCount, 3) = 'PROTECTED '
taCode(tnMethodCount) = 'PROTECTED PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(m.I) + CR_LF
@@ -15585,7 +15617,7 @@ DEFINE CLASS c_conversor_vcx_a_prg AS c_conversor_bin_a_prg
.method2Array( loRegClass.METHODS, @laMethods, @laCode, '', @lnMethodCount ;
, @laPropsAndComments, lnPropsAndComments_Count, @laProtected, lnProtected_Count, @toFoxBin2Prg, @loRegClass )
- .get_CLASS_METHODS( @lnMethodCount, @laMethods, @laCode, @laProtected, @laPropsAndComments )
+ .get_CLASS_METHODS( @lnMethodCount, @laMethods, @laCode, @laProtected, @laPropsAndComments, @toFoxBin2Prg )
lnLastClass = 1
lcMethods = ''
@@ -15954,7 +15986,7 @@ DEFINE CLASS c_conversor_scx_a_prg AS c_conversor_bin_a_prg
.method2Array( loRegClass.METHODS, @laMethods, @laCode, '', @lnMethodCount ;
, @laPropsAndComments, lnPropsAndComments_Count, @laProtected, lnProtected_Count, @toFoxBin2Prg, @loRegClass )
- .get_CLASS_METHODS( @lnMethodCount, @laMethods, @laCode, @laProtected, @laPropsAndComments )
+ .get_CLASS_METHODS( @lnMethodCount, @laMethods, @laCode, @laProtected, @laPropsAndComments, @toFoxBin2Prg )
lnLastClass = 1
lcMethods = ''
@@ -27779,6 +27811,7 @@ DEFINE CLASS CL_CFG AS CUSTOM
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ [] ;
+ []
@@ -27827,6 +27860,7 @@ DEFINE CLASS CL_CFG AS CUSTOM
DBF_Conversion_Excluded = NULL
DBC_Conversion_Support = NULL
c_BackgroundImage = NULL
+ n_PRG_Compat_Level = NULL
PROCEDURE CopyFrom
@@ -27873,6 +27907,7 @@ DEFINE CLASS CL_CFG AS CUSTOM
.DBF_Conversion_Excluded = toParentCFG.DBF_Conversion_Excluded
.DBC_Conversion_Support = toParentCFG.DBC_Conversion_Support
.c_BackgroundImage = toParentCFG.c_BackgroundImage
+ .n_PRG_Compat_Level = toParentCFG.n_PRG_Compat_Level
ENDWITH
ENDPROC