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"