From ae70d7b3f24876fb6a879ad57b9112311bbe7bef Mon Sep 17 00:00:00 2001 From: fernando Date: Wed, 22 Jan 2014 14:44:13 +0100 Subject: [PATCH] =?UTF-8?q?Changeset:=20139=20v1.19.4=20-=20Nuevo=20par?= =?UTF-8?q?=C3=A1metro=20Recompile=20para=20forzar=20la=20recompilaci?= =?UTF-8?q?=C3=B3n.=20Ahora=20por=20defecto=20el=20binario=20no=20se=20rec?= =?UTF-8?q?ompila=20para=20ganar=20velocidad=20y=20evitar=20errores.=20Deb?= =?UTF-8?q?e=20recompilar=20manualmente.=20-=20DBC:=20Agregado=20soporte?= =?UTF-8?q?=20para=20comentarios=20multil=C3=ADnea=20(propiedad=20Comment)?= =?UTF-8?q?=20-=20Agregada=20barra=20de=20progreso=20a=20los=20scripts=20d?= =?UTF-8?q?e=20conversi=C3=B3n=20batch=20VBS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Convert_VFP9_BIN_2_PRG.vbs | 84 ++++++++----- Convert_VFP9_PRG_2_BIN.vbs | 84 ++++++++----- foxbin2prg.pj2 | 4 +- foxbin2prg.pjt | Bin 334272 -> 336256 bytes foxbin2prg.pjx | Bin 1583 -> 1583 bytes foxbin2prg.prg | 250 ++++++++++++++++++++++++++----------- 6 files changed, 288 insertions(+), 134 deletions(-) diff --git a/Convert_VFP9_BIN_2_PRG.vbs b/Convert_VFP9_BIN_2_PRG.vbs index e2e2df1..3bd943b 100644 --- a/Convert_VFP9_BIN_2_PRG.vbs +++ b/Convert_VFP9_BIN_2_PRG.vbs @@ -13,8 +13,8 @@ '--------------------------------------------------------------------------------------------------- Const ForReading = 1 Dim WSHShell, FileSystemObject -Dim oVFP9, nExitCode, cEXETool, cCMD, nDebug, cConvertType, aExtensions(8), foxbin2prg_cfg -Dim i, x, str_cfg, aConf, cErrMsg, cFlagGenerateLog, cFlagDontShowErrMsg, cFlagJustShowCall +Dim oVFP9, nExitCode, cEXETool, cCMD, nDebug, cConvertType, aExtensions(8), foxbin2prg_cfg, aFiles(), nFile_Count +Dim i, x, str_cfg, aConf, cErrMsg, cFlagGenerateLog, cFlagDontShowErrMsg, cFlagJustShowCall, cFlagRecompile Set WSHShell = WScript.CreateObject("WScript.Shell") Set FileSystemObject = WScript.CreateObject("Scripting.FileSystemObject") Set oVFP9 = CreateObject("VisualFoxPro.Application.9") @@ -22,7 +22,7 @@ foxbin2prg_cfg = Replace(WScript.ScriptFullName, WScript.ScriptName, "foxbin2prg nExitCode = 0 cConvertType = "BIN2PRG" '<<< This is the only difference between the 2 scripts '--------------------------------------------------------------------------------------------------- -nDebug = 13 'Cumulative Flags: 0=OFF, 1=Create FoxBin2prg LOG, 2=Only show script calls, 4=Don't show FoxBin2prg error modal messages, 8=Show end of process message +nDebug = 1+0+4+0 'Cumulative Flags: 0=OFF, 1=Create FoxBin2prg LOG, 2=Only show script calls, 4=Don't show FoxBin2prg error modal messages, 8=Show end of process message '--------------------------------------------------------------------------------------------------- If cConvertType = "BIN2PRG" Then @@ -90,11 +90,59 @@ If WScript.Arguments.Count = 0 Then MsgBox cErrMsg, 64, "No parameters - Debug Status" Else cEXETool = Replace(WScript.ScriptFullName, WScript.ScriptName, "foxbin2prg.exe") + nFile_Count = 0 + oVFP9.DoCmd( "SET PROCEDURE TO '" & cEXETool & "'" ) + oVFP9.DoCmd( "PUBLIC oFoxBin2prg" ) + oVFP9.DoCmd( "oFoxBin2prg = CREATEOBJECT('c_foxbin2prg')" ) + oVFP9.DoCmd( "oFoxBin2prg.cargar_frm_avance()" ) For i = 0 To WScript.Arguments.Count-1 scanDirs( WScript.Arguments(i) ) Next + cFlagGenerateLog = "'0'" + cFlagDontShowErrMsg = "'0'" + cFlagShowCall = "'0'" + cFlagRecompile = "'0'" + + If GetBit(nDebug, 1) Then + cFlagGenerateLog = "'1'" + End If + If GetBit(nDebug, 2) Then + cFlagJustShowCall = "1" + End If + If GetBit(nDebug, 3) Then + cFlagDontShowErrMsg = "'1'" + End If + + oVFP9.DoCmd( "oFoxBin2prg.o_Frm_Avance.nMAX_VALUE = " & nFile_Count ) + oVFP9.DoCmd( "oFoxBin2prg.o_Frm_Avance.nVALUE = " & 0 ) + oVFP9.DoCmd( "oFoxBin2prg.o_Frm_Avance.AlwaysOnTop = .T." ) + oVFP9.DoCmd( "oFoxBin2prg.o_Frm_Avance.SHOW()" ) + + For i = 1 To nFile_Count + oVFP9.DoCmd( "oFoxBin2prg.o_Frm_Avance.lbl_TAREA.CAPTION = 'Procesando " & aFiles(i) & "...'" ) + oVFP9.DoCmd( "oFoxBin2prg.o_Frm_Avance.nVALUE = " & i ) + + If nDebug = 0 Or nDebug = 2 Then + cCMD = "oFoxBin2prg.ejecutar( '" & aFiles(i) & "' )" + Else + cCMD = "oFoxBin2prg.ejecutar( '" & aFiles(i) & "','0','0','0'," _ + & cFlagDontShowErrMsg & "," & cFlagGenerateLog & ",'1','','',.F.,''," & cFlagRecompile & " )" + End If + If cFlagJustShowCall = "1" Then + MsgBox cCMD, 64, "PARAMETROS ENVIADOS" + Else + oVFP9.DoCmd( cCMD ) + nExitCode = oVFP9.Eval("_SCREEN.ExitCode") + End If + + Next + + oVFP9.DoCmd( "oFoxBin2prg.o_Frm_Avance.HIDE()" ) + oVFP9.DoCmd( "oFoxBin2prg.o_Frm_Avance = NULL" ) + oVFP9.DoCmd( "oFoxBin2prg = NULL" ) + If GetBit(nDebug, 4) Then MsgBox "Fin del Proceso!", 64, WScript.ScriptName End If @@ -122,33 +170,11 @@ End Sub Private Sub evaluateFile( tcFile ) - For x = 1 TO 8 + For x = 1 TO UBound(aExtensions,1) If aExtensions(x) = UCase( FileSystemObject.GetExtensionName( tcFile ) ) Then - cFlagGenerateLog = "'0'" - cFlagDontShowErrMsg = "'0'" - cFlagShowCall = "'0'" - - If GetBit(nDebug, 1) Then - cFlagGenerateLog = "'1'" - End If - If GetBit(nDebug, 2) Then - cFlagJustShowCall = "1" - End If - If GetBit(nDebug, 3) Then - cFlagDontShowErrMsg = "'1'" - End If - - If nDebug = 0 Or nDebug = 2 Then - cCMD = "DO " & chr(34) & cEXETool & chr(34) & " WITH " & chr(34) & tcFile & chr(34) - Else - cCMD = "DO " & chr(34) & cEXETool & chr(34) & " WITH '" & tcFile & "','0','0','0'," & cFlagDontShowErrMsg & "," & cFlagGenerateLog - End If - If cFlagJustShowCall = "1" Then - MsgBox cCMD, 64, "PARAMETROS ENVIADOS" - Else - oVFP9.DoCmd( cCMD ) - nExitCode = oVFP9.Eval("_SCREEN.ExitCode") - End If + nFile_Count = nFile_Count + 1 + ReDim Preserve aFiles(nFile_Count) + aFiles(nFile_Count) = tcFile Exit For End If Next diff --git a/Convert_VFP9_PRG_2_BIN.vbs b/Convert_VFP9_PRG_2_BIN.vbs index 804d25a..7fe5f47 100644 --- a/Convert_VFP9_PRG_2_BIN.vbs +++ b/Convert_VFP9_PRG_2_BIN.vbs @@ -13,8 +13,8 @@ '--------------------------------------------------------------------------------------------------- Const ForReading = 1 Dim WSHShell, FileSystemObject -Dim oVFP9, nExitCode, cEXETool, cCMD, nDebug, cConvertType, aExtensions(8), foxbin2prg_cfg -Dim i, x, str_cfg, aConf, cErrMsg, cFlagGenerateLog, cFlagDontShowErrMsg, cFlagJustShowCall +Dim oVFP9, nExitCode, cEXETool, cCMD, nDebug, cConvertType, aExtensions(8), foxbin2prg_cfg, aFiles(), nFile_Count +Dim i, x, str_cfg, aConf, cErrMsg, cFlagGenerateLog, cFlagDontShowErrMsg, cFlagJustShowCall, cFlagRecompile Set WSHShell = WScript.CreateObject("WScript.Shell") Set FileSystemObject = WScript.CreateObject("Scripting.FileSystemObject") Set oVFP9 = CreateObject("VisualFoxPro.Application.9") @@ -22,7 +22,7 @@ foxbin2prg_cfg = Replace(WScript.ScriptFullName, WScript.ScriptName, "foxbin2prg nExitCode = 0 cConvertType = "PRG2BIN" '<<< This is the only difference between the 2 scripts '--------------------------------------------------------------------------------------------------- -nDebug = 13 'Cumulative Flags: 0=OFF, 1=Create FoxBin2prg LOG, 2=Only show script calls, 4=Don't show FoxBin2prg error modal messages, 8=Show end of process message +nDebug = 1+0+4+0 'Cumulative Flags: 0=OFF, 1=Create FoxBin2prg LOG, 2=Only show script calls, 4=Don't show FoxBin2prg error modal messages, 8=Show end of process message '--------------------------------------------------------------------------------------------------- If cConvertType = "BIN2PRG" Then @@ -90,11 +90,59 @@ If WScript.Arguments.Count = 0 Then MsgBox cErrMsg, 64, "No parameters - Debug Status" Else cEXETool = Replace(WScript.ScriptFullName, WScript.ScriptName, "foxbin2prg.exe") + nFile_Count = 0 + oVFP9.DoCmd( "SET PROCEDURE TO '" & cEXETool & "'" ) + oVFP9.DoCmd( "PUBLIC oFoxBin2prg" ) + oVFP9.DoCmd( "oFoxBin2prg = CREATEOBJECT('c_foxbin2prg')" ) + oVFP9.DoCmd( "oFoxBin2prg.cargar_frm_avance()" ) For i = 0 To WScript.Arguments.Count-1 scanDirs( WScript.Arguments(i) ) Next + cFlagGenerateLog = "'0'" + cFlagDontShowErrMsg = "'0'" + cFlagShowCall = "'0'" + cFlagRecompile = "'0'" + + If GetBit(nDebug, 1) Then + cFlagGenerateLog = "'1'" + End If + If GetBit(nDebug, 2) Then + cFlagJustShowCall = "1" + End If + If GetBit(nDebug, 3) Then + cFlagDontShowErrMsg = "'1'" + End If + + oVFP9.DoCmd( "oFoxBin2prg.o_Frm_Avance.nMAX_VALUE = " & nFile_Count ) + oVFP9.DoCmd( "oFoxBin2prg.o_Frm_Avance.nVALUE = " & 0 ) + oVFP9.DoCmd( "oFoxBin2prg.o_Frm_Avance.AlwaysOnTop = .T." ) + oVFP9.DoCmd( "oFoxBin2prg.o_Frm_Avance.SHOW()" ) + + For i = 1 To nFile_Count + oVFP9.DoCmd( "oFoxBin2prg.o_Frm_Avance.lbl_TAREA.CAPTION = 'Procesando " & aFiles(i) & "...'" ) + oVFP9.DoCmd( "oFoxBin2prg.o_Frm_Avance.nVALUE = " & i ) + + If nDebug = 0 Or nDebug = 2 Then + cCMD = "oFoxBin2prg.ejecutar( '" & aFiles(i) & "' )" + Else + cCMD = "oFoxBin2prg.ejecutar( '" & aFiles(i) & "','0','0','0'," _ + & cFlagDontShowErrMsg & "," & cFlagGenerateLog & ",'1','','',.F.,''," & cFlagRecompile & " )" + End If + If cFlagJustShowCall = "1" Then + MsgBox cCMD, 64, "PARAMETROS ENVIADOS" + Else + oVFP9.DoCmd( cCMD ) + nExitCode = oVFP9.Eval("_SCREEN.ExitCode") + End If + + Next + + oVFP9.DoCmd( "oFoxBin2prg.o_Frm_Avance.HIDE()" ) + oVFP9.DoCmd( "oFoxBin2prg.o_Frm_Avance = NULL" ) + oVFP9.DoCmd( "oFoxBin2prg = NULL" ) + If GetBit(nDebug, 4) Then MsgBox "Fin del Proceso!", 64, WScript.ScriptName End If @@ -122,33 +170,11 @@ End Sub Private Sub evaluateFile( tcFile ) - For x = 1 TO 8 + For x = 1 TO UBound(aExtensions,1) If aExtensions(x) = UCase( FileSystemObject.GetExtensionName( tcFile ) ) Then - cFlagGenerateLog = "'0'" - cFlagDontShowErrMsg = "'0'" - cFlagShowCall = "'0'" - - If GetBit(nDebug, 1) Then - cFlagGenerateLog = "'1'" - End If - If GetBit(nDebug, 2) Then - cFlagJustShowCall = "1" - End If - If GetBit(nDebug, 3) Then - cFlagDontShowErrMsg = "'1'" - End If - - If nDebug = 0 Or nDebug = 2 Then - cCMD = "DO " & chr(34) & cEXETool & chr(34) & " WITH " & chr(34) & tcFile & chr(34) - Else - cCMD = "DO " & chr(34) & cEXETool & chr(34) & " WITH '" & tcFile & "','0','0','0'," & cFlagDontShowErrMsg & "," & cFlagGenerateLog - End If - If cFlagJustShowCall = "1" Then - MsgBox cCMD, 64, "PARAMETROS ENVIADOS" - Else - oVFP9.DoCmd( cCMD ) - nExitCode = oVFP9.Eval("_SCREEN.ExitCode") - End If + nFile_Count = nFile_Count + 1 + ReDim Preserve aFiles(nFile_Count) + aFiles(nFile_Count) = tcFile Exit For End If Next diff --git a/foxbin2prg.pj2 b/foxbin2prg.pj2 index a69321f..2f21e9b 100644 --- a/foxbin2prg.pj2 +++ b/foxbin2prg.pj2 @@ -26,7 +26,7 @@ _LegalTrademark = "Open Source" _ProductName = " FOXBIN2PRG" _MajorVer = "1" _MinorVer = "19" -_Revision = " 194" +_Revision = " 205" _LanguageID = "1034" _AutoIncrement = "1" * @@ -51,7 +51,7 @@ loProject = _VFP.Projects('foxbin2prg.pjx') WITH loProject.FILES .ADD('config\config.fpw') && *< FileMetadata: Type="T" Cpid="1252" Timestamp="1132857145" ID="1131721714" ObjRev="0" /> - .ADD('foxbin2prg.prg') && *< FileMetadata: Type="P" Cpid="1252" Timestamp="1144160955" ID="1130644423" ObjRev="544" /> + .ADD('foxbin2prg.prg') && *< FileMetadata: Type="P" Cpid="1252" Timestamp="1144393743" ID="1130644423" ObjRev="544" /> * .ITEM('__newproject.f2b').Remove() diff --git a/foxbin2prg.pjt b/foxbin2prg.pjt index 1a26c9f4301463352a950382c10f7e31b83b5072..887f819ccabb3b193703dc6d920740954b2721f1 100644 GIT binary patch delta 19314 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 delta 17483 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 I!_=t%0W!&%^Z)<= diff --git a/foxbin2prg.pjx b/foxbin2prg.pjx index 34803bf53aa3676f980325df0ab8dafe8afb298f..cbae08e6bad2fee0e83dea39ae507a6dd0fbe026 100644 GIT binary patch delta 83 zcmZ3_vz~{=fR9mZBg+mJHe*X;a}$fnhgj?x^(M2iX-w8)ou&g8G-iMTw-5ydHw7Rt YH8BARIRo(oAXYFnFgG=u{D##T0L#M<)&Kwi delta 83 zcmZ3_vz~{=fR9mVBg+mJHbXN*6El;^hgj?xt0uFtX-w8)ou*@GW?*S*$^Zp!Aqom^ b3P50LVgeG<1LA%lRxq?MFg2X~hSeDW)?N?s diff --git a/foxbin2prg.prg b/foxbin2prg.prg index fdb8b63..b4013d5 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -37,25 +37,35 @@ * *--------------------------------------------------------------------------------------------------- * -* 04/11/2013 FDBOZZO v1.0 Creación inicial de las clases y soporte de los archivos VCX/SCX/PJX -* 22/11/2013 FDBOZZO v1.1 Corrección de bugs -* 23/11/2013 FDBOZZO v1.2 Corrección de bugs, limpieza de código y refactorización -* 24/11/2013 FDBOZZO v1.3 Corrección de bugs, limpieza de código y refactorización -* 27/11/2013 FDBOZZO v1.4 Agregado soporte comodines *.VCX, configuración de extensiones (vca), parámetro p/log -* 27/11/2013 FDBOZZO v1.5 Arreglo bug que no generaba form completo -* 01/12/2013 FDBOZZO v1.6 Refactorización completa generación BIN y PRG, cambio de algoritmos, arreglo de bugs, Unit Testing con FoxUnit -* 02/12/2013 FDBOZZO v1.7 Arreglo bug "Name", barra de progreso, agregado mensaje de ayuda si se llama sin parámetros, verificación y logueo de archivos READONLY con debug activa -* 03/12/2013 FDBOZZO v1.8 Arreglo bug "Name" (otra vez), sort encapsulado y reutilizado para versiones TEXTO y BIN por seguridad -* 06/12/2013 FDBOZZO v1.9 Arreglo bug pérdida de propiedades causado por una mejora anterior -* 06/12/2013 FDBOZZO v1.10 Arreglo del bug de mezcla de métodos de una clase con la siguiente -* 07/12/2013 FDBOZZO v1.11 Arreglo del bug de _amembers detectado por Edgar K.con la clase BlowFish.vcx (http://www.tortugaproductiva.galeon.com/docs/blowfish/index.html) -* 07/12/2013 FDBOZZO v1.12 Agregado soporte preliminar de conversión de reportes y etiquetas (FRX/LBX) -* 08/12/2013 FDBOZZO v1.13 Arreglo bug "Error 1924, TOREG is not an object" -* 15/12/2013 FDBOZZO v1.14 Arreglo de bug AutoCenter y registro COMMENT en regeneración de forms -* 08/12/2013 FDBOZZO v1.15 Agregado soporte preliminar de conversión de tablas, índices y bases de datos (DBF,CDX,DBC) -* 18/12/2013 FDBOZZO v1.16 Agregado soporte para menús (MNX) -* 03/01/2014 FDBOZZO v1.17 Agregado Unit Testing de menús y arreglo de las incidencias del menu -* 05/01/2013 FDBOZZO v1.18 Agregado soporte para generar estructuras TEXTO de DBFs anteriores a VFP 9, pero los binarios a VFP 9 // Arreglado bug de datos faltantes en campos de vistas // Arreglado bug mnx +* 04/11/2013 FDBOZZO v1.0 Creación inicial de las clases y soporte de los archivos VCX/SCX/PJX +* 22/11/2013 FDBOZZO v1.1 Corrección de bugs +* 23/11/2013 FDBOZZO v1.2 Corrección de bugs, limpieza de código y refactorización +* 24/11/2013 FDBOZZO v1.3 Corrección de bugs, limpieza de código y refactorización +* 27/11/2013 FDBOZZO v1.4 Agregado soporte comodines *.VCX, configuración de extensiones (vca), parámetro p/log +* 27/11/2013 FDBOZZO v1.5 Arreglo bug que no generaba form completo +* 01/12/2013 FDBOZZO v1.6 Refactorización completa generación BIN y PRG, cambio de algoritmos, arreglo de bugs, Unit Testing con FoxUnit +* 02/12/2013 FDBOZZO v1.7 Arreglo bug "Name", barra de progreso, agregado mensaje de ayuda si se llama sin parámetros, verificación y logueo de archivos READONLY con debug activa +* 03/12/2013 FDBOZZO v1.8 Arreglo bug "Name" (otra vez), sort encapsulado y reutilizado para versiones TEXTO y BIN por seguridad +* 06/12/2013 FDBOZZO v1.9 Arreglo bug pérdida de propiedades causado por una mejora anterior +* 06/12/2013 FDBOZZO v1.10 Arreglo del bug de mezcla de métodos de una clase con la siguiente +* 07/12/2013 FDBOZZO v1.11 Arreglo del bug de _amembers detectado por Edgar K.con la clase BlowFish.vcx (http://www.tortugaproductiva.galeon.com/docs/blowfish/index.html) +* 07/12/2013 FDBOZZO v1.12 Agregado soporte preliminar de conversión de reportes y etiquetas (FRX/LBX) +* 08/12/2013 FDBOZZO v1.13 Arreglo bug "Error 1924, TOREG is not an object" +* 15/12/2013 FDBOZZO v1.14 Arreglo de bug AutoCenter y registro COMMENT en regeneración de forms +* 08/12/2013 FDBOZZO v1.15 Agregado soporte preliminar de conversión de tablas, índices y bases de datos (DBF,CDX,DBC) +* 18/12/2013 FDBOZZO v1.16 Agregado soporte para menús (MNX) +* 03/01/2014 FDBOZZO v1.17 Agregado Unit Testing de menús y arreglo de las incidencias del menu +* 05/01/2013 FDBOZZO v1.18 Agregado soporte para generar estructuras TEXTO de DBFs anteriores a VFP 9, pero los binarios a VFP 9 // Arreglado bug de datos faltantes en campos de vistas // Arreglado bug mnx +* 08/01/2014 FDBOZZO v1.19 Arreglo bug SCX-VCX: Orden incorrecto en Reserved3 ocaciona que no se disparen eventos ACCESS (y probablemente ASIGN) +* 08/01/2014 FDBOZZO v1.19 Arreglo bug DBF: Tipo de índice generado incorrecto en DB2 cuando es Candidate +* 08/01/2014 FDBOZZO v1.19 Agregado soporte para convertir PJM a PJ2 +* 08/01/2014 FDBOZZO v1.19 Agregada validación al convertir Menús con estructura anterior a VFP9 +* 08/01/2014 FDBOZZO v1.19 Cambiada la propiedad "Autor" por "Author" en los archivos MN2 +* 08/01/2014 FDBOZZO v1.19.1 Cambio en los headers de los archivos TX2 para quitar el timestamp "Generated" que causa diferencias innecesarias +* 08/01/2014 FDBOZZO v1.19.2 Arreglo de bug PJ2: Al regenerar da un error por buscar "Autor" en vez de "Author" +* 08/01/2014 FDBOZZO v1.19.3 Cambio en los timestamps de los TXT para mantener los valores vacíos que generaban muchísimas diferencias +* 22/01/2014 FDBOZZO v1.19.4 Nuevo parámetro Recompile para forzar la recompilación. Ahora por defecto el binario no se recompila para ganar velocidad y evitar errores. Debe recompilar manualmente. +* 22/01/2014 FDBOZZO v1.19.4 DBC: Agregado soporte para comentarios multilínea (propiedad Comment) * * *--------------------------------------------------------------------------------------------------- @@ -92,10 +102,14 @@ * tcDontShowProgress (v? IN ) '1' para NO mostrar la ventana de progreso * tcOriginalFileName (v? IN ) Sirve para los casos en los que inputFile es un nombre temporal y se quiere generar * el nombre correcto dentro de la versión texto (por ej: en los PJ2 y las cabeceras) +* tcRecompile (v? IN ) Indica recompilar ('1') el binario una vez regenerado. [Cambio de funcionamiento por defecto] +* Este cambio es para ganar tiempo, velocidad y seguridad. Además la recompilación que hace FoxBin2Prg +* se hace desde el directorio del archivo, con lo que las referencias relativas pueden +* generar errores de compilación, típicamente los #include. * * Ej: DO FOXBIN2PRG.PRG WITH "C:\DESA\INTEGRACION\LIBRERIA.VCX" *--------------------------------------------------------------------------------------------------- -LPARAMETERS tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErrors, tcDebug, tcDontShowProgress, tcOriginalFileName +LPARAMETERS tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErrors, tcDebug, tcDontShowProgress, tcOriginalFileName, tcRecompile *-- Internacionalización / Internationalization *-- Fin / End @@ -265,7 +279,7 @@ LPARAMETERS tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErro #ELSE && English #DEFINE C_FOXBIN2PRG_JUST_VFP_9_LOC 'FOXBIN2PRG is only for Visual FoxPro 9.0!' #DEFINE C_FOXBIN2PRG_WARN_CAPTION_LOC 'FOXBIN2PRG: WARNING!' - #DEFINE FOXBIN2PRG_INFO_SINTAX_LOC 'FOXBIN2PRG [cType_NA cTextName_NA cGenText_NA cDontShowErrors cDebug]' + CR_LF + CR_LF ; + #DEFINE FOXBIN2PRG_INFO_SINTAX_LOC 'FOXBIN2PRG [cType_NA cTextName_NA cGenText_NA cDontShowErrors cDebug cDontShowProgress cOriginalFileName cRecompile]' + CR_LF + CR_LF ; + 'Example to generate TXT of all VCX of "c:\desa\clases", without showing error window and generating LOG file: ' + CR_LF ; + ' FOXBIN2PRG "c:\desa\clases\*.vcx" "0" "0" "0" "1" "1"' + CR_LF + CR_LF ; + 'Example to generate TXT of all VCX of "c:\desa\clases", without showing error window and without LOG file: ' + CR_LF ; @@ -289,7 +303,7 @@ PUBLIC goCnv AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' LOCAL lnResp goCnv = CREATEOBJECT("c_foxbin2prg") lnResp = goCnv.ejecutar( tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErrors, tcDebug ; - , '', NULL, NULL, .F., tcOriginalFileName ) + , '', NULL, NULL, .F., tcOriginalFileName, tcRecompile ) ADDPROPERTY(_SCREEN, 'ExitCode', lnResp) IF _VFP.STARTMODE <= 1 @@ -337,6 +351,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -368,6 +383,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM l_Test = .F. l_ShowErrors = .F. l_ShowProgress = .T. + l_Recompile = .T. l_MethodSort_Enabled = .T. && Para Unit Testing se puede cambiar a .F. para buscar diferencias l_PropSort_Enabled = .T. && Para Unit Testing se puede cambiar a .F. para buscar diferencias l_ReportSort_Enabled = .T. && Para Unit Testing se puede cambiar a .F. para buscar diferencias @@ -397,6 +413,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM THIS.c_Foxbin2prg_FullPath = SUBSTR( SYS(16), AT( 'C_FOXBIN2PRG.INIT', SYS(16) ) + LEN('C_FOXBIN2PRG.INIT') + 1 ) THIS.c_CurDir = SYS(5) + CURDIR() THIS.o_FSO = NEWOBJECT("Scripting.FileSystemObject") + ADDPROPERTY(_SCREEN, 'ExitCode', 0) ENDPROC @@ -502,6 +519,11 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM ENDPROC + PROCEDURE cargar_frm_avance + THIS.o_Frm_Avance = CREATEOBJECT("frm_avance") + ENDPROC + + PROCEDURE ejecutar *-------------------------------------------------------------------------------------------------------------- * PARÁMETROS: (!=Obligatorio | ?=Opcional) (@=Pasar por referencia | v=Pasar por valor) (IN/OUT) @@ -517,9 +539,13 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM * tlRelanzarError (?v IN ) Indica si el error debe relanzarse o no * tcOriginalFileName (v? IN ) Sirve para los casos en los que inputFile es un nombre temporal y se quiere generar * el nombre correcto dentro de la versión texto (por ej: en los PJ2 y las cabeceras) + * tcRecompile (v? IN ) Indica recompilar ('1') el binario una vez regenerado. [Cambio de funcionamiento por defecto] + * Este cambio es para ganar tiempo, velocidad y seguridad. Además la recompilación que hace FoxBin2Prg + * se hace desde el directorio del archivo, con lo que las referencias relativas pueden + * generar errores de compilación, típicamente los #include. *-------------------------------------------------------------------------------------------------------------- LPARAMETERS tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErrors, tcDebug, tcDontShowProgress ; - , toModulo, toEx AS EXCEPTION, tlRelanzarError, tcOriginalFileName + , toModulo, toEx AS EXCEPTION, tlRelanzarError, tcOriginalFileName, tcRecompile TRY LOCAL I, lcPath, lnResp, lcFileSpec, lcFile, laFiles(1,5), laConfig(1), lcConfigFile, lcExt ; @@ -557,10 +583,11 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM *-- Ejecución normal THIS.l_ShowProgress = NOT (TRANSFORM(tcDontShowProgress)=='1') THIS.l_ShowErrors = NOT (TRANSFORM(tcDontShowErrors) == '1') + THIS.l_Recompile = (TRANSFORM(tcRecompile) == '1') THIS.l_Debug = (TRANSFORM(tcDebug)=='1' OR FILE(FORCEEXT(THIS.c_Foxbin2prg_FullPath,'LOG'))) IF THIS.l_ShowProgress - THIS.o_Frm_Avance = CREATEOBJECT("frm_avance") + THIS.cargar_frm_avance() ENDIF *-- Configuración @@ -645,6 +672,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM ENDCASE CATCH TO toEx + ADDPROPERTY(_SCREEN, 'ExitCode', toEx.ERRORNO) IF llExisteConfig THIS.writeLog( 'ERROR: ' + TRANSFORM(toEx.ERRORNO) + ', ' + toEx.MESSAGE + CR_LF ; + toEx.PROCEDURE + ', line ' + TRANSFORM(toEx.LINENO) + CR_LF ; @@ -655,7 +683,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM ENDIF FINALLY - IF VARTYPE(THIS.o_Frm_Avance) = "O" + IF THIS.l_ShowProgress THIS.o_Frm_Avance.HIDE() THIS.o_Frm_Avance.RELEASE() STORE NULL TO THIS.o_Frm_Avance @@ -1020,18 +1048,18 @@ DEFINE CLASS frm_avance AS FORM ADD OBJECT shp_base AS SHAPE WITH ; - TOP = 40, ; + TOP = 50, ; LEFT = 12, ; - HEIGHT = 21, ; + HEIGHT = 13, ; WIDTH = 601, ; CURVATURE = 15, ; NAME = "shp_base" ADD OBJECT shp_avance AS SHAPE WITH ; - TOP = 40, ; + TOP = 50, ; LEFT = 12, ; - HEIGHT = 21, ; + HEIGHT = 13, ; WIDTH = 36, ; CURVATURE = 15, ; BACKCOLOR = RGB(255,255,128), ; @@ -1759,7 +1787,7 @@ DEFINE CLASS c_conversor_base AS SESSION tnTimeStamp = 0 EXIT ENDIF - + IF VARTYPE(m.ltDateTime) <> 'T' m.ltDateTime = DATETIME() ENDIF @@ -1771,7 +1799,7 @@ DEFINE CLASS c_conversor_base AS SESSION + MINUTE(m.ltDateTime) * 2^5 ; + SEC(m.ltDateTime) ENDTRY - + RETURN INT(tnTimeStamp) ENDFUNC @@ -4074,7 +4102,7 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo de cada clase THIS.identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @toModulo ) - THIS.escribirArchivoBin( @toModulo ) + THIS.escribirArchivoBin( @toModulo, toFoxbin2prg ) CATCH TO toEx @@ -4094,7 +4122,7 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin ******************************************************************************************************************* PROCEDURE escribirArchivoBin - LPARAMETERS toModulo + LPARAMETERS toModulo, toFoxbin2prg *-- Estructura del objeto toModulo generado: *-- ----------------------------------------------------------------------------------------------------------- *-- Version Versión usada para generar la versión PRG analizada @@ -4162,6 +4190,7 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin *-- ----------------------------------------------------------------------------------------------------------- #IF .F. LOCAL toModulo AS CL_MODULO OF 'FOXBIN2PRG.PRG' + LOCAL toFoxbin2prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' #ENDIF TRY @@ -4284,7 +4313,10 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin ENDFOR && I = 1 TO toModulo._Clases_Count USE IN (SELECT("TABLABIN")) - COMPILE CLASSLIB (THIS.c_OutputFile) + + IF toFoxbin2prg.l_Recompile + COMPILE CLASSLIB (THIS.c_OutputFile) + ENDIF CATCH TO loEx @@ -4351,7 +4383,7 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo de cada clase THIS.identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @toModulo ) - THIS.escribirArchivoBin( @toModulo ) + THIS.escribirArchivoBin( @toModulo, toFoxbin2prg ) CATCH TO toEx @@ -4371,7 +4403,7 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin ******************************************************************************************************************* PROCEDURE escribirArchivoBin - LPARAMETERS toModulo + LPARAMETERS toModulo, toFoxbin2prg *-- Estructura del objeto toModulo generado: *-- ----------------------------------------------------------------------------------------------------------- *-- Version Versión usada para generar la versión PRG analizada @@ -4439,6 +4471,7 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin *-- ----------------------------------------------------------------------------------------------------------- #IF .F. LOCAL toModulo AS CL_MODULO OF 'FOXBIN2PRG.PRG' + LOCAL toFoxbin2prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' #ENDIF TRY @@ -4562,7 +4595,10 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin , '' ) USE IN (SELECT("TABLABIN")) - COMPILE FORM (THIS.c_OutputFile) + + IF toFoxbin2prg.l_Recompile + COMPILE FORM (THIS.c_OutputFile) + ENDIF CATCH TO loEx @@ -5358,7 +5394,7 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo del reporte THIS.identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @toReport ) - THIS.escribirArchivoBin( @toReport ) + THIS.escribirArchivoBin( @toReport, toFoxbin2prg ) CATCH TO loEx @@ -5380,10 +5416,11 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin ******************************************************************************************************************* PROCEDURE escribirArchivoBin - LPARAMETERS toReport + LPARAMETERS toReport, toFoxbin2prg *-- ----------------------------------------------------------------------------------------------------------- #IF .F. LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG' + LOCAL toFoxbin2prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' #ENDIF TRY @@ -5431,10 +5468,12 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin USE IN (SELECT("TABLABIN")) - IF THIS.c_Type = 'FRX' - COMPILE REPORT (THIS.c_OutputFile) - ELSE - COMPILE LABEL (THIS.c_OutputFile) + IF toFoxbin2prg.l_Recompile + IF THIS.c_Type = 'FRX' + COMPILE REPORT (THIS.c_OutputFile) + ELSE + COMPILE LABEL (THIS.c_OutputFile) + ENDIF ENDIF @@ -5792,7 +5831,7 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin STORE 0 TO lnCodError STORE '' TO lcIndex, lcFieldDef - + ERASE (FORCEEXT(THIS.c_OutputFile, 'DBF')) ERASE (FORCEEXT(THIS.c_OutputFile, 'FPT')) ERASE (FORCEEXT(THIS.c_OutputFile, 'CDX')) @@ -5882,7 +5921,7 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin *-- La actualización de la fecha sirve para evitar diferencias al regenerar el DBF ldLastUpdate = EVALUATE( '{^' + toTable._LastUpdate + '}' ) loDBFUtils.write_DBC_BackLink( THIS.c_OutputFile, toTable._Database, ldLastUpdate ) - + CATCH TO loEx lnCodError = loEx.ERRORNO @@ -6024,7 +6063,7 @@ DEFINE CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo del reporte THIS.identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @toDatabase ) - THIS.escribirArchivoBin( @toDatabase ) + THIS.escribirArchivoBin( @toDatabase, toFoxbin2prg ) CATCH TO loEx @@ -6046,10 +6085,11 @@ DEFINE CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin ******************************************************************************************************************* PROCEDURE escribirArchivoBin - LPARAMETERS toDatabase + LPARAMETERS toDatabase, toFoxbin2prg *-- ----------------------------------------------------------------------------------------------------------- #IF .F. LOCAL toDatabase AS CL_DBC OF 'FOXBIN2PRG.PRG' + LOCAL toFoxbin2prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' #ENDIF TRY @@ -6059,6 +6099,10 @@ DEFINE CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin toDatabase.updateDBC( THIS.c_OutputFile ) + IF toFoxbin2prg.l_Recompile + COMPILE DATABASE (THIS.c_OutputFile) + ENDIF + CATCH TO loEx lnCodError = loEx.ERRORNO @@ -8401,7 +8445,6 @@ DEFINE CLASS c_conversor_pjx_a_prg AS c_conversor_bin_a_prg CASE toFoxbin2prg.doBackup( .F., .T., '', '', '' ) AND STRTOFILE( C_FB2PRG_CODE, THIS.c_OutputFile ) = 0 ERROR 'No se puede generar el archivo [' + THIS.c_OutputFile + '] porque es ReadOnly' ENDCASE - *COMPILE ( THIS.c_outputFile ) ENDIF @@ -8505,7 +8548,7 @@ DEFINE CLASS c_conversor_pjm_a_prg AS c_conversor_bin_a_prg FOR I = 1 TO ALINES( laLines, STREXTRACT( lcStrPJM, '[OLEServers]', '[OLEServersEnd]' ), 4 ) ALINES( laProps, laLines(I), 1, ',' ) - + IF I = 1 WITH loServerHead AS CL_PROJ_SRV_HEAD OF 'FOXBIN2PRG.PRG' ._LibraryName = laProps(1) @@ -8515,10 +8558,10 @@ DEFINE CLASS c_conversor_pjm_a_prg AS c_conversor_bin_a_prg ._ServerType = PADL(laProps(5),4) ._TypeLib = laProps(6) ENDWITH - + ELSE loServerData = CREATEOBJECT("CL_PROJ_SRV_DATA") - + WITH loServerData AS CL_PROJ_SRV_DATA OF 'FOXBIN2PRG.PRG' ._HelpContextID = laProps(4) ._ServerName = laProps(3) @@ -8530,12 +8573,12 @@ DEFINE CLASS c_conversor_pjm_a_prg AS c_conversor_bin_a_prg ._CLSID = laProps(8) ._Interface = laProps(9) ENDWITH - + loServerHead.add_Server( loServerData ) loServerData = NULL ENDIF ENDFOR - + *-- Escaneo el proyecto @@ -8769,7 +8812,6 @@ DEFINE CLASS c_conversor_pjm_a_prg AS c_conversor_bin_a_prg CASE toFoxbin2prg.doBackup( .F., .T., '', '', '' ) AND STRTOFILE( C_FB2PRG_CODE, THIS.c_OutputFile ) = 0 ERROR 'No se puede generar el archivo [' + THIS.c_OutputFile + '] porque es ReadOnly' ENDCASE - *COMPILE ( THIS.c_outputFile ) ENDIF @@ -8981,21 +9023,21 @@ DEFINE CLASS c_conversor_dbf_a_prg AS c_conversor_bin_a_prg CATCH TO toEx DO CASE - CASE toEx.ErrorNo = 13 && Alias not found - toEx.UserValue = 'WARNING!!' + CR_LF ; + CASE toEx.ERRORNO = 13 && Alias not found + toEx.USERVALUE = 'WARNING!!' + CR_LF ; + 'MAKE SURE YOU ARE NOT USING A TABLE ALIAS ON INDEX KEY EXPRESSIONS!! (ex: index on ' ; + UPPER(JUSTSTEM(THIS.c_InputFile)) + '.field tag keyname)' + CR_LF + CR_LF ; + '¡¡ATENCIÓN!!' + CR_LF ; + 'ASEGÚRESE DE QUE NO ESTÁ USANDO UN ALIAS DE TABLA EN LAS EXPRESIONES DE LOS ÍNDICES!! (ej: index on ' ; + UPPER(JUSTSTEM(THIS.c_InputFile)) + '.campo tag nombreclave)' -*!* CASE toEx.ErrorNo = 1976 && Cannot resolve backlink -*!* toEx.UserValue = 'WARNING!!' + CR_LF ; -*!* + "MAY BE DATABASE FIELDS DOESN'T" ; -*!* + UPPER(JUSTSTEM(THIS.c_InputFile)) + '.field tag keyname)' + CR_LF + CR_LF ; -*!* + '¡¡ATENCIÓN!!' + CR_LF ; -*!* + 'ASEGÚRESE DE QUE NO ESTÁ USANDO UN ALIAS DE TABLA EN LAS EXPRESIONES DE LOS ÍNDICES!! (ej: index on ' ; -*!* + UPPER(JUSTSTEM(THIS.c_InputFile)) + '.campo tag nombreclave)' + *!* CASE toEx.ErrorNo = 1976 && Cannot resolve backlink + *!* toEx.UserValue = 'WARNING!!' + CR_LF ; + *!* + "MAY BE DATABASE FIELDS DOESN'T" ; + *!* + UPPER(JUSTSTEM(THIS.c_InputFile)) + '.field tag keyname)' + CR_LF + CR_LF ; + *!* + '¡¡ATENCIÓN!!' + CR_LF ; + *!* + 'ASEGÚRESE DE QUE NO ESTÁ USANDO UN ALIAS DE TABLA EN LAS EXPRESIONES DE LOS ÍNDICES!! (ej: index on ' ; + *!* + UPPER(JUSTSTEM(THIS.c_InputFile)) + '.campo tag nombreclave)' ENDCASE IF THIS.l_Debug AND _VFP.STARTMODE = 0 @@ -9123,7 +9165,7 @@ DEFINE CLASS c_conversor_mnx_a_prg AS c_conversor_bin_a_prg USE (THIS.c_InputFile) SHARED NOUPDATE ALIAS _TABLAORIG SELECT * FROM _TABLAORIG INTO CURSOR TABLABIN USE IN (SELECT("_TABLAORIG")) - + *-- Verificación de menú VFP 9 IF FCOUNT() < 25 OR EMPTY(FIELD("RESNAME")) OR EMPTY(FIELD("SYSRES")) ERROR 'Menu [' + (THIS.c_InputFile) + '] is NOT VFP 9 Format! - Please convert to VFP 9 with MODIFY MENU ' + JUSTFNAME((THIS.c_InputFile)) @@ -9979,6 +10021,7 @@ DEFINE CLASS CL_DBC_BASE AS CL_CUS_BASE _MEMBERDATA = [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -10055,6 +10098,41 @@ DEFINE CLASS CL_DBC_BASE AS CL_CUS_BASE ENDFUNC + PROCEDURE analizarBloque_Comment + *--------------------------------------------------------------------------------------------------- + * PARÁMETROS: (!=Obligatorio | ?=Opcional) (@=Pasar por referencia | v=Pasar por valor) (IN/OUT) + * tcLine (@! IN/OUT) Contenido de la línea en análisis + * taCodeLines (@! IN ) Array de líneas del programa analizado + * I (@! IN/OUT) Número de línea en análisis + * tnCodeLines (@! IN ) Cantidad de líneas del programa analizado + *--------------------------------------------------------------------------------------------------- + LPARAMETERS tcLine, taCodeLines, I, tnCodeLines + + IF LEFT(tcLine, LEN('')) == '' + LOCAL lcValue + llBloqueEncontrado = .T. + lcValue = STREXTRACT( taCodeLines(I), '', '', 1, 2 ) + + IF NOT '' $ tcLine THEN + FOR I = I + 1 TO tnCodeLines + THIS.set_Line( @tcLine, @taCodeLines, I ) + + DO CASE + CASE '' $ tcLine && Fin + lcValue = lcValue + CR_LF + LEFT( taCodeLines(I), AT( '', taCodeLines(I) ) - 1 ) + EXIT + + OTHERWISE && Línea de Stored Procedure + lcValue = lcValue + CR_LF + taCodeLines(I) + ENDCASE + ENDFOR + ENDIF + + THIS.ADDPROPERTY( '_Comment', lcValue ) + ENDIF + ENDPROC + + PROCEDURE getAllPropertiesFromObjectname *--------------------------------------------------------------------------------------------------- * PARÁMETROS: (!=Obligatorio | ?=Opcional) (@=Pasar por referencia | v=Pasar por valor) (IN/OUT) @@ -10900,6 +10978,9 @@ DEFINE CLASS CL_DBC AS CL_DBC_BASE CASE C_STORED_PROC_I $ tcLine THIS.analizarBloque_SP( @tcLine, @taCodeLines, @I, tnCodeLines ) + CASE '' $ tcLine + THIS.analizarBloque_Comment( @tcLine, @taCodeLines, @I, tnCodeLines ) + OTHERWISE && Otro valor *-- Estructura a reconocer: * ID @@ -11138,6 +11219,9 @@ DEFINE CLASS CL_DBC_CONNECTIONS AS CL_DBC_COL_BASE loConnection.analizarBloque( @tcLine, @taCodeLines, @I, tnCodeLines ) THIS.ADD( loConnection, loConnection._Name ) + CASE '' $ tcLine + THIS.analizarBloque_Comment( @tcLine, @taCodeLines, @I, tnCodeLines ) + OTHERWISE && Otro valor *-- No hay otros valores ENDCASE @@ -11290,6 +11374,9 @@ DEFINE CLASS CL_DBC_CONNECTION AS CL_DBC_BASE CASE C_CONNECTION_F $ tcLine && Fin EXIT + CASE '' $ tcLine + THIS.analizarBloque_Comment( @tcLine, @taCodeLines, @I, tnCodeLines ) + OTHERWISE && Propiedad de CONNECTION *-- Estructura a reconocer: * NOMBRE @@ -11607,6 +11694,9 @@ DEFINE CLASS CL_DBC_TABLE AS CL_DBC_BASE loRelations = THIS._Relations loRelations.analizarBloque( @tcLine, @taCodeLines, @I, tnCodeLines ) + CASE '' $ tcLine + THIS.analizarBloque_Comment( @tcLine, @taCodeLines, @I, tnCodeLines ) + OTHERWISE && Propiedad de TABLE *-- Estructura a reconocer: * NOMBRE @@ -11915,6 +12005,9 @@ DEFINE CLASS CL_DBC_FIELD_DB AS CL_DBC_BASE CASE C_FIELD_F $ tcLine && Fin EXIT + CASE '' $ tcLine + THIS.analizarBloque_Comment( @tcLine, @taCodeLines, @I, tnCodeLines ) + OTHERWISE && Propiedad de FIELD *-- Estructura a reconocer: * NOMBRE @@ -12182,6 +12275,9 @@ DEFINE CLASS CL_DBC_INDEX_DB AS CL_DBC_BASE CASE C_INDEX_F $ tcLine && Fin EXIT + CASE '' $ tcLine + THIS.analizarBloque_Comment( @tcLine, @taCodeLines, @I, tnCodeLines ) + OTHERWISE && Propiedad de FIELD *-- Estructura a reconocer: * NOMBRE @@ -12512,6 +12608,9 @@ DEFINE CLASS CL_DBC_VIEW AS CL_DBC_BASE loRelations = THIS._Relations loRelations.analizarBloque( @tcLine, @taCodeLines, @I, tnCodeLines ) + CASE '' $ tcLine + THIS.analizarBloque_Comment( @tcLine, @taCodeLines, @I, tnCodeLines ) + OTHERWISE && Propiedad de VIEW *-- Estructura a reconocer: * NOMBRE @@ -12875,6 +12974,9 @@ DEFINE CLASS CL_DBC_FIELD_VW AS CL_DBC_BASE CASE C_FIELD_F $ tcLine && Fin EXIT + CASE '' $ tcLine + THIS.analizarBloque_Comment( @tcLine, @taCodeLines, @I, tnCodeLines ) + OTHERWISE && Propiedad de FIELD *-- Estructura a reconocer: * NOMBRE @@ -16191,11 +16293,11 @@ DEFINE CLASS CL_DBF_UTILS AS SESSION n_NumberOfRecords = 0 n_NumberOfRecordsReal = 0 n_PosOfFirstDataRecord = 0 - Fields = NULL + FIELDS = NULL PROCEDURE INIT - THIS.Fields = CREATEOBJECT("COLLECTION") + THIS.FIELDS = CREATEOBJECT("COLLECTION") ENDPROC @@ -16260,7 +16362,7 @@ DEFINE CLASS CL_DBF_UTILS AS SESSION *--- FOR I = 1 TO .n_FieldCount loField = CREATEOBJECT("CL_DBF_UTILS_FIELD") - + WITH loField AS CL_DBF_UTILS_FIELD OF 'FOXBIN2PRG.PRG' lcStr = FREAD(lnHandle,11) .FieldName = RTRIM( lcStr, 0, CHR(0), ' ' ) @@ -16281,7 +16383,7 @@ DEFINE CLASS CL_DBF_UTILS AS SESSION lcStr = FREAD(lnHandle,8) ENDWITH - .Fields.Add(loField) + .FIELDS.ADD(loField) loField = NULL ENDFOR *--- @@ -16292,7 +16394,7 @@ DEFINE CLASS CL_DBF_UTILS AS SESSION tcDBC_Name = RTRIM(lcStr,0,CHR(0)) && DBC Name (si tiene) .c_Backlink_DBC_Name = tcDBC_Name ENDIF - + .n_FileSize = FSEEK(lnHandle, 0, 2) .n_NumberOfRecordsReal = INT( (.n_FileSize - .n_HeaderSize) / .n_DataRecordLength ) ENDWITH @@ -16469,7 +16571,7 @@ DEFINE CLASS CL_DBF_UTILS AS SESSION laCodePage(27,3) = 0x97 lnPos = ASCAN( laCodePage, tnHexCodePage, 1, -1, 3, 8 ) - + IF lnPos > 0 tnCodePage = laCodePage(lnPos,1) tcDescrip = laCodePage(lnPos,2) @@ -16477,7 +16579,7 @@ DEFINE CLASS CL_DBF_UTILS AS SESSION tnCodePage = 0 tcDescrip = '' ENDIF - + RETURN ENDPROC @@ -16511,10 +16613,10 @@ DEFINE CLASS CL_DBF_UTILS AS SESSION ENDTEXT *-- Fields - loField = THIS.Fields.Item(1) + loField = THIS.FIELDS.ITEM(1) lcText = lcText + CR_LF + loField.toText(.T.) - FOR EACH loField AS CL_DBF_UTILS_FIELD OF 'FOXBIN2PRG.PRG' IN THIS.Fields + FOR EACH loField AS CL_DBF_UTILS_FIELD OF 'FOXBIN2PRG.PRG' IN THIS.FIELDS lcText = lcText + CR_LF + loField.toText() ENDFOR @@ -16529,7 +16631,7 @@ DEFINE CLASS CL_DBF_UTILS AS SESSION 0x0C Column is autoincrementing ENDTEXT - + ENDWITH RETURN lcText