diff --git a/CONFIG/config.fpw b/CONFIG/config.fpw
index ef3f93b..64df9af 100644
--- a/CONFIG/config.fpw
+++ b/CONFIG/config.fpw
@@ -1,2 +1,17 @@
+RESOURCE=OFF
SCREEN=OFF
-RESOURCE=OFF
\ No newline at end of file
+_STARTUP=""
+HELP=OFF
+_TRANSPORT=""
+_GENXTAB=""
+_FOXREF=""
+TALK=OFF
+_SPELLCHK=""
+MVCOUNT=1024
+_BROWSER=""
+_BUILDER=""
+_CONVERTER=""
+_TASKPANE=""
+_TOOLBOX=""
+_WIZARD=""
+COMMAND=""
diff --git a/FileName_Caps/Filename_caps.pj2 b/FileName_Caps/Filename_caps.pj2
index 24e849d..083628f 100644
--- a/FileName_Caps/Filename_caps.pj2
+++ b/FileName_Caps/Filename_caps.pj2
@@ -25,7 +25,7 @@ _LegalCopyright = "Creative Commons 4: Reconocimiento - CompartirIgual (by-sa):
_LegalTrademark = "Creative Commons 4: Reconocimiento - CompartirIgual (by-sa): http://creativecommons.org/licenses/by/4.0/"
_ProductName = "FILENAME_CAPS"
_MajorVer = "2"
-_MinorVer = "3"
+_MinorVer = "4"
_Revision = "0"
_LanguageID = ""
_AutoIncrement = "0"
@@ -33,7 +33,7 @@ _AutoIncrement = "0"
*
-*<.HomeDir = 'c:\desa\filename_caps' />
+*<.HomeDir = 'c:\desa\foxbin2prg\filename_caps' />
FOR EACH loProject IN _VFP.Projects FOXOBJECT
loProject.Close()
diff --git a/FileName_Caps/Filename_caps.pjt b/FileName_Caps/Filename_caps.pjt
index 7061166..59df1e2 100644
Binary files a/FileName_Caps/Filename_caps.pjt and b/FileName_Caps/Filename_caps.pjt differ
diff --git a/FileName_Caps/Filename_caps.pjx b/FileName_Caps/Filename_caps.pjx
index 96f0b1a..b47c25d 100644
Binary files a/FileName_Caps/Filename_caps.pjx and b/FileName_Caps/Filename_caps.pjx differ
diff --git a/FileName_Caps/filename_caps.prg b/FileName_Caps/filename_caps.prg
index 7c07146..f31e162 100644
--- a/FileName_Caps/filename_caps.prg
+++ b/FileName_Caps/filename_caps.prg
@@ -44,20 +44,49 @@ RETURN lcFileName
DEFINE CLASS cl_FileName_Caps AS Custom
+ _memberdata = [] ;
+ + [] ;
+ + [] ;
+ + []
- PROCEDURE Capitalize
- LPARAMETERS tcFileName, tcFileMask, tcFileMaskType, tcLog, tlRelanzarError, tcDontShowErrors
+ PROCEDURE INIT
+ *DECLARE INTEGER MoveFile IN KERNEL32.DLL STRING lpExistingFileName, STRING lpNewFileName
+
+ * DOCUMENTACIÓN: https://msdn.microsoft.com/es-es/library/windows/desktop/aa365240(v=vs.85).aspx
+ * dwFlags:
+ * 1 (0x1) MOVEFILE_REPLACE_EXISTING
+ * 8 (0x8) MOVEFILE_WRITE_THROUGH
+ DECLARE INTEGER MoveFileEx IN KERNEL32.DLL STRING lpExistingFileName, STRING lpNewFileName, INTEGER dwFlags
+
+ DECLARE INTEGER GetLastError IN KERNEL32.DLL
+ DECLARE Sleep IN KERNEL32.DLL INTEGER dwMilliseconds
+
+ * DOCUMENTACIÓN: https://msdn.microsoft.com/en-us/library/windows/desktop/ms679351(v=vs.85).aspx
+ DECLARE INTEGER FormatMessage IN KERNEL32.DLL INTEGER dwFlags, INTEGER lpSource, INTEGER dwMessageId ;
+ , INTEGER dwLanguageId, STRING @lpBuffer, INTEGER nSize, INTEGER Arguments
+ _SCREEN.AddProperty("ExitCodeFNC",0)
+ ENDPROC
+
+ PROCEDURE Capitalize(tcFileName, tcFileMask, tcFileMaskType, tcLog, tlRelanzarError, tcDontShowErrors)
+ #IF .F.
+ LOCAL THIS AS cl_FileName_Caps OF 'filename_caps\filename_caps.prg'
+ #ENDIF
TRY
LOCAL loEx AS EXCEPTION, laMasks(1,4), lcDefinition, lcFileDef, lcMaskDef, laLines(1), lcMenErr ;
- , I, X, lcName, lcExt, lcPath, lcFileName, laFile(1,5), lcLogFile, lcSys16, lnPosProg ;
- , loFSO AS Scripting.FileSystemObject
+ , I, X, lcName, lcExt, lcPath, lcFileName, laFile(1,5), lcLogFile, lcSys16, lnPosProg, lnRet
+ lnRet = 0
loEx = NULL
- loFSO = CREATEOBJECT('Scripting.FileSystemObject')
tcFileMaskType = EVL(tcFileMaskType,'M')
lcFileName = tcFileName
- lcLogFile = FORCEEXT(SYS(16),'LOG')
+ lcSys16 = SYS(16)
+ IF LEFT(lcSys16,10) == 'PROCEDURE '
+ lnPosProg = AT(" ", lcSys16, 2) + 1
+ ELSE
+ lnPosProg = 1
+ ENDIF
+ lcLogFile = FORCEEXT( SUBSTR( lcSys16, lnPosProg ), 'LOG' )
tcLog = ''
tcDontShowErrors = EVL( tcDontShowErrors, '0' )
@@ -66,13 +95,6 @@ DEFINE CLASS cl_FileName_Caps AS Custom
tcLog = tcLog + CR_LF + '- No hay máscara definida ni archivo de configuración'
EXIT && No se indicó nada que hacer
ELSE
- lcSys16 = SYS(16)
- IF LEFT(lcSys16,10) == 'PROCEDURE '
- lnPosProg = AT(" ", lcSys16, 2) + 1
- ELSE
- lnPosProg = 1
- ENDIF
-
tcFileMask = FORCEEXT( SUBSTR( lcSys16, lnPosProg ), 'CFG' )
tcLog = tcLog + CR_LF + '- Se usará el archivo de configuración [' + tcFileMask + ']'
IF NOT FILE(tcFileMask)
@@ -163,9 +185,19 @@ DEFINE CLASS cl_FileName_Caps AS Custom
EXIT
ENDIF
ENDFOR
+
+ *MESSAGEBOX( 'lcLogFile = ' + TRANSFORM(lcLogFile),0+4096, 'Error' )
IF ADIR( laFile, lcFileName, '', 1 ) > 0 AND laFile(1,1) <> JUSTFNAME(lcFileName)
- loFSO.MoveFile( FORCEPATH( laFile(1,1), JUSTPATH(lcFileName) ), lcFileName )
+ lnRet = THIS.RenameFile( FORCEPATH( laFile(1,1), JUSTPATH(lcFileName) ), lcFileName )
+ *MESSAGEBOX('(MoveFile) lnRet = ' + TRANSFORM(lnRet),0+4096, 'Error')
+
+ IF lnRet = 0 && Failed
+ lnRet = GetLastError()
+ *MESSAGEBOX('(GetLastError) lnRet = ' + TRANSFORM(lnRet),0+4096, 'Error')
+ ERROR 'MoveFile'
+ ENDIF
+
tcLog = tcLog + CR_LF + ' => Se renombrará a [' + lcFileName + ']'
ELSE
tcLog = tcLog + CR_LF + ' => No se renombrará a [' + lcFileName + '] porque ya estaba correcto.'
@@ -173,6 +205,19 @@ DEFINE CLASS cl_FileName_Caps AS Custom
CATCH TO loEx
+ _SCREEN.ExitCodeFNC = loEx.ErrorNo
+
+ IF loEx.ErrorNo = 1098 && User defined error
+ IF LOWER(loEx.Message) == 'movefile'
+ * SE OBTIENE EL MENSAJE DE ERROR DEL SISTEMA CORRESPONDIENTE A GetLastError()
+ * FORMAT_MESSAGE_FROM_SYSTEM 0x00001000
+ LOCAL lnRetLen, lpBuffer
+ lpBuffer = REPLICATE(CHR(0),256)
+ lnRetLen = FormatMessage(0x00001000,0,lnRet,0,@lpBuffer,256,0)
+ loEx.Message = LEFT(lpBuffer, lnRetLen)
+ ENDIF
+ ENDIF
+
IF tlRelanzarError THEN
THROW
ELSE
@@ -190,7 +235,6 @@ DEFINE CLASS cl_FileName_Caps AS Custom
ENDIF
FINALLY
- loFSO = NULL
tcFileName = lcFileName
*-- Si existe FileName_Caps.LOG, lo actualiza
@@ -207,4 +251,24 @@ DEFINE CLASS cl_FileName_Caps AS Custom
RETURN lcFileName
ENDPROC
+
+ FUNCTION RenameFile(lpExistingFileName as String, lpNewFileName as String) as Integer
+ * RENAME con reintento. A veces el sistema operativo puede devolver un error en los primeros intentos de renombrado,
+ * por ejemplo con el error "Can not create a file that already exists"
+ * FUENTE: http://stackoverflow.com/questions/13025313/why-os-rename-is-raising-an-exception-in-python-2-7
+ LOCAL lnRet
+ lnRet = 0
+ *lnRet = MoveFile( FORCEPATH( laFile(1,1), JUSTPATH(lcFileName) ), lcFileName )
+
+ FOR I = 1 TO 10
+ lnRet = MoveFileEx( lpExistingFileName, lpNewFileName, 0x1 + 0x8 )
+ IF lnRet != 0
+ EXIT
+ ENDIF
+ Sleep(10)
+ ENDFOR
+ RETURN lnRet
+ ENDFUNC
+
+
ENDDEFINE && CLASS cl_FileName_Caps AS Custom
diff --git a/FoxBin2PRGVersionFile.txt b/FoxBin2PRGVersionFile.txt
index 5dc3b10..aaf1e21 100644
--- a/FoxBin2PRGVersionFile.txt
+++ b/FoxBin2PRGVersionFile.txt
@@ -2,8 +2,8 @@ Lparameters toUpdateInfo
Local lcNote
With toUpdateInfo
- .VersionNumber = 'v1.19.48'
- .VersionDate = Date(2016,07,11)
+ .VersionNumber = 'v1.19.49'
+ .VersionDate = Date(2017,02,17)
.SourceFileUrl = 'http://vfpxrepository.com/dl/thorupdate/Projects/FoxBin2Prg/FoxBin2Prg.Zip'
.Link = 'http://vfpx.codeplex.com/wikipage?title=FoxBin2PRG'
@@ -21,6 +21,9 @@ Demo video using FoxBin2Prg with PlasticSCM: http://youtu.be/sE4wQ50Itqg
Change History -------------------------------------------------------------
+2017/02/17 v1.19.49
+
+
2016/07/11 v1.19.48
- Bug Fix: Error message 'variable tcOutputFile not found' (german version) (Andy Kasper)
- Bug Fix: Menu location 'Before' always changed to 'after' when convert (Andy Kasper)
diff --git a/Normalize_FileNames.vbs b/Normalize_FileNames.vbs
index 7162027..2aab863 100644
--- a/Normalize_FileNames.vbs
+++ b/Normalize_FileNames.vbs
@@ -48,7 +48,11 @@ Else
Next
If GetBit(nDebug, 4) Then
- MsgBox "End of Process!", 64, WScript.ScriptName
+ If nExitCode = 0 Then
+ MsgBox "End of Process!", 64, WScript.ScriptName
+ Else
+ MsgBox "End of Process!", 48, WScript.ScriptName
+ End If
End If
End If
@@ -93,7 +97,7 @@ Private Sub evaluateFile( tcFile )
MsgBox cCMD, 0, "PARAMETERS"
Else
nRet = oVFP9.DoCmd( cCMD )
- 'nExitCode = oVFP9.Eval("_SCREEN.ExitCode")
+ nExitCode = oVFP9.Eval("_SCREEN.ExitCodeFNC")
End If
End Sub
diff --git a/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_commandgroup.vc2 b/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_commandgroup.vc2
new file mode 100644
index 0000000..5e083e2
--- /dev/null
+++ b/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_commandgroup.vc2
@@ -0,0 +1,34 @@
+*--------------------------------------------------------------------------------------------------------------------------------------------------------
+* (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!!
+*--------------------------------------------------------------------------------------------------------------------------------------------------------
+*< FOXBIN2PRG: Version="1.19" SourceFile="fb2p_classperfile_text.vcx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
+*
+DEFINE CLASS cl_commandgroup AS commandgroup && Descripción de cl_CommandGroup
+ *< CLASSDATA: Baseclass="commandgroup" Timestamp="" Scale="Pixels" Uniqueid="" />
+
+ #INCLUDE "..\..\include\principal.h"
+ *
+ *p: una_prop_cmgroup && Con comentario, pero sin valor
+ *
+
+ ButtonCount = 2
+ Height = 66
+ Name = "cl_commandgroup"
+ una_prop_cmgroup = .F. && Con comentario, pero sin valor
+ Value = 1
+ Width = 94
+ Command1.Caption = "Command1"
+ Command1.Height = 27
+ Command1.Left = 5
+ Command1.Name = "Command1"
+ Command1.Top = 5
+ Command1.Width = 84
+ Command2.Caption = "Command2"
+ Command2.Height = 27
+ Command2.Left = 5
+ Command2.Name = "Command2"
+ Command2.Top = 34
+ Command2.Width = 84
+
+ENDDEFINE
diff --git a/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_form.vc2 b/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_form.vc2
new file mode 100644
index 0000000..650a9f1
--- /dev/null
+++ b/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_form.vc2
@@ -0,0 +1,121 @@
+*--------------------------------------------------------------------------------------------------------------------------------------------------------
+* (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!!
+*--------------------------------------------------------------------------------------------------------------------------------------------------------
+*< FOXBIN2PRG: Version="1.19" SourceFile="fb2p_classperfile_text.vcx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
+*
+DEFINE CLASS cl_form AS form OLEPUBLIC && mi OLE server DLL
+ *< CLASSDATA: Baseclass="form" Timestamp="" Scale="Pixels" Uniqueid="" ProjectClassIcon="bmps\container.ico" ClassIcon="bmps\container.ico" />
+
+ *-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder
+ *< OBJECTDATA: ObjPath="Cl_optiongroup1" UniqueID="" Timestamp="" />
+ *< OBJECTDATA: ObjPath="Cl_commandgroup1" UniqueID="" Timestamp="" />
+ *< OBJECTDATA: ObjPath="Cl_imagen1" UniqueID="" Timestamp="" />
+ *< OBJECTDATA: ObjPath="Cl_imagen2" UniqueID="" Timestamp="" />
+
+ *
+ *p: chidden && Prop.Hidden
+ *p: cprotected && Prop.Protegida
+ *a: ahidden[1,0] && Array Oculto
+ *a: aprotected[1,0] && Array Protegido
+ *p: _memberdata && XML Metadata for customizable properties
+ *
+
+ HIDDEN ahidden,chidden
+ PROTECTED aprotected,cprotected
+ Caption = "Form"
+ chidden = && Prop.Hidden
+ cprotected = && Prop.Protegida
+ DoCreate = .T.
+ Height = 345
+ Left = 0
+ Name = "cl_form"
+ Picture = bmps\scccheckout.bmp
+ Top = 0
+ Width = 570
+ _memberdata =
+
+
+
+
+ && XML Metadata for customizable properties
+
+ ADD OBJECT 'Cl_commandgroup1' AS cl_commandgroup WITH ;
+ BackColor = 255,128,192, ;
+ Height = 66, ;
+ Left = 8, ;
+ Name = "Cl_commandgroup1", ;
+ Top = 88, ;
+ Width = 244, ;
+ Command1.Caption = "Abrir", ;
+ Command1.Height = 52, ;
+ Command1.Left = 8, ;
+ Command1.Name = "Command1", ;
+ Command1.Picture = bmps\carpetaabierta.bmp, ;
+ Command1.Top = 4, ;
+ Command1.Width = 104, ;
+ Command2.Caption = "Cerrar", ;
+ Command2.Height = 52, ;
+ Command2.Left = 124, ;
+ Command2.Name = "Command2", ;
+ Command2.Picture = bmps\carpetacerrada.bmp, ;
+ Command2.Top = 4, ;
+ Command2.Width = 104
+ *< END OBJECT: ClassLib="fb2p_test.vcx" BaseClass="commandgroup" />
+
+ ADD OBJECT 'Cl_imagen1' AS cl_imagen WITH ;
+ Height = 34, ;
+ Left = 452, ;
+ Name = "Cl_imagen1", ;
+ Picture = bmps\sobrepostal.bmp, ;
+ Stretch = 1, ;
+ Top = 276, ;
+ Width = 38
+ *< END OBJECT: ClassLib="fb2p_test.vcx" BaseClass="image" />
+
+ ADD OBJECT 'Cl_imagen2' AS cl_imagen WITH ;
+ Height = 34, ;
+ Left = 500, ;
+ Name = "Cl_imagen2", ;
+ Picture = bmps\treeview.bmp, ;
+ Stretch = 1, ;
+ Top = 276, ;
+ Width = 38
+ *< END OBJECT: ClassLib="fb2p_test.vcx" BaseClass="image" />
+
+ ADD OBJECT 'Cl_optiongroup1' AS cl_optiongroup WITH ;
+ BackColor = 0,128,255, ;
+ Height = 68, ;
+ Left = 8, ;
+ Name = "Cl_optiongroup1", ;
+ Top = 12, ;
+ Width = 244, ;
+ Option1.Height = 52, ;
+ Option1.Left = 8, ;
+ Option1.Name = "Option1", ;
+ Option1.Picture = bmps\scccheckout.bmp, ;
+ Option1.Style = 1, ;
+ Option1.Top = 8, ;
+ Option1.Width = 104, ;
+ Option2.Height = 52, ;
+ Option2.Left = 124, ;
+ Option2.Name = "Option2", ;
+ Option2.Picture = bmps\scccheckout.bmp, ;
+ Option2.Style = 1, ;
+ Option2.Top = 8, ;
+ Option2.Width = 104
+ *< END OBJECT: ClassLib="fb2p_test.vcx" BaseClass="optiongroup" />
+
+ PROCEDURE Cl_optiongroup1.Init
+ *-- Prueba para comprobar que respeta espacios y TABS del código
+ TEXT TO xx
+ * TAB a la izquierda del asterisco
+ * 2 TAB a la izquierda del asterisco
+ * 1 ESPACIO a la izquierda del asterisco
+ * 2 ESPACIOS a la izquierda del asterisco
+ 1 TAB a la derecha del asterisco *
+ 1 ESPACIO a la derecha del asterisco *
+ ENDTEXT && Esto termina sin ENTER
+ ENDPROC
+
+ENDDEFINE
diff --git a/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_imagen.vc2 b/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_imagen.vc2
new file mode 100644
index 0000000..5947af3
--- /dev/null
+++ b/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_imagen.vc2
@@ -0,0 +1,23 @@
+*--------------------------------------------------------------------------------------------------------------------------------------------------------
+* (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!!
+*--------------------------------------------------------------------------------------------------------------------------------------------------------
+*< FOXBIN2PRG: Version="1.19" SourceFile="fb2p_classperfile_text.vcx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
+*
+DEFINE CLASS cl_imagen AS image OLEPUBLIC && otro ole
+ *< CLASSDATA: Baseclass="image" Timestamp="" Scale="Pixels" Uniqueid="" />
+
+ *
+ *m: un_metodo_de_clase && Para testear si el código se va a la clase cl_form
+ *
+
+ Height = 16
+ Name = "cl_imagen"
+ Picture = bmps\sobrepostal.bmp
+ Width = 17
+
+ PROCEDURE un_metodo_de_clase && Para testear si el código se va a la clase cl_form
+ * ESTE CODIGO ES DE "cl_imagen::un_metodo_de_clase"
+ ENDPROC
+
+ENDDEFINE
diff --git a/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_olebound.vc2 b/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_olebound.vc2
new file mode 100644
index 0000000..3a4bd63
--- /dev/null
+++ b/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_olebound.vc2
@@ -0,0 +1,14 @@
+*--------------------------------------------------------------------------------------------------------------------------------------------------------
+* (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!!
+*--------------------------------------------------------------------------------------------------------------------------------------------------------
+*< FOXBIN2PRG: Version="1.19" SourceFile="fb2p_classperfile_text.vcx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
+*
+DEFINE CLASS cl_olebound AS oleboundcontrol
+ *< CLASSDATA: Baseclass="oleboundcontrol" Timestamp="" Scale="Pixels" Uniqueid="" />
+
+ Height = 100
+ Name = "cl_olebound"
+ Width = 100
+
+ENDDEFINE
diff --git a/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_olecontrol.vc2 b/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_olecontrol.vc2
new file mode 100644
index 0000000..57fd5f8
--- /dev/null
+++ b/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_olecontrol.vc2
@@ -0,0 +1,14 @@
+*--------------------------------------------------------------------------------------------------------------------------------------------------------
+* (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!!
+*--------------------------------------------------------------------------------------------------------------------------------------------------------
+*< FOXBIN2PRG: Version="1.19" SourceFile="fb2p_classperfile_text.vcx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
+*
+DEFINE CLASS cl_olecontrol AS olecontrol
+ *< CLASSDATA: Baseclass="olecontrol" Timestamp="" Scale="Pixels" Uniqueid="" Nombre="cl_olecontrol" Parent="" ObjName="cl_olecontrol" OLEObject="C:\Windows\system32\richtx32.ocx" Value="0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAEAAAAgAAAAEAAAD+////AAAAAAAAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/////v////7////+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1IAbwBvAHQAIABFAG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAUA//////////8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCpJ18M8c8BAwAAAAACAAAAAAAAAwBPAGwAZQBPAGIAagBlAGMAdABEAGEAdABhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAgEDAAAAAgAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAAAAAAAADAEEAYwBjAGUAcwBzAE8AYgBqAFMAaQB0AGUARABhAHQAYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgACAP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAABPAAAAAAAAAAMAQwBoAGEAbgBnAGUAZABQAHIAbwBwAHMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAIA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAEoAAAAAAAAABAAAAAIAAAD+////BQAAAAYAAAD+////BwAAAP7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9giHw7j9cbELm1BAIcAJQCIUM0EggAAACKDQAA7QYAACFDNBIBAAYArAAAAAAA//8AAP//AQAAAAAAAAAAAAAATwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAABcAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgcWhqIFp0dVFoYTtqZGZuW2lhZXRyIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAACADAAAAFJpZ2h0TWFyZ2luABEAAABODQAAAAcAAAAAAAAAAAAAAAUAAABUZXh0ABQAAABIAAAAAAsAAABPAAAAAAUAAIAAAAAAAAABAAAAAQABAAIACAAAAHtccnRmMVxhbnNpXGFuc2ljcGcxMjUyXGRlZmYwe1xmb250dGxlY29udHJvbDEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABibHtcZjBcZm5pbFxmY2hhcnNldDAgQXJpYWw7fX0NClx2aWV3a2luZDRcdWMxXHBhcmRcbGFuZzMwODJcZnMxOCBPbGVjb250cm9sMQ0KXHBhciB9DQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" />
+
+ Height = 67
+ Name = "cl_olecontrol"
+ Width = 131
+
+ENDDEFINE
diff --git a/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_optiongroup.vc2 b/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_optiongroup.vc2
new file mode 100644
index 0000000..f7b6562
--- /dev/null
+++ b/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_optiongroup.vc2
@@ -0,0 +1,51 @@
+*--------------------------------------------------------------------------------------------------------------------------------------------------------
+* (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!!
+*--------------------------------------------------------------------------------------------------------------------------------------------------------
+*< FOXBIN2PRG: Version="1.19" SourceFile="fb2p_classperfile_text.vcx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
+*
+DEFINE CLASS cl_optiongroup AS optiongroup && descripcion
+ *< CLASSDATA: Baseclass="optiongroup" Timestamp="" Scale="Pixels" Uniqueid="" />
+
+ *
+ *m: propiedad_de_clase_con_valor_access
+ *m: propiedad_de_clase_con_valor_assign
+ *p: propiedad_de_clase_con_valor && Tiene un valor por defecto
+ *p: propiedad_de_clase_sin_valor && Una propiedad sin valor para heredar
+ *
+
+ ButtonCount = 2
+ Height = 46
+ Name = "cl_optiongroup"
+ propiedad_de_clase_con_valor = UN VALOR DE LA CLASE && Tiene un valor por defecto
+ propiedad_de_clase_sin_valor = .F. && Una propiedad sin valor para heredar
+ Value = 1
+ Width = 71
+ Option1.Caption = "Option1"
+ Option1.Height = 17
+ Option1.Left = 5
+ Option1.Name = "Option1"
+ Option1.Top = 5
+ Option1.Value = 1
+ Option1.Width = 61
+ Option2.Caption = "Option2"
+ Option2.Height = 17
+ Option2.Left = 5
+ Option2.Name = "Option2"
+ Option2.Top = 24
+ Option2.Width = 61
+
+ PROCEDURE propiedad_de_clase_con_valor_access
+ *To do: Modify this routine for the Access method
+ RETURN THIS.propiedad_de_clase_con_valor
+
+ ENDPROC
+
+ PROCEDURE propiedad_de_clase_con_valor_assign
+ LPARAMETERS vNewVal
+ *To do: Modify this routine for the Assign method
+ THIS.propiedad_de_clase_con_valor = m.vNewVal
+
+ ENDPROC
+
+ENDDEFINE
diff --git a/TESTS/DATOS_READONLY/fb2p_classperfile_text.proj_hook.vc2 b/TESTS/DATOS_READONLY/fb2p_classperfile_text.proj_hook.vc2
new file mode 100644
index 0000000..84d9a31
--- /dev/null
+++ b/TESTS/DATOS_READONLY/fb2p_classperfile_text.proj_hook.vc2
@@ -0,0 +1,14 @@
+*--------------------------------------------------------------------------------------------------------------------------------------------------------
+* (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!!
+*--------------------------------------------------------------------------------------------------------------------------------------------------------
+*< FOXBIN2PRG: Version="1.19" SourceFile="fb2p_classperfile_text.vcx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
+*
+DEFINE CLASS proj_hook AS projecthook
+ *< CLASSDATA: Baseclass="projecthook" Timestamp="" Scale="Pixels" Uniqueid="" />
+
+ Height = 22
+ Name = "proj_hook"
+ Width = 23
+
+ENDDEFINE
diff --git a/TESTS/DATOS_READONLY/fb2p_classperfile_text.vc2 b/TESTS/DATOS_READONLY/fb2p_classperfile_text.vc2
new file mode 100644
index 0000000..a5f8752
--- /dev/null
+++ b/TESTS/DATOS_READONLY/fb2p_classperfile_text.vc2
@@ -0,0 +1,18 @@
+*--------------------------------------------------------------------------------------------------------------------------------------------------------
+* (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!!
+*--------------------------------------------------------------------------------------------------------------------------------------------------------
+*< FOXBIN2PRG: Version="1.19" SourceFile="fb2p_classperfile_text.vcx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
+*
+*-- EXTERNAL_CLASS identify external member Class names / EXTERNAL_CLASS identifica los nombres de las Clases externas
+*< EXTERNAL_CLASS: Name="cl_commandgroup" Baseclass="commandgroup" />
+*< EXTERNAL_CLASS: Name="cl_form" Baseclass="form" />
+*< EXTERNAL_CLASS: Name="cl_imagen" Baseclass="image" />
+*< EXTERNAL_CLASS: Name="cl_olebound" Baseclass="oleboundcontrol" />
+*< EXTERNAL_CLASS: Name="cl_olecontrol" Baseclass="olecontrol" />
+*< EXTERNAL_CLASS: Name="cl_optiongroup" Baseclass="optiongroup" />
+*< EXTERNAL_CLASS: Name="proj_hook" Baseclass="projecthook" />
+
+*
+*< LIBCOMMENT: Comentario principal de "fb2p_test.vcx" />
+*
\ No newline at end of file
diff --git a/TESTS/DATOS_READONLY/fb2p_classperfile_text.vct b/TESTS/DATOS_READONLY/fb2p_classperfile_text.vct
new file mode 100644
index 0000000..30bcaa6
Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_classperfile_text.vct differ
diff --git a/TESTS/DATOS_READONLY/fb2p_classperfile_text.vcx b/TESTS/DATOS_READONLY/fb2p_classperfile_text.vcx
new file mode 100644
index 0000000..aa7fd97
Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_classperfile_text.vcx differ
diff --git a/TESTS/ut__foxbin2prg.prg b/TESTS/ut__foxbin2prg.prg
index 7e87011..d446bd2 100644
--- a/TESTS/ut__foxbin2prg.prg
+++ b/TESTS/ut__foxbin2prg.prg
@@ -1709,6 +1709,119 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg
ENDFUNC
+ *******************************************************************************************************************************************
+ FUNCTION Evaluate_TX2_Output_Test_from_ClassPerFile_VCX
+ LPARAMETERS tcFileName
+
+ IF PCOUNT() = 0
+ THIS.messageout( "* Support method, not a valid test." )
+ RETURN .T.
+ ENDIF
+
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , lc_File, lc_OutputFile, lc_OutputFileTx2, lc_OutputFileTx2s, lc_OutputFileBak, lcExt2, lcCFG, laFiles(1,5) ;
+ , lcParent, lcClass, lcObjName, loReg_Esperado ;
+ , loCtl AS f_optiongroup OF "TESTS\DATOS_READONLY\LIB_CONTROLES.VCX" ;
+ , loCnv AS c_foxbin2prg OF "FOXBIN2PRG.PRG" ;
+ , loEx AS EXCEPTION
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+
+ TRY
+ loEx = NULL
+ TEXT TO lcCFG TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2+4
+ UseClassPerFile:1
+ RedirectClassPerFileToMain:1
+ ClassPerFileCheck:1
+ ENDTEXT
+ STRTOFILE(lcCFG, FORCEPATH('foxbin2prg.cfg', oFXU_LIB.cPathDatosTest))
+ loCnv = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG", "", 'TESTS\DATOS_TEST\foxbin2prg.cfg')
+ *loCnv = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG")
+ *loCnv.evaluateConfiguration( '1', '1', '1', '0', '1', '4', '1', '0' )
+ *loCnv.l_Test = .T.
+
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError, lnCodError_Esperado
+
+ *-- Copio la librería en DATOS_TEST
+ lc_File = UPPER(tcFileName)
+ lcExt2 = loCnv.Get_Ext2FromExt( JUSTEXT( tcFileName ) )
+ lc_OutputFile = FORCEPATH( lc_File, oFXU_LIB.cPathDatosTest )
+ lc_OutputFileTx2 = FORCEPATH( FORCEEXT( lc_File, lcExt2 ), oFXU_LIB.cPathDatosTest )
+ lc_OutputFileTx2s = FORCEPATH( JUSTSTEM(lc_File) + '*.' + lcExt2, oFXU_LIB.cPathDatosTest )
+ lc_OutputFileBak = lc_OutputFileTx2 + '.bak'
+
+ * Copio los .??2
+ *oFXU_LIB.copiarArchivosParaTest( lc_OutputFileTx2s )
+ FOR I = 1 TO ADIR(laFiles, FORCEPATH(lc_OutputFileTx2s, oFXU_LIB.cPathDatosReadOnly))
+ COPY FILE (FORCEPATH( laFiles(I,1), oFXU_LIB.cPathDatosReadOnly )) TO (FORCEPATH( laFiles(I,1), oFXU_LIB.cPathDatosTest ))
+ ENDFOR
+
+ * Creo los .??2.BAK correspondientes
+ FOR I = 1 TO ADIR(laFiles, lc_OutputFileTx2s)
+ COPY FILE (FORCEPATH( laFiles(I,1), oFXU_LIB.cPathDatosTest )) TO (FORCEPATH( laFiles(I,1) + '.bak', oFXU_LIB.cPathDatosTest ))
+ ENDFOR
+
+ *-- Genero TX2
+ *loCnv.execute( lc_OutputFile, .F., .F., .F., '1', '0', '1', '', '', .T., '', SYS(5)+CURDIR() )
+
+ *-- Genero BIN
+ loCnv.execute( lc_OutputFileTx2, .F., .F., .F., '1', '0', '1', '', '', .T., '', SYS(5)+CURDIR() )
+
+ *-- Genero TX2
+ loCnv.execute( lc_OutputFile, .F., .F., .F., '1', '0', '1', '', '', .T., '', SYS(5)+CURDIR() )
+
+ *-- Comparo resultados
+ THIS.messageout( "Se compara el archivo de texto generado con el original luego de 2 regeneraciones, para saber si hay cambios" )
+ *THIS.messageout( "OutputFileTx2 = " + lc_OutputFileTx2 )
+ *THIS.messageout( "OutputFileBak = " + lc_OutputFileBak )
+ *THIS.asserttrue( FILETOSTR( lc_OutputFileTx2 ) == FILETOSTR( lc_OutputFileBak ), "COMPARACIÓN DE ARCHIVOS TX2" )
+
+ FOR I = 1 TO ALEN(laFiles, 1)
+ THIS.messageout( "--------------------" )
+ THIS.messageout( "OutputFileTx2 = " + laFiles(I,1) )
+ THIS.messageout( "OutputFileBak = " + laFiles(I,1) + '.bak' )
+ THIS.asserttrue( FILETOSTR( FORCEPATH( laFiles(I,1), oFXU_LIB.cPathDatosTest ) ) == FILETOSTR( FORCEPATH( laFiles(I,1) + '.bak', oFXU_LIB.cPathDatosTest ) ), "COMPARACIÓN DE ARCHIVOS TX2" )
+ ENDFOR
+
+
+ CATCH TO loEx
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado )
+
+ FINALLY
+ * USE IN (SELECT("ARCHIVOBIN_IN"))
+ * USE IN (SELECT("TABLABIN"))
+ STORE NULL TO loCnv, loCtl
+ RELEASE loCnv, loCtl
+ ENDTRY
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_Ejecutar_FOXBIN2PRG_Para_generar_un__VCX__con_ClassPerFile_ValidarEl_VC2_GeneradoConElOriginal_Y_NoEncontrarDiferencias
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , lc_File, lcFileName, lc_OutputFile, lc_OutputFileTx2, lc_OutputFileBak, lcExt2 ;
+ , lcParent, lcClass, lcObjName, loReg_Esperado ;
+ , loCtl AS f_optiongroup OF "TESTS\DATOS_READONLY\LIB_CONTROLES.VCX" ;
+ , loCnv AS c_foxbin2prg OF "FOXBIN2PRG.PRG" ;
+ , loEx AS EXCEPTION
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+
+ PUBLIC goFXU AS ut__foxbin2prg OF ut__foxbin2prg.prg
+ goFXU = THIS
+ loEx = NULL
+
+ *-- Comparo resultados
+ THIS.Evaluate_TX2_Output_Test_from_ClassPerFile_VCX( 'fb2p_classperfile_text.vcx' )
+
+ ENDFUNC
+
+
ENDDEFINE
diff --git a/filename_caps.exe b/filename_caps.exe
index 4ecf2fa..321f50f 100644
Binary files a/filename_caps.exe and b/filename_caps.exe differ
diff --git a/foxbin2prg.exe b/foxbin2prg.exe
index 4adf091..6db51b4 100644
Binary files a/foxbin2prg.exe and b/foxbin2prg.exe differ
diff --git a/foxbin2prg.pj2 b/foxbin2prg.pj2
index 41380e2..6adb37c 100644
--- a/foxbin2prg.pj2
+++ b/foxbin2prg.pj2
@@ -26,7 +26,7 @@ _LegalTrademark = "Creative Commons 4: Reconocimiento - CompartirIgual (by-sa):
_ProductName = "FOXBIN2PRG"
_MajorVer = "1"
_MinorVer = "19"
-_Revision = "48"
+_Revision = "49"
_LanguageID = "1034"
_AutoIncrement = "0"
*
@@ -93,7 +93,6 @@ WITH loProject.FILES
.ADD('props_xmladapter.txt') && *< FileMetadata: Type="T" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" />
.ADD('props_xmlfield.txt') && *< FileMetadata: Type="T" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" />
.ADD('props_xmltable.txt') && *< FileMetadata: Type="T" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" />
- .ADD('readme.txt') && *< FileMetadata: Type="T" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" />
*
.ITEM('__newproject.f2b').Remove()
@@ -104,7 +103,6 @@ WITH loProject.FILES
*
*
- .ITEM(lcCurdir + 'readme.txt').Exclude = .T.
*
*
diff --git a/foxbin2prg.pjt b/foxbin2prg.pjt
index 228074e..30929f1 100644
Binary files a/foxbin2prg.pjt and b/foxbin2prg.pjt differ
diff --git a/foxbin2prg.pjx b/foxbin2prg.pjx
index 5c8ba18..0028e19 100644
Binary files a/foxbin2prg.pjx and b/foxbin2prg.pjx differ
diff --git a/foxbin2prg.prg b/foxbin2prg.prg
index 5f2280a..3637193 100644
--- a/foxbin2prg.prg
+++ b/foxbin2prg.prg
@@ -192,6 +192,13 @@
* 10/07/2016 FDBOZZO v1.19.48 Fix defecto db2: Cuando se arregló el bug del memo multi-línea, se introdujo un nuevo defecto por el cual un memo de linea-simple se decodifica mal (Nathan Brown)
* 11/07/2016 FDBOZZO v1.19.48 Bug Fix pj2: Cuando se regenera el binario de un PJ2 con archivos en una ruta con paréntesis y espacios, se genera un error "Error 36, Command contains unrecognized phrase/keyword" (Nathan Brown)
* 11/07/2016 FDBOZZO v1.19.48 Bug Fix frx: Los ControlSource de objetos OLE que contienen comillas se generan mal (Nathan Brown)
+* 23/03/2017 FDBOZZO v1.19.49 Bug Fix vcx: No funciona la generación de una clase individual con "classlib.vcx::classname" (Lutz Scheffler)
+* 25/03/2017 FDBOZZO v1.19.49 Mejora vcx: Poder importar una clase (VC2 generado con ClassPerFile) en un VCX existente (Lutz Scheffler)
+* 26/03/2017 FDBOZZO v1.19.49 Mejora cfg: Se permite indicar un archivo CFG por parámetro de cualquier directorio para anular los CFG predeterminados de los subdirectorios, para casos especiales donde sea necesario
+* 28/03/2017 FDBOZZO v1.19.49 Mejora vcx: Implementada sintaxis para importar o exportar clases individuales usando "classlibrary.vcx::classname::import" y "classlibrary.vcx::classname::export"
+* 11/04/2017 FDBOZZO v1.19.49 Bug Fix frx: Cuando dentro de una expresión se usa "&&", se corrompe el registro del FRX generado (Alejandro A Sosa)
+* 11/04/2017 FDBOZZO v1.19.49 Mejora cfg : En modo objeto permitir indicar un objeto CFG en lugar de un archivo CFG (Lutz Scheffler)
+* 12/04/2017 DH&FDBOZZO v1.19.49 Bug Fix & Report pjx: No se estaba guardando el campo User en los archivos PJX (Doug Hennig)
*
*
*---------------------------------------------------------------------------------------------------
@@ -300,6 +307,11 @@
* 10/07/2016 Nathan Brown Reporte defecto v1.19.48-Preview3: Cuando se arregló el bug del memo multi-línea, se introdujo un nuevo defecto por el cual un memo de linea-simple se decodifica mal (Arreglado en v1.19.48 Preview-4)
* 11/07/2016 Nathan Brown Reporte bug pj2 v1.19.48-Preview4: Cuando se regenera el binario de un PJ2 con archivos en una ruta con paréntesis y espacios, se genera un error "Error 36, Command contains unrecognized phrase/keyword" (Arreglado en v1.19.48 Preview-5)
* 11/07/2016 Nathan Brown Reporte bug frx v1.19.48-Preview5: Los ControlSource de objetos OLE que contienen comillas se generan mal (Arreglado en v1.19.48 Preview-6)
+* 23/03/2017 Lutz Scheffler Reporte bug vcx v1.19.48: No funciona la generación de una clase individual con "classlib.vcx::classname" (Arreglado en v1.19.49)
+* 23/03/2017 Lutz Scheffler Mejora vcx v1.19.48: Poder importar una clase (VC2 generado con ClassPerFile) en un VCX existente (Agragado en v1.19.49)
+* 30/03/2017 Alejandro A Sosa Reporte bug frx v1.19.48: Cuando dentro de una expresión se usa "&&", se corrompe el registro del FRX generado (Arreglado en v1.19.49)
+* 28/03/2017 Lutz Scheffler Mejora cfg v1.19.48: En modo objeto permitir indicar un objeto CFG en lugar de un archivo CFG (Agragado en v1.19.49)
+* 06/04/2017 Doug Hennig Reporte Bug y arreglo parcial PJX v1.19.48: No se estaba guardando el campo User en los archivos PJX (Agregado en v1.19.49)
*
*
*---------------------------------------------------------------------------------------------------
@@ -761,11 +773,13 @@ DEFINE CLASS c_foxbin2prg AS Session
c_Foxbin2prg_FullPath = ''
c_Foxbin2prg_ConfigFile = ''
c_CurDir = ''
+ c_TempDir = SYS(2023)
c_InputFile = ''
c_ClassToConvert = '' && Guarda el nombre de la clase a convertir, indicada en tcInputFile como "archivo.vcx::clase"
+ c_ClassOperationType = '' && (I)mport o (E)xport. Se usa solo para manejar clases individuales.
c_OriginalFileName = ''
- c_LogFile = ADDBS( SYS(2023) ) + 'FoxBin2Prg_Debug.LOG'
- c_ErrorLogFile = ADDBS( SYS(2023) ) + 'FoxBin2Prg_Error.LOG'
+ c_LogFile = ''
+ c_ErrorLogFile = ''
c_TextLog = ''
c_OutputFile = ''
c_Recompile = '1'
@@ -775,6 +789,7 @@ DEFINE CLASS c_foxbin2prg AS Session
lFileMode = .F.
n_ExisteCapitalizacion = -1
l_CFG_CachedAccess = .F.
+ n_CFG_EvaluateFromParam = 0
n_Debug = 0
l_Error = .F. && Indicador de errores del proceso actual
l_Errors = .F. && Indicador de error de la sesión actual, acumulativo de todos los procesos
@@ -793,6 +808,7 @@ DEFINE CLASS c_foxbin2prg AS Session
n_ExcludeDBFAutoincNextval = 0
l_ClassPerFileCheck = .F.
l_RedirectClassPerFileToMain = .F.
+ n_RedirectClassType = 0 && 0=Redireccionar Todas las clases, 1=Redireccionar solo la clase indicada
l_NoTimestamps = .T.
c_BackgroundImage = ''
l_ClearUniqueID = .T.
@@ -865,6 +881,14 @@ DEFINE CLASS c_foxbin2prg AS Session
THIS.declareDLL()
+ * Check if SYS(2023) point to "Program Files"
+ IF ATC("\PROGRAM FILES", THIS.c_TempDir) > 0 OR ATC("\ARCHIVOS DE PROGRAMA", THIS.c_TempDir) > 0
+ THIS.c_TempDir = GETENV("TEMP")
+ ENDIF
+
+ THIS.c_LogFile = ADDBS( THIS.c_TempDir ) + 'FoxBin2Prg_Debug.LOG'
+ THIS.c_ErrorLogFile = ADDBS( THIS.c_TempDir ) + 'FoxBin2Prg_Error.LOG'
+
IF ADIR(laDir, THIS.c_ErrorLogFile) > 0 THEN
IF ADIR(laDir, THIS.c_ErrorLogFile + '.BAK') > 0 THEN
THIS.changeFileAttribute( THIS.c_ErrorLogFile + '.BAK', '-R-S-H' )
@@ -1198,6 +1222,15 @@ DEFINE CLASS c_foxbin2prg AS Session
ENDPROC
+ PROCEDURE n_RedirectClassType_ACCESS
+ IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) )
+ RETURN THIS.n_RedirectClassType
+ ELSE
+ RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).n_RedirectClassType, THIS.n_RedirectClassType )
+ ENDIF
+ ENDPROC
+
+
PROCEDURE l_RemoveNullCharsFromCode_ACCESS
IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) )
RETURN THIS.l_RemoveNullCharsFromCode
@@ -1814,6 +1847,7 @@ DEFINE CLASS c_foxbin2prg AS Session
LOCAL lcConfigFile, llExiste_CFG_EnDisco, laConfig(1), I, lcConfData, lcExt, lcValue, lc_CFG_Path, lcConfigLine, laDirInfo(1,5) ;
, lnDirs, laDirs(1), llMasterEval, lcProp ;
, lo_CFG AS CL_CFG OF 'FOXBIN2PRG.PRG' ;
+ , loCFG_Manual AS CL_CFG OF 'FOXBIN2PRG.PRG' ;
, lo_Configuration AS Collection ;
, loLang as CL_LANG OF 'FOXBIN2PRG.PRG' ;
, loEx as Exception
@@ -1828,6 +1862,15 @@ DEFINE CLASS c_foxbin2prg AS Session
tcInputFile_Type = EVL(tcInputFile_Type,'')
lo_Configuration = .o_Configuration
+ IF VARTYPE(lcConfigFile) = "O"
+ loCFG_Manual = lcConfigFile && lcConfigFile is an object CFG generated by get_DirSettings()
+ toParentCFG = loCFG_Manual
+ lcConfigFile = FULLPATH('Personalized-CFG-Object', tc_InputFile)
+ loCFG_Manual.c_Foxbin2prg_ConfigFile = 'Personalized-CFG-Object'
+ ELSE
+ loCFG_Manual = NULL
+ ENDIF
+
IF VARTYPE(toParentCFG) <> 'O' THEN
toParentCFG = NULL
ENDIF
@@ -1851,10 +1894,24 @@ DEFINE CLASS c_foxbin2prg AS Session
ENDIF
IF .l_Main_CFG_Loaded AND NOT EMPTY(tc_InputFile) AND NOT tcInputFile_Type == C_FILETYPE_QUERYSUPPORT THEN
- IF tcInputFile_Type == C_FILETYPE_DIRECTORY THEN
- lcConfigFile = FULLPATH( 'foxbin2prg.cfg', ADDBS(tc_InputFile) )
+ IF .n_CFG_EvaluateFromParam = 1
+ * Si se indicó por parámetro (modo objeto), usarlo como Maestro
+ * Se saltea solo esta evaluación, y luego se usa la variable para determinar el Nº de CFG a usar.
+ .n_CFG_EvaluateFromParam = -1 && Luego se cambia por el Nº de CFG que corresponda.
ELSE
- lcConfigFile = FULLPATH( 'foxbin2prg.cfg', tc_InputFile )
+ IF tcInputFile_Type == C_FILETYPE_DIRECTORY THEN
+ * INDICÓ DIRECTORIO
+ IF ISNULL(loCFG_Manual)
+ *lcConfigFile = FULLPATH( 'foxbin2prg.cfg', ADDBS(tc_InputFile) )
+ lcConfigFile = FULLPATH( JUSTFNAME(lcConfigFile), ADDBS(tc_InputFile) )
+ ENDIF
+ ELSE
+ * INDICÓ ARCHIVO
+ IF ISNULL(loCFG_Manual)
+ *lcConfigFile = FULLPATH( 'foxbin2prg.cfg', tc_InputFile )
+ lcConfigFile = FULLPATH( JUSTFNAME(lcConfigFile), tc_InputFile )
+ ENDIF
+ ENDIF
ENDIF
ENDIF
@@ -1868,11 +1925,22 @@ DEFINE CLASS c_foxbin2prg AS Session
IF .l_Main_CFG_Loaded
IF lo_Configuration.Count > 0 THEN
- .n_CFG_Actual = lo_Configuration.GetKey( lc_CFG_Path ) && 0 = No hay CFG cacheada, >0 = Hay CFG cacheada
+ IF .n_CFG_EvaluateFromParam > 1
+ * Especial: Si hay una configuración de bloqueo (CFG Manual), se usa
+ .n_CFG_Actual = .n_CFG_EvaluateFromParam
+ ELSE
+ * Normalmente se buscará el CFG del directorio analizado
+ .n_CFG_Actual = lo_Configuration.GetKey( lc_CFG_Path ) && 0 = No hay CFG cacheada, >0 = Hay CFG cacheada
+ ENDIF
IF .n_CFG_Actual > 0 THEN
lo_CFG = lo_Configuration.Item(.n_CFG_Actual)
.l_CFG_CachedAccess = .T.
+
+ IF NOT ISNULL(loCFG_Manual)
+ * Si le paso un objeto CFG, prevalece sobre el guardado
+ lo_CFG.CopyFrom(@loCFG_Manual)
+ ENDIF
ENDIF
ENDIF
@@ -2072,6 +2140,13 @@ DEFINE CLASS c_foxbin2prg AS Session
.writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > RedirectClassPerFileToMain: ' + TRANSFORM(lcValue) )
ENDIF
+ CASE LEFT( laConfig(I), 18 ) == LOWER('RedirectClassType:')
+ lcValue = ALLTRIM( SUBSTR( laConfig(I), 19 ) )
+ IF INLIST( lcValue, '0', '1' ) THEN
+ lo_CFG.n_RedirectClassType = INT( VAL( lcValue ) )
+ .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > RedirectClassType: ' + TRANSFORM(lcValue) )
+ ENDIF
+
CASE LEFT( laConfig(I), 24 ) == LOWER('RemoveNullCharsFromCode:')
lcValue = ALLTRIM( SUBSTR( laConfig(I), 25 ) )
IF INLIST( lcValue, '0', '1' ) THEN
@@ -2213,7 +2288,13 @@ DEFINE CLASS c_foxbin2prg AS Session
.l_Main_CFG_Loaded = .T.
- IF NOT llMasterEval
+ IF llMasterEval
+ * Si se inidicó un archivo CFG por parámetro (modo objeto), aqui se bloquea
+ * al Nº de configuración correspondiente.
+ IF .n_CFG_EvaluateFromParam = -1
+ .n_CFG_EvaluateFromParam = .n_CFG_Actual
+ ENDIF
+ ELSE
*-- Si no es llMasterEval, es porque esta llamada es cíclica desde este mismo método,
*-- y no hay parámetros para evaluar, ya que se mandan todos vacíos desde el inicial.
EXIT
@@ -2232,6 +2313,7 @@ DEFINE CLASS c_foxbin2prg AS Session
.writeLog( C_TAB + 'n_UseClassPerFile: ' + TRANSFORM(.n_UseClassPerFile) )
.writeLog( C_TAB + 'l_ClassPerFileCheck: ' + TRANSFORM(.l_ClassPerFileCheck) )
.writeLog( C_TAB + 'l_RedirectClassPerFileToMain: ' + TRANSFORM(.l_RedirectClassPerFileToMain) )
+ .writeLog( C_TAB + 'n_RedirectClassType: ' + TRANSFORM(.n_RedirectClassType) )
.writeLog( C_TAB + 'n_Debug: ' + TRANSFORM(.n_Debug) )
.writeLog( C_TAB + 'n_ExtraBackupLevels: ' + TRANSFORM(.n_ExtraBackupLevels) )
.writeLog( C_TAB + 'c_BackgroundImage: ' + TRANSFORM(.c_BackgroundImage) )
@@ -2537,8 +2619,8 @@ DEFINE CLASS c_foxbin2prg AS Session
, lcExt == .c_LB2, .LBX_Conversion_Support = 2 ;
, lcExt == .c_MN2, .MNX_Conversion_Support = 2 ;
, lcExt == .c_DB2, NOT ISNULL(loDBF_CFG) AND INLIST(loDBF_CFG.DBF_Conversion_Support, 2, 8) ;
- OR (INLIST(.DBF_Conversion_Support, 2, 8) ;
- AND (ISNULL(loDBF_CFG) OR NOT INLIST(loDBF_CFG.DBF_Conversion_Support, 1, 4))) ;
+ OR (INLIST(.DBF_Conversion_Support, 2, 8) ;
+ AND (ISNULL(loDBF_CFG) OR NOT INLIST(loDBF_CFG.DBF_Conversion_Support, 1, 4))) ;
, lcExt == .c_DC2, .DBC_Conversion_Support = 2 ;
, .F. )
ENDWITH && THIS
@@ -2637,6 +2719,7 @@ DEFINE CLASS c_foxbin2prg AS Session
, lnFileCount, lcErrorInfo, lcErrorFile, lnPCount, laParams(1), lnConversionOption, lnErrorIcon, llError ;
, lcOldSetEscape, lcOldOnEscape, llEscKeyRestored ;
, loEx AS EXCEPTION ;
+ , loCFG AS CL_CFG OF 'FOXBIN2PRG.PRG' ;
, loFSO AS Scripting.FileSystemObject ;
, loLang AS CL_LANG OF 'FOXBIN2PRG.PRG' ;
, loFrm_Interactive AS frm_interactive OF 'FOXBIN2PRG.PRG' ;
@@ -2651,6 +2734,7 @@ DEFINE CLASS c_foxbin2prg AS Session
loLang = _SCREEN.o_FoxBin2Prg_Lang
loFSO = .o_FSO
loWSH = .o_WSH
+ loCFG = NULL
lnPCount = 0
lcInputFile_Type = ''
.l_Error = .F.
@@ -2703,12 +2787,31 @@ DEFINE CLASS c_foxbin2prg AS Session
*ENDIF
*-- Reconocimiento de la clase indicada
+ *-- Ej: [c:\desa\test\library.vcx::classname]
IF '::' $ tc_InputFile THEN
- .c_ClassToConvert = LOWER( ALLTRIM( GETWORDNUM( tc_InputFile, 2, '::' ) ) )
- tc_InputFile = LOWER( ALLTRIM( GETWORDNUM( tc_InputFile, 1, '::' ) ) )
+ tc_InputFile = STRTRAN(tc_InputFile, '::', '|')
+ .c_ClassOperationType = EVL( UPPER( LEFT( ALLTRIM( GETWORDNUM( tc_InputFile, 3, '|' ) ), 1) ), 'E')
+ .c_ClassToConvert = LOWER( ALLTRIM( GETWORDNUM( tc_InputFile, 2, '|' ) ) )
+ * CUIDADO!, evaluar esta última, que si no las anteriores no evalúan.
+ tc_InputFile = LOWER( ALLTRIM( GETWORDNUM( tc_InputFile, 1, '|' ) ) )
+ ELSE
+ .c_ClassOperationType = ''
ENDIF
- .c_Foxbin2prg_ConfigFile = EVL( tcCFG_File, .c_Foxbin2prg_ConfigFile )
+ IF VARTYPE(tcCFG_File) = "O"
+ * Validar el objeto
+ loCFG = tcCFG_File
+ IF NOT (loCFG.Class == PROPER('CL_CFG'))
+ ERROR 'CFG object: Invalid class. Please, generate it with get_DirSettings()'
+ ENDIF
+
+ .c_Foxbin2prg_ConfigFile = loCFG
+ .n_CFG_EvaluateFromParam = 1
+
+ ELSE
+ .c_Foxbin2prg_ConfigFile = EVL( tcCFG_File, .c_Foxbin2prg_ConfigFile )
+ .n_CFG_EvaluateFromParam = (IIF(EMPTY(tcCFG_File), 0, 1))
+ ENDIF
*-- Ajusto la ruta si no es absoluta
tc_InputFile = .get_AbsolutePath( tc_InputFile, .c_CurDir )
@@ -2764,6 +2867,23 @@ DEFINE CLASS c_foxbin2prg AS Session
.evaluateConfiguration( @tcDontShowProgress, @tcDontShowErrors, @tcNoTimestamps, @tcDebug, @tcRecompile, @tcBackupLevels ;
, @tcClearUniqueID, @tcOptimizeByFilestamp, @tc_InputFile, @lcInputFile_Type )
+ * Redefinir nombre archivo de entrada según el tipo de conversión (IMPORT/EXPORT)
+ IF .c_ClassOperationType = 'I'
+ * En el caso de importar, debo cambiar la sintaxis de tc_InputFile para poder usar
+ * la conversión existente de clase vc2
+ IF .n_UseClassPerFile = 2
+ tc_InputFile = FORCEEXT(tc_InputFile, '') + '.*.' + .c_ClassToConvert + '.' + .c_VC2
+
+ IF ADIR(laFiles, tc_InputFile) = 1
+ tc_InputFile = FULLPATH( laFiles(1,1), tc_InputFile )
+ ENDIF
+
+ ELSE && Asumo .n_UseClassPerFile = 1
+ tc_InputFile = FORCEEXT(tc_InputFile, '') + '.' + .c_ClassToConvert + '.' + .c_VC2
+
+ ENDIF
+ ENDIF
+
loLang = _SCREEN.o_FoxBin2Prg_Lang
DO CASE
@@ -3585,10 +3705,16 @@ DEFINE CLASS c_foxbin2prg AS Session
lcForceAttribs = lcForceAttribs + '-R'
ENDIF
-
*-- OPTIMIZACIÓN VC2/SC2/DC2: VERIFICO SI EL ARCHIVO BASE FUE PROCESADO PARA DESCARTAR REPROCESOS
IF .n_UseClassPerFile > 0 AND .l_RedirectClassPerFileToMain THEN
DO CASE
+ CASE .n_RedirectClassType = 1 && Redireccionar solo esta clase
+ IF OCCURS('.', JUSTSTEM(.c_InputFile)) = 0 THEN
+ lc_BaseFile = .c_InputFile
+ ELSE
+ lc_BaseFile = FORCEPATH( FORCEEXT( JUSTSTEM( JUSTSTEM(.c_InputFile) ), JUSTEXT(.c_InputFile)) , JUSTPATH(.c_InputFile) )
+ ENDIF
+
CASE .n_UseClassPerFile = 1 AND INLIST(lcExtension,.c_VC2,.c_SC2)
IF OCCURS('.', JUSTSTEM(.c_InputFile)) = 0 THEN
lc_BaseFile = .c_InputFile
@@ -3955,8 +4081,8 @@ DEFINE CLASS c_foxbin2prg AS Session
ENDIF
IF ISNULL(loCFG) THEN
- lo_CFG = CREATEOBJECT('CL_CFG')
- lo_CFG.CopyFrom(THIS)
+ loCFG = CREATEOBJECT('CL_CFG')
+ loCFG.CopyFrom(THIS)
ENDIF
RETURN loCFG
@@ -6313,10 +6439,10 @@ DEFINE CLASS c_conversor_base AS Custom
PROCEDURE fileTypeCode
- LPARAMETERS tcExtension
+ LPARAMETERS tcExtension, tcOriginalType
tcExtension = UPPER(tcExtension)
RETURN ICASE( tcExtension = 'DBC', 'd' ;
- , tcExtension = 'DBF', 'D' ;
+ , tcExtension = 'DBF', EVL(tcOriginalType, 'D') ;
, tcExtension = 'QPR', 'Q' ;
, tcExtension = 'SCX', 'K' ;
, tcExtension = 'FRX', 'R' ;
@@ -7754,6 +7880,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
, RESERVED2 ;
, SCCDATA ;
, LOCAL ;
+ , USER ;
, KEY ) ;
VALUES ;
( UPPER(EVL(THIS.c_OriginalFileName,THIS.c_OutputFile)) ;
@@ -7773,6 +7900,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
, toProject._ServerHead.getRowServerInfo() ;
, toProject._SccData ;
, .T. ;
+ , STRCONV(toProject._User,14) ;
, UPPER( JUSTSTEM( THIS.c_OutputFile) ) )
ENDPROC
@@ -8323,7 +8451,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
lnSelect = SELECT()
SELECT 0
USE (THIS.c_InputFile) SHARED AGAIN ALIAS _TABLABIN
- COPY STRUCTURE EXTENDED TO ( FORCEPATH( '_FRX_STRUC.DBF', ADDBS( SYS(2023) ) ) )
+ COPY STRUCTURE EXTENDED TO ( FORCEPATH( '_FRX_STRUC.DBF', ADDBS( THIS.c_TempDir ) ) )
**** CONTINUAR SI ES NECESARIO - SIN USO POR AHORA /// DO NOT USE - NOT IMPLEMENTED!
CATCH TO loEx
@@ -8462,7 +8590,8 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
, RESERVED6 ;
, RESERVED7 ;
, RESERVED8 ;
- , USER) ;
+ , USER ;
+ , DEVINFO ) ;
VALUES ;
( 'WINDOWS' ;
, toObjeto._UniqueID ;
@@ -8485,7 +8614,8 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
, '' ;
, '' ;
, '' ;
- , toObjeto._User )
+ , STRCONV(toObjeto._User,14) ;
+ , STRCONV(toObjeto._DevInfo,14) )
ENDIF
ENDWITH && THIS
@@ -9836,7 +9966,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
*-- Verificación de las Clases, si son Externas y se indicó chequearlas
DO CASE
- CASE toFoxBin2Prg.n_UseClassPerFile = 1 AND toFoxBin2Prg.l_ClassPerFileCheck
+ CASE toFoxBin2Prg.n_UseClassPerFile = 1 AND toFoxBin2Prg.l_ClassPerFileCheck AND EMPTY(toFoxBin2Prg.c_ClassOperationType)
*-- El ClassPerFile original, con nomenclatura 'Libreria.NombreClase.vc2'
FOR I = 1 TO toModulo._ExternalClasses_Count
lnItem = 0
@@ -9857,7 +9987,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
toModulo._Clases(lnItem)._Checked = .T.
ENDFOR
- CASE toFoxBin2Prg.n_UseClassPerFile = 2 AND toFoxBin2Prg.l_ClassPerFileCheck
+ CASE toFoxBin2Prg.n_UseClassPerFile = 2 AND toFoxBin2Prg.l_ClassPerFileCheck AND EMPTY(toFoxBin2Prg.c_ClassOperationType)
*-- El nuevo ClassPerFile, con nomenclatura 'Libreria.ClaseBase.NombreClase.vc2'
FOR I = 1 TO toModulo._ExternalClasses_Count
lnItem = 0
@@ -9914,7 +10044,7 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin
TRY
LOCAL lnCodError, laCodeLines(1), lnCodeLines, lcInputFile, lcInputFile_Class, lnFileCount, laFiles(1,5) ;
- , laLineasExclusion(1), lnBloquesExclusion, I, lcClassName, lnIDInputFile ;
+ , laLineasExclusion(1), lnBloquesExclusion, I, lcClassName, lnIDInputFile, llReplaceClass ;
, loLang as CL_LANG OF 'FOXBIN2PRG.PRG'
WITH THIS AS c_conversor_prg_a_vcx OF 'FOXBIN2PRG.PRG'
@@ -9927,29 +10057,39 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin
lnIDInputFile = toFoxBin2Prg.n_ProcessedFiles
IF toFoxBin2Prg.n_UseClassPerFile > 0 AND toFoxBin2Prg.l_RedirectClassPerFileToMain
- C_FB2PRG_CODE = FILETOSTR( .c_InputFile )
+ IF toFoxBin2Prg.n_RedirectClassType = 0 && Redireccionar todas las clases
+ C_FB2PRG_CODE = FILETOSTR( .c_InputFile )
- lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE )
+ lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE )
- .updateProgressbar( 'Identifying Header Blocks...', 1, lnCodeLines, 1 )
- .identifyHeaderBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toModulo, @toFoxBin2Prg )
+ .updateProgressbar( 'Identifying Header Blocks...', 1, lnCodeLines, 1 )
+ .identifyHeaderBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toModulo, @toFoxBin2Prg )
- .updateProgressbar( 'Loading Code...', 2, lnCodeLines, 1 )
+ .updateProgressbar( 'Loading Code...', 2, lnCodeLines, 1 )
+ ENDIF
*-- MÁSCARA DE BÚSQUEDA
IF toFoxBin2Prg.n_UseClassPerFile = 1 THEN
*-- Esto crea la máscara de búsqueda "filename.*.ext" para encontrar las partes
+ *-- con la sintaxis "Classlib.Classname.ext" o "Database.MemberName.ext"
lcBaseFilename = JUSTSTEM( JUSTSTEM(.c_InputFile) )
lcInputFile = ADDBS( JUSTPATH(.c_InputFile) ) + lcBaseFilename + '.*.' + JUSTEXT(.c_InputFile)
ELSE && toFoxBin2Prg.n_UseClassPerFile = 2
- *-- Esto crea la máscara de búsqueda "Database.*.*.ext" para encontrar las partes
- *-- con la sintaxis "Database.MemberType.MemberName.ext"
+ *-- Esto crea la máscara de búsqueda "filename.*.*.ext" para encontrar las partes
+ *-- con la sintaxis "Classlib.ClassType.Classname.ext" o "Database.MemberType.MemberName.ext"
lcBaseFilename = JUSTSTEM( JUSTSTEM( JUSTSTEM(.c_InputFile) ) )
lcInputFile = ADDBS( JUSTPATH(.c_InputFile) ) + lcBaseFilename + '.*.*.' + JUSTEXT(.c_InputFile)
ENDIF
+ IF toFoxBin2Prg.n_RedirectClassType = 1 && Redireccionar solo esta clase
+ lcInputFile = .c_InputFile
+ ENDIF
+
lnFileCount = ADIR( laFiles, lcInputFile, "", 1 )
- ASORT( laFiles, 1, 0, 0, 1)
+
+ IF lnFileCount > 1
+ ASORT( laFiles, 1, 0, 0, 1)
+ ENDIF
FOR I = 1 TO lnFileCount
IF toFoxBin2Prg.n_UseClassPerFile = 1 THEN
@@ -9957,20 +10097,22 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin
lcClassName = LOWER( GETWORDNUM( JUSTFNAME( lcInputFile_Class ), 2, '.' ) )
*-- Verificación de las Clases, si son Externas y se indicó chequearlas
- IF toFoxBin2Prg.l_ClassPerFileCheck AND ASCAN( toModulo._ExternalClasses , lcClassName, 1, 0, 1, 1+2+4 ) = 0
+ IF toFoxBin2Prg.l_ClassPerFileCheck AND EMPTY(toFoxBin2Prg.c_ClassOperationType) ;
+ AND ASCAN( toModulo._ExternalClasses , lcClassName, 1, 0, 1, 1+2+4 ) = 0
.writeLog( C_TAB + '- ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' )
.writeErrorLog( C_TAB + '- ' + loLang.C_WARNING_LOC + ' ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' )
- LOOP && Salteo esta clase
+ LOOP && Salteo esta clase porque se indicó chequear y no concuerda con las anotadas
ENDIF
ELSE && toFoxBin2Prg.n_UseClassPerFile = 2
lcInputFile_Class = FORCEPATH( JUSTSTEM( laFiles(I,1) ), JUSTPATH( .c_InputFile ) ) + '.' + JUSTEXT( .c_InputFile )
lcClassName = LOWER( GETWORDNUM( JUSTFNAME( lcInputFile_Class ), 2, '.' ) + '.' + GETWORDNUM( JUSTFNAME( lcInputFile_Class ), 3, '.' ) )
*-- Verificación de las Clases, si son Externas y se indicó chequearlas
- IF toFoxBin2Prg.l_ClassPerFileCheck AND ASCAN( toModulo._ExternalClasses , lcClassName, 1, 0, 2, 1+2+4 ) = 0
+ IF toFoxBin2Prg.l_ClassPerFileCheck AND EMPTY(toFoxBin2Prg.c_ClassOperationType) ;
+ AND ASCAN( toModulo._ExternalClasses , lcClassName, 1, 0, 2, 1+2+4 ) = 0
.writeLog( C_TAB + '- ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' )
.writeErrorLog( C_TAB + '- ' + loLang.C_WARNING_LOC + ' ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' )
- LOOP && Salteo esta clase porque no concuerda con las anotadas
+ LOOP && Salteo esta clase porque se indicó chequear y no concuerda con las anotadas
ENDIF
ENDIF
@@ -10030,9 +10172,23 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin
toFoxBin2Prg.updateProcessedFile( lnIDInputFile )
.updateProgressbar( loLang.C_GENERATING_BINARY_LOC + '...', 0, lnCodeLines, 1 )
- toFoxBin2Prg.doBackup( .F., .T., '', '', '' )
- .createClasslib()
- .writeBinaryFile( @toModulo, @toFoxBin2Prg )
+
+ IF toFoxBin2Prg.n_RedirectClassType = 1 && Redireccionar solo esta clase a main
+ llReplaceClass = .T.
+ toFoxBin2Prg.c_OutputFile = FULLPATH( FORCEEXT( lcBaseFilename, 'VCX' ), .c_InputFile)
+ toFoxBin2Prg.doBackup( .F., .T., '', '', '' )
+
+ IF ADIR( laFiles, toFoxBin2Prg.c_OutputFile, "", 1 ) = 1
+ USE (toFoxBin2Prg.c_OutputFile) ALIAS TABLABIN AGAIN SHARED
+ ELSE
+ .createClasslib()
+ ENDIF
+ ELSE
+ toFoxBin2Prg.doBackup( .F., .T., '', '', '' )
+ .createClasslib()
+ ENDIF
+
+ .writeBinaryFile( @toModulo, @toFoxBin2Prg, llReplaceClass )
ENDWITH && THIS
@@ -10056,7 +10212,7 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin
PROCEDURE writeBinaryFile
- LPARAMETERS toModulo, toFoxBin2Prg
+ LPARAMETERS toModulo, toFoxBin2Prg, tlReplaceClass
*-- Estructura del objeto toModulo generado:
*-- -----------------------------------------------------------------------------------------------------------
*-- Version Versión usada para generar la versión PRG analizada
@@ -10128,7 +10284,7 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin
#ENDIF
TRY
- LOCAL lcObjName, lnCodError, I, X, loEx AS EXCEPTION ;
+ LOCAL lcObjName, lnCodError, I, X, llReplace, laUniqueID(1,1), loEx AS EXCEPTION ;
, loClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' ;
, loFSO AS Scripting.FileSystemObject
@@ -10145,131 +10301,178 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin
ERROR 'OutputFile Error Simulation'
ENDCASE
- *-- Creo el registro de cabecera
- .createClasslib_RecordHeader( toModulo )
+ IF tlReplaceClass
+ I = 1
+ loClase = toModulo._Clases(I)
+ LOCATE FOR PLATFORM == PADR('WINDOWS', FSIZE('PLATFORM')) AND OBJNAME == loClase._ObjName
+ llReplace = FOUND()
+ ENDIF
+
+ IF llReplace
+ *-- Reemplazar los campos del registro actual
+ IF EMPTY(loClase._TimeStamp)
+ loClase._TimeStamp = .rowTimeStamp( {^2013/11/04 20:00:00} )
+ ENDIF
+ IF EMPTY(loClase._UniqueID)
+ loClase._UniqueID = toFoxBin2Prg.unique_ID()
+ ENDIF
+
+ REPLACE ;
+ PLATFORM WITH 'WINDOWS' ;
+ , TIMESTAMP WITH loClase._TimeStamp ;
+ , CLASS WITH loClase._Class ;
+ , CLASSLOC WITH loClase._ClassLoc ;
+ , BASECLASS WITH loClase._BaseClass ;
+ , OBJNAME WITH loClase._ObjName ;
+ , PARENT WITH loClase._Parent ;
+ , PROPERTIES WITH loClase._PROPERTIES ;
+ , PROTECTED WITH loClase._PROTECTED ;
+ , METHODS WITH loClase._METHODS ;
+ , OLE WITH loClase._Ole ;
+ , OLE2 WITH loClase._Ole2 ;
+ , RESERVED1 WITH loClase._RESERVED1 ;
+ , RESERVED2 WITH loClase._RESERVED2 ;
+ , RESERVED3 WITH loClase._RESERVED3 ;
+ , RESERVED4 WITH loClase._RESERVED4 ;
+ , RESERVED5 WITH loClase._RESERVED5 ;
+ , RESERVED6 WITH loClase._RESERVED6 ;
+ , RESERVED7 WITH loClase._RESERVED7 ;
+ , RESERVED8 WITH loClase._RESERVED8 ;
+ , USER WITH loClase._User
+
+ .insert_AllObjects( @loClase, @toFoxBin2Prg )
+
+ ELSE
+ *-- Creo el registro de cabecera
+ IF tlReplaceClass AND RECCOUNT() > 0
+ SELECT MAX(VAL(SUBSTR(UNIQUEID,2))) FROM TABLABIN INTO ARRAY laUniqueID
+ toFoxBin2Prg.n_ID = laUniqueID(1)
+ ELSE
+ .createClasslib_RecordHeader( toModulo )
+ ENDIF
+
+ *-- Recorro las CLASES
+ FOR X = 1 TO 2
+ FOR I = 1 TO toModulo._Clases_Count
+ loClase = NULL
+ loClase = toModulo._Clases(I)
+
+ *-- El dataenvironment debe estar primero, luego lo demás.
+ IF X = 1 AND NOT loClase._BaseClass == 'dataenvironment' ;
+ OR X = 2 AND loClase._BaseClass == 'dataenvironment'
+ LOOP
+ ENDIF
+
+ IF EMPTY(loClase._TimeStamp)
+ loClase._TimeStamp = .rowTimeStamp( {^2013/11/04 20:00:00} )
+ ENDIF
+ IF EMPTY(loClase._UniqueID)
+ loClase._UniqueID = toFoxBin2Prg.unique_ID()
+ ENDIF
+
+ *-- Inserto la clase
+ 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' ;
+ , loClase._UniqueID ;
+ , loClase._TimeStamp ;
+ , loClase._Class ;
+ , loClase._ClassLoc ;
+ , loClase._BaseClass ;
+ , loClase._ObjName ;
+ , loClase._Parent ;
+ , loClase._PROPERTIES ;
+ , loClase._PROTECTED ;
+ , loClase._METHODS ;
+ , loClase._Ole ;
+ , loClase._Ole2 ;
+ , loClase._RESERVED1 ;
+ , loClase._RESERVED2 ;
+ , loClase._RESERVED3 ;
+ , loClase._ClassIcon ;
+ , loClase._ProjectClassIcon ;
+ , loClase._Scale ;
+ , loClase._Comentario ;
+ , loClase._includeFile ;
+ , loClase._User )
- *-- Recorro las CLASES
- FOR X = 1 TO 2
- FOR I = 1 TO toModulo._Clases_Count
- loClase = NULL
- loClase = toModulo._Clases(I)
-
- *-- El dataenvironment debe estar primero, luego lo demás.
- IF X = 1 AND NOT loClase._BaseClass == 'dataenvironment' ;
- OR X = 2 AND loClase._BaseClass == 'dataenvironment'
- LOOP
- ENDIF
-
- IF EMPTY(loClase._TimeStamp)
- loClase._TimeStamp = .rowTimeStamp( {^2013/11/04 20:00:00} )
- ENDIF
- IF EMPTY(loClase._UniqueID)
- loClase._UniqueID = toFoxBin2Prg.unique_ID()
- ENDIF
-
- *-- Inserto la clase
- 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' ;
- , loClase._UniqueID ;
- , loClase._TimeStamp ;
- , loClase._Class ;
- , loClase._ClassLoc ;
- , loClase._BaseClass ;
- , loClase._ObjName ;
- , loClase._Parent ;
- , loClase._PROPERTIES ;
- , loClase._PROTECTED ;
- , loClase._METHODS ;
- , loClase._Ole ;
- , loClase._Ole2 ;
- , loClase._RESERVED1 ;
- , loClase._RESERVED2 ;
- , loClase._RESERVED3 ;
- , loClase._ClassIcon ;
- , loClase._ProjectClassIcon ;
- , loClase._Scale ;
- , loClase._Comentario ;
- , loClase._includeFile ;
- , loClase._User )
+ .insert_AllObjects( @loClase, @toFoxBin2Prg )
- .insert_AllObjects( @loClase, @toFoxBin2Prg )
+ *-- Inserto el COMMENT
+ 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 ;
+ ( 'COMMENT' ;
+ , 'RESERVED' ;
+ , 0 ;
+ , '' ;
+ , '' ;
+ , '' ;
+ , loClase._ObjName ;
+ , '' ;
+ , '' ;
+ , '' ;
+ , '' ;
+ , '' ;
+ , '' ;
+ , '' ;
+ , IIF(loClase._OlePublic, 'OLEPublic', '') ;
+ , '' ;
+ , '' ;
+ , '' ;
+ , '' ;
+ , '' ;
+ , '' ;
+ , '' )
-
- *-- Inserto el COMMENT
- 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 ;
- ( 'COMMENT' ;
- , 'RESERVED' ;
- , 0 ;
- , '' ;
- , '' ;
- , '' ;
- , loClase._ObjName ;
- , '' ;
- , '' ;
- , '' ;
- , '' ;
- , '' ;
- , '' ;
- , '' ;
- , IIF(loClase._OlePublic, 'OLEPublic', '') ;
- , '' ;
- , '' ;
- , '' ;
- , '' ;
- , '' ;
- , '' ;
- , '' )
-
- ENDFOR && I = 1 TO toModulo._Clases_Count
- ENDFOR && X = 1 TO 2
+ ENDFOR && I = 1 TO toModulo._Clases_Count
+ ENDFOR && X = 1 TO 2
+ ENDIF
USE IN (SELECT("TABLABIN"))
@@ -10375,7 +10578,8 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin
lcClassName = LOWER( GETWORDNUM( JUSTFNAME( lcInputFile_Class ), 2, '.' ) )
*-- Verificación de las Clases, si son Externas y se indicó chequearlas
- IF toFoxBin2Prg.l_ClassPerFileCheck AND ASCAN( toModulo._ExternalClasses , lcClassName, 1, 0, 1, 1+2+4 ) = 0
+ IF toFoxBin2Prg.l_ClassPerFileCheck AND EMPTY(toFoxBin2Prg.c_ClassOperationType) ;
+ AND ASCAN( toModulo._ExternalClasses , lcClassName, 1, 0, 1, 1+2+4 ) = 0
.writeLog( C_TAB + '- ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' )
.writeErrorLog( C_TAB + '- ' + loLang.C_WARNING_LOC + ' ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' )
LOOP && Salteo esta clase
@@ -10385,7 +10589,8 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin
lcClassName = LOWER( GETWORDNUM( JUSTFNAME( lcInputFile_Class ), 2, '.' ) + '.' + GETWORDNUM( JUSTFNAME( lcInputFile_Class ), 3, '.' ) )
*-- Verificación de las Clases, si son Externas y se indicó chequearlas
- IF toFoxBin2Prg.l_ClassPerFileCheck AND ASCAN( toModulo._ExternalClasses , lcClassName, 1, 0, 2, 1+2+4 ) = 0
+ IF toFoxBin2Prg.l_ClassPerFileCheck AND EMPTY(toFoxBin2Prg.c_ClassOperationType) ;
+ AND ASCAN( toModulo._ExternalClasses , lcClassName, 1, 0, 2, 1+2+4 ) = 0
.writeLog( C_TAB + '- ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' )
.writeErrorLog( C_TAB + '- ' + loLang.C_WARNING_LOC + ' ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' )
LOOP && Salteo esta clase
@@ -10907,10 +11112,12 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin
, ID ;
, TIMESTAMP ;
, OBJREV ;
+ , USER ;
+ , DEVINFO ;
, KEY ) ;
VALUES ;
( loFile._Name + CHR(0) ;
- , .fileTypeCode(JUSTEXT(loFile._Name)) ;
+ , .fileTypeCode(JUSTEXT(loFile._Name), loFile._Type) ;
, loFile._Exclude ;
, (loFile._Name == lcMainProg) ;
, loFile._Comments ;
@@ -10919,6 +11126,8 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin
, loFile._ID ;
, loFile._TimeStamp ;
, loFile._ObjRev ;
+ , STRCONV(loFile._User,14) ;
+ , STRCONV(loFile._DevInfo,14) ;
, UPPER(JUSTSTEM(loFile._Name)) )
ENDFOR
@@ -11091,6 +11300,8 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin
loFile._TimeStamp = .get_ValueByName_FromListNamesWithValues( 'Timestamp', 'I', @laPropsAndValues )
loFile._ID = .get_ValueByName_FromListNamesWithValues( 'ID', 'I', @laPropsAndValues )
loFile._ObjRev = .get_ValueByName_FromListNamesWithValues( 'ObjRev', 'I', @laPropsAndValues )
+ loFile._User = .get_ValueByName_FromListNamesWithValues( 'User', 'C', @laPropsAndValues )
+ loFile._DevInfo = .get_ValueByName_FromListNamesWithValues( 'DevInfo', 'C', @laPropsAndValues )
toProject.ADD( loFile, loFile._Name )
@@ -11905,7 +12116,7 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin
lnLenPropName = LEN(laProps(X))
lnPos2 = AT( '"', SUBSTR( tcLine, lnPos + lnLenPropName + 2 ) )
lcValue = SUBSTR( tcLine, lnPos + lnLenPropName + 2, lnPos2 - 1 )
-
+
IF laProps(X) == ' NAME' AND NOT EMPTY(lcValue)
lcValue = THIS.denormalizeXMLValue(lcValue)
ENDIF
@@ -11964,9 +12175,6 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin
I = I + 1
EXIT
- CASE .lineIsOnlyCommentAndNoMetadata( @tcLine, @lcComment )
- LOOP && Saltear comentarios
-
CASE .analyzeCodeBlock_platform( toReport, @tcLine, @taCodeLines, @I, @tnCodeLines, @loReg )
CASE .analyzeCodeBlock_CDATA_inline( toReport, @tcLine, @taCodeLines, @I, tnCodeLines, @loReg, 'picture' )
@@ -12080,10 +12288,10 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin
WITH toFoxBin2Prg
ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC))
ENDWITH
-
+
CASE lnFileCount = 1 AND loDBF_CFG.DBF_Conversion_Support > 0 && Implica 2 u 8
llImportData = (loDBF_CFG.DBF_Conversion_Support = 8)
-
+
CASE toFoxBin2Prg.DBF_Conversion_Support = 8 && TXT2BIN (DATA IMPORT)
llImportData = .T.
@@ -12589,7 +12797,8 @@ DEFINE CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin
ENDIF
*-- Verificación de los Miembros, si son Externos y se indicó chequearlos
- IF toFoxBin2Prg.l_ClassPerFileCheck AND ASCAN( toDatabase._ExternalClasses, lcMemberType + '.' + lcMemberName, 1, 0, 1, 1+2+4 ) = 0
+ IF toFoxBin2Prg.l_ClassPerFileCheck AND EMPTY(toFoxBin2Prg.c_ClassOperationType) ;
+ AND ASCAN( toDatabase._ExternalClasses, lcMemberType + '.' + lcMemberName, 1, 0, 1, 1+2+4 ) = 0
.writeLog( C_TAB + '- ' + loLang.C_OUTER_MEMBER_DOES_NOT_MATCH_INNER_MEMBERS_LOC + ' [' + lcInputFile_Class + ']' )
.writeErrorLog( C_TAB + '- ' + loLang.C_WARNING_LOC + ' ' + loLang.C_OUTER_MEMBER_DOES_NOT_MATCH_INNER_MEMBERS_LOC + ' [' + lcInputFile_Class + ']' )
LOOP && Salteo este miembro porque no concuerda con los anotados
@@ -12942,7 +13151,7 @@ DEFINE CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin
loLang = _SCREEN.o_FoxBin2Prg_Lang
*-- Verificación de los Miembros, si son Externos y se indicó chequearlos
- IF toFoxBin2Prg.n_UseClassPerFile > 0 AND toFoxBin2Prg.l_ClassPerFileCheck
+ IF toFoxBin2Prg.n_UseClassPerFile > 0 AND toFoxBin2Prg.l_ClassPerFileCheck AND EMPTY(toFoxBin2Prg.c_ClassOperationType)
FOR I = 1 TO toDatabase._ExternalClasses_Count
lnItem = 0
@@ -15871,8 +16080,11 @@ DEFINE CLASS c_conversor_pjx_a_prg AS c_conversor_bin_a_prg
Timestamp="<>"
ID="<>"
ObjRev="<>"
+ User="<>"
+ DevInfo="<>"
<>
ENDTEXT
+
loReg = NULL
ENDFOR
@@ -15961,6 +16173,7 @@ DEFINE CLASS c_conversor_pjx_a_prg AS c_conversor_bin_a_prg
<<>> *<.CmntStyle = <> />
<<>> *<.NoLogo = <> />
<<>> *<.SaveCode = <> />
+ <<>> *<.User = '<>' />
<<>> .ProjectHookLibrary = '<>'
<<>> .ProjectHookClass = '<>'
<<>> <>
@@ -15968,7 +16181,6 @@ DEFINE CLASS c_conversor_pjx_a_prg AS c_conversor_bin_a_prg
<<>>
ENDTEXT
-
*-- Build y cierre
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
<<>>
@@ -16091,6 +16303,7 @@ DEFINE CLASS c_conversor_pjx_a_prg AS c_conversor_bin_a_prg
loProject._ServerInfo = loReg.RESERVED2
loProject._Debug = loReg.DEBUG
loProject._Encrypted = loReg.ENCRYPT
+ loProject._User = loReg.USER
loProject.parseDeviceInfo( loReg.DEVINFO )
*-- Información de los Servidores definidos
@@ -16128,7 +16341,7 @@ DEFINE CLASS c_conversor_pjx_a_prg AS c_conversor_bin_a_prg
*-- Escaneo el proyecto
SCAN ALL FOR NOT INLIST(TYPE, 'H','W','i' )
loReg = NULL
- SCATTER FIELDS NAME,TYPE,EXCLUDE,COMMENTS,CPID,TIMESTAMP,ID,OBJREV MEMO NAME loReg
+ SCATTER FIELDS NAME,TYPE,EXCLUDE,COMMENTS,CPID,TIMESTAMP,ID,OBJREV,USER,DEVINFO MEMO NAME loReg
IF toFoxBin2Prg.l_NoTimestamps
loReg.TIMESTAMP = 0
@@ -16501,6 +16714,7 @@ DEFINE CLASS c_conversor_pjm_a_prg AS c_conversor_bin_a_prg
<<>> *<.CmntStyle = <> />
<<>> *<.NoLogo = <> />
<<>> *<.SaveCode = <> />
+ <<>> *<.User = <> />
<<>> .ProjectHookLibrary = '<>'
<<>> .ProjectHookClass = '<>'
<<>> <>
@@ -18103,6 +18317,7 @@ DEFINE CLASS CL_PROJECT AS CL_COL_BASE
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ [] ;
+ [] ;
+ [] ;
@@ -18136,6 +18351,7 @@ DEFINE CLASS CL_PROJECT AS CL_COL_BASE
_TimeStamp = 0
_Version = ''
_SccData = ''
+ _User = ''
*-- Dev.info
_Author = ''
@@ -24665,6 +24881,8 @@ DEFINE CLASS CL_PROJ_FILE AS CL_CUS_BASE
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ + [] ;
+ []
_Name = ''
@@ -24675,6 +24893,8 @@ DEFINE CLASS CL_PROJ_FILE AS CL_CUS_BASE
_ID = 0
_ObjRev = 0
_TimeStamp = 0
+ _User = ''
+ _DevInfo = ''
ENDDEFINE
@@ -27376,6 +27596,7 @@ DEFINE CLASS CL_CFG AS CUSTOM
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ [] ;
+ [] ;
+ [] ;
@@ -27412,6 +27633,7 @@ DEFINE CLASS CL_CFG AS CUSTOM
n_OptimizeByFilestamp = NULL
n_ExcludeDBFAutoincNextval = NULL
l_RedirectClassPerFileToMain = NULL
+ n_RedirectClassType = NULL
l_RemoveNullCharsFromCode = NULL
l_RemoveZOrderSetFromProps = NULL
n_UseClassPerFile = NULL
@@ -27456,6 +27678,7 @@ DEFINE CLASS CL_CFG AS CUSTOM
.n_OptimizeByFilestamp = toParentCFG.n_OptimizeByFilestamp
.n_ExcludeDBFAutoincNextval = toParentCFG.n_ExcludeDBFAutoincNextval
.l_RedirectClassPerFileToMain = toParentCFG.l_RedirectClassPerFileToMain
+ .n_RedirectClassType = toParentCFG.n_RedirectClassType
.l_RemoveNullCharsFromCode = toParentCFG.l_RemoveNullCharsFromCode
.l_RemoveZOrderSetFromProps = toParentCFG.l_RemoveZOrderSetFromProps
.n_UseClassPerFile = toParentCFG.n_UseClassPerFile
@@ -27795,7 +28018,7 @@ DEFINE CLASS CL_LANG AS Custom
.C_OPTION_LOC = "Opción"
.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC = "La clase externa no coincide con las clases internas"
.C_OUTER_MEMBER_DOES_NOT_MATCH_INNER_MEMBERS_LOC = "El miembro externo no coincide con los miembros internos"
- .C_OUTPUT_FILE_IS_NOT_OVERWRITEN_LOC = "Optimización: el archivo de salida [<>] no se sobreescribe por ser igual al generado."
+ .C_OUTPUT_FILE_IS_NOT_OVERWRITEN_LOC = "Optimización: el archivo de salida [<>] no se sobreescribe por ser igual al ya existente."
.C_OUTPUTFILE_TIMESTAMP_EQUAL_THAN_INPUTFILE_TIMESTAMP_LOC = "Optimización: el archivo de salida [<>] no se regenera por tener el mismo timestamp que el de entrada."
.C_OUTPUTFILE_TIMESTAMP_NEWER_THAN_INPUTFILE_TIMESTAMP_LOC = "Optimización: el archivo de salida [<>] no se regenera por tener un timestamp más nuevo que el de entrada."
.C_PRESS_ESC_TO_CANCEL = "Pulse Esc para Cancelar"
@@ -28007,7 +28230,7 @@ DEFINE CLASS CL_LANG AS Custom
.C_OPTION_LOC = "Option"
.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC = "The outer class does not match the inner classes"
.C_OUTER_MEMBER_DOES_NOT_MATCH_INNER_MEMBERS_LOC = "The outer member does not match the inner members"
- .C_OUTPUT_FILE_IS_NOT_OVERWRITEN_LOC = "Optimization: output file [<>] was not overwritten because it is the same as was generated."
+ .C_OUTPUT_FILE_IS_NOT_OVERWRITEN_LOC = "Optimization: output file [<>] was not overwritten because it is the same as the existing one."
.C_OUTPUTFILE_TIMESTAMP_EQUAL_THAN_INPUTFILE_TIMESTAMP_LOC = "Optimization: output file [<>] was not regenerated because it's filestamp is equal than the inputfile."
.C_OUTPUTFILE_TIMESTAMP_NEWER_THAN_INPUTFILE_TIMESTAMP_LOC = "Optimization: output file [<>] was not regenerated because it's filestamp is newer than the inputfile."
.C_PRESS_ESC_TO_CANCEL = "Press Esc to Cancel"