Changeset: 23 Changeset: 23

This commit is contained in:
fernando
2013-12-06 00:57:49 +01:00
parent 93d8d0d06c
commit e2b3a8eb6c
3 changed files with 314 additions and 144 deletions

View File

@@ -1,4 +1,2 @@
RESOURCE=OFF SCREEN=OFF
TALK=OFF RESOURCE=OFF
SAFETY=OFF
VISIBLE=OFF

79
README.txt Normal file
View File

@@ -0,0 +1,79 @@
02/12/2013 FOXBIN2PRG VER.1.7 FOR VISUAL FOXPRO 9 Fernando D. Bozzo (fdbozzo@gmail.com)
ESPA<EFBFBD>OL --------------------------------------------------------------------------------------------
<EFBFBD>Que es FOXBIN2PRG?
Es un programa pensado para ser usado con herramientas SCM (Source Code Managers) que pretende
sustituir a SCCTEXT y mejorarlo, generando versiones TEXTO bidireccionales que permiten volver
a generar el archivo binario original.
Ventajas:
- Genera versiones tipo "PRG" (no compilables), para comparaci<63>n visual
- Permite modificar la versi<73>n TEXTO tan f<>cilmente como si se modificara un PRG
- Todo el c<>digo del programa est<73> en un solo PRG, para simplificar su copia y mantenimiento
- Con las versiones TEXTO se pueden volver a generar los binarios, lo que sirve como backup
- Las extensiones son configurables si se crea un archivo FOXBIN2PRG.CFG
- Los m<>todos y propiedades de la versi<73>n TEXTO se ordenan alfab<61>ticamente para facilitar su comparaci<63>n
- Tiene compatibilidad con SCCTEXT a nivel de par<61>metros para usarlo como sustituto en SourceSafe
Actualmente soporta las conversiones de archivos SCX, VCX y PJX, para los que genera las versiones TEXTO
con extensi<73>n SC2,VC2 y PJ2, que pueden reconfigurarse para compatibilizar con SourceSafe.
Estructura del archivo de configuraci<63>n FOXBIN2PRG.CFG
extension: SC2=SCA
extension: VC2=VCA
extension: PJ2=PJA
USO:
DO FOXBIN2PRG.PRG WITH "<ruta>\archivo.scx" ==> Genera la versi<73>n TEXTO con extensi<73>n sc2
DO FOXBIN2PRG.PRG WITH "<ruta>\archivo.sc2" ==> Regenera la versi<73>n binaria con extensi<73>n scx
NOTA FINAL:
Este programa es Open Source y "libre", y como tal no ofrezco garant<6E>as de que cumpla con sus espectativas
o de que est<73> libre de fallos, que intentar<61> solucionar si me reporta y mis obligaciones me lo permiten.
LICENCIA:
Esta obra est<73> sujeta a la licencia Reconocimiento-CompartirIgual 4.0 Internacional de Creative Commons.
Para ver una copia de esta licencia, visite http://creativecommons.org/licenses/by-sa/4.0/deed.es_ES.
ENGLISH --------------------------------------------------------------------------------------------
What is FOXBIN2PRG?
It is a program intended to be used with SCM tools (Source Code Managers), that pretends to sustitute
SCCTEXT and enhance it, generating bidirectional TEXT versions that permits to recreate the original
binary file.
Advantages:
- It generates "PRG" style programas (no compilables), for visual comparison
- It enables the the change of the TEXT version as easy as modifying a PRG
- All the program code is in just one PRG, to simplify its copy and maintainability
- With TEXT versions you can regenerate the original binaries, so it is useful as backup
- The extensions are configurable if you create the FOXBIN2PRG.CFG file
- Methods and properties of TEXT version are alphabetically sorted for easy comparison
- It has compatibility with SCCTEXT at parameter level so can be used as sustitute with SourceSafe
Actually supports conversions between SCX, VCX and PJX files, for which it generates TEXT versions
with extension SC2,VC2 and PJ2, that can be reconfigured to compatibilize with SourceSafe.
Structure of configuration file FOXBIN2PRG.CFG
extension: SC2=SCA
extension: VC2=VCA
extension: PJ2=PJA
USE:
DO FOXBIN2PRG.PRG WITH "<ruta>\archivo.scx" ==> Generates the TEXT version sc2 extension
DO FOXBIN2PRG.PRG WITH "<ruta>\archivo.sc2" ==> Regenerates the binary version with scx extension
FINAL NOTE:
This program is Open Source and "libre", and I don't make any garanties that it fulfills your espectations
or that it will be free of bugs, that I will try to fix if my obligations let me do it.
LICENCE:
This work is licensed under the Creative Commons Attribution 4.0 International License.
To view a copy of this license, visit http://creativecommons.org/licenses/by/4.0/.

View File

@@ -21,9 +21,9 @@
* * CONFIGURACI<43>N: SI SE CREA UN ARCHIVO FOXBIN2PRG.CFG, SE PUEDEN CAMBIAR LAS EXTENSIONES * * CONFIGURACI<43>N: SI SE CREA UN ARCHIVO FOXBIN2PRG.CFG, SE PUEDEN CAMBIAR LAS EXTENSIONES
* PARA PODER USARLO CON SOURCESAFE PONIENDO LAS EQUIVALENCIAS AS<41>: * PARA PODER USARLO CON SOURCESAFE PONIENDO LAS EQUIVALENCIAS AS<41>:
* *
* VC2=VCA * extension: VC2=VCA
* SC2=SCA * extension: SC2=SCA
* PJ2=PJA * extension: PJ2=PJA
* *
* USO/USE: * USO/USE:
* DO FOXBIN2PRG.PRG WITH "<path>\FILE.VCX" && Genera "<path>\FILE.VC2" (BIN TO PRG CONVERSION) * DO FOXBIN2PRG.PRG WITH "<path>\FILE.VCX" && Genera "<path>\FILE.VC2" (BIN TO PRG CONVERSION)
@@ -45,12 +45,14 @@
* 27/11/2013 FDBOZZO v1.5 Arreglo bug que no generaba form completo * 27/11/2013 FDBOZZO v1.5 Arreglo bug que no generaba form completo
* 01/12/2013 FDBOZZO v1.6 Refactorizaci<63>n completa generaci<63>n BIN y PRG, cambio de algoritmos, arreglo de bugs, Unit Testing con FoxUnit * 01/12/2013 FDBOZZO v1.6 Refactorizaci<63>n completa generaci<63>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<61>metros, verificaci<63>n y logueo de archivos READONLY con debug activa * 02/12/2013 FDBOZZO v1.7 Arreglo bug "Name", barra de progreso, agregado mensaje de ayuda si se llama sin par<61>metros, verificaci<63>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
* *
*--------------------------------------------------------------------------------------------------- *---------------------------------------------------------------------------------------------------
* TESTEO Y REPORTE DE BUGS (AGRADECIMIENTOS) * TESTEO Y REPORTE DE BUGS (AGRADECIMIENTOS)
* 23/11/2013 Luis Mart<72>nez REPORTE BUG: En algunos forms solo se generaba el dataenvironment (arreglado en v.1.5) * 23/11/2013 Luis Mart<72>nez REPORTE BUG: En algunos forms solo se generaba el dataenvironment (arreglado en v.1.5)
* 27/11/2013 Fidel Charny REPORTE BUG: Error en el guardado de ciertas propiedades de array (arreglado en v.1.6) * 27/11/2013 Fidel Charny REPORTE BUG: Error en el guardado de ciertas propiedades de array (arreglado en v.1.6)
* 02/12/2013 Fidel Charny REPORTE BUG: Se pierden algunas propiedades y no muestra picture si "Name" no es la <20>ltima (arreglado en v.1.7) * 02/12/2013 Fidel Charny REPORTE BUG: Se pierden algunas propiedades y no muestra picture si "Name" no es la <20>ltima (arreglado en v.1.7)
* 03/12/2013 Fidel Charny REPORTE BUG: Se siguen perdiendo algunas propiedades por implementaci<63>n defectuosa del arreglo anterior (arreglado en v.1.8)
* *
*--------------------------------------------------------------------------------------------------- *---------------------------------------------------------------------------------------------------
* TRAMIENTOS ESPECIALES DE ASIGNACIONES DE PROPIEDADES: * TRAMIENTOS ESPECIALES DE ASIGNACIONES DE PROPIEDADES:
@@ -157,7 +159,7 @@ LPARAMETERS tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErro
TRY TRY
LOCAL lcSys16, I, lcPath, lnResp, lcFileSpec, lcFile, laFiles(1,5), laConfig(1), lcConfigFile, lcExt ; LOCAL lcSys16, I, lcPath, lnResp, lcFileSpec, lcFile, laFiles(1,5), laConfig(1), lcConfigFile, lcExt ;
, llExisteConfig, llShowProgress, lcConfData, lnFileCount ; , llExisteConfig, llShowProgress, lcConfData, lnFileCount ;
, loEx as Exception , loEx AS EXCEPTION
PUBLIC goFrm_Avance AS frm_avance OF 'FOXBIN2PRG.PRG' ; PUBLIC goFrm_Avance AS frm_avance OF 'FOXBIN2PRG.PRG' ;
, goCnv AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' , goCnv AS c_foxbin2prg OF 'FOXBIN2PRG.PRG'
@@ -218,7 +220,7 @@ TRY
CASE '*' $ JUSTEXT( tc_InputFile ) OR '?' $ JUSTEXT( tc_InputFile ) CASE '*' $ JUSTEXT( tc_InputFile ) OR '?' $ JUSTEXT( tc_InputFile )
MESSAGEBOX( 'No se admiten extensiones * o ? porque es peligroso (se pueden pisar binarios con archivo xx2 vac<61>os).' ; MESSAGEBOX( 'No se admiten extensiones * o ? porque es peligroso (se pueden pisar binarios con archivo xx2 vac<61>os).' ;
, 0+48+4096, 'FOXBIN2PRG: ERROR!!', 10000 ) , 0+48+4096, 'FOXBIN2PRG: ERROR!!', 10000 )
CASE '*' $ JUSTSTEM( tc_InputFile ) CASE '*' $ JUSTSTEM( tc_InputFile )
*-- Se quieren todos los archivos de una extensi<73>n *-- Se quieren todos los archivos de una extensi<73>n
lcFileSpec = FULLPATH( tc_InputFile ) lcFileSpec = FULLPATH( tc_InputFile )
@@ -240,14 +242,14 @@ TRY
IF llShowProgress IF llShowProgress
goFrm_Avance.nMAX_VALUE = lnFileCount goFrm_Avance.nMAX_VALUE = lnFileCount
ENDIF ENDIF
FOR I = 1 TO lnFileCount FOR I = 1 TO lnFileCount
lcFile = FORCEPATH( laFiles(I,1), JUSTPATH( lcFileSpec ) ) lcFile = FORCEPATH( laFiles(I,1), JUSTPATH( lcFileSpec ) )
goFrm_Avance.lbl_TAREA.Caption = 'Procesando archivo ' + lcFile + '...' goFrm_Avance.lbl_TAREA.CAPTION = 'Procesando archivo ' + lcFile + '...'
goFrm_Avance.nVALUE = I goFrm_Avance.nVALUE = I
IF llShowProgress IF llShowProgress
goFrm_Avance.Show() goFrm_Avance.SHOW()
ENDIF ENDIF
IF FILE( lcFile ) IF FILE( lcFile )
@@ -279,8 +281,8 @@ TRY
CATCH TO loEx CATCH TO loEx
FINALLY FINALLY
goFrm_Avance.Hide() goFrm_Avance.HIDE()
goFrm_Avance.Release() goFrm_Avance.RELEASE()
STORE NULL TO goCnv, goFrm_Avance STORE NULL TO goCnv, goFrm_Avance
RELEASE goCnv, goFrm_Avance RELEASE goCnv, goFrm_Avance
ENDTRY ENDTRY
@@ -325,7 +327,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
l_ShowErrors = .F. l_ShowErrors = .F.
lFileMode = .F. lFileMode = .F.
nClassTimeStamp = '' nClassTimeStamp = ''
n_FB2PRG_Version = 1.6 n_FB2PRG_Version = 1.8
o_Conversor = NULL o_Conversor = NULL
c_VC2 = 'VC2' c_VC2 = 'VC2'
c_SC2 = 'SC2' c_SC2 = 'SC2'
@@ -473,63 +475,63 @@ ENDDEFINE
******************************************************************************************************************* *******************************************************************************************************************
DEFINE CLASS frm_avance AS form DEFINE CLASS frm_avance AS FORM
Height = 79 HEIGHT = 79
Width = 628 WIDTH = 628
ShowWindow = 2 SHOWWINDOW = 2
DoCreate = .T. DOCREATE = .T.
AutoCenter = .T. AUTOCENTER = .T.
BorderStyle = 2 BORDERSTYLE = 2
Caption = "Avance del proceso" CAPTION = "Avance del proceso"
ControlBox = .F. CONTROLBOX = .F.
BackColor = RGB(255,255,255) BACKCOLOR = RGB(255,255,255)
nmax_value = 100 nMAX_VALUE = 100
nvalue = 0 nVALUE = 0
Name = "FRM_AVANCE" NAME = "FRM_AVANCE"
ADD OBJECT shp_base AS shape WITH ; ADD OBJECT shp_base AS SHAPE WITH ;
Top = 40, ; TOP = 40, ;
Left = 12, ; LEFT = 12, ;
Height = 21, ; HEIGHT = 21, ;
Width = 601, ; WIDTH = 601, ;
Curvature = 15, ; CURVATURE = 15, ;
Name = "shp_base" NAME = "shp_base"
ADD OBJECT shp_avance AS shape WITH ; ADD OBJECT shp_avance AS SHAPE WITH ;
Top = 40, ; TOP = 40, ;
Left = 12, ; LEFT = 12, ;
Height = 21, ; HEIGHT = 21, ;
Width = 36, ; WIDTH = 36, ;
Curvature = 15, ; CURVATURE = 15, ;
BackColor = RGB(255,255,128), ; BACKCOLOR = RGB(255,255,128), ;
BorderColor = RGB(255,0,0), ; BORDERCOLOR = RGB(255,0,0), ;
Name = "shp_Avance" NAME = "shp_Avance"
ADD OBJECT lbl_tarea AS label WITH ; ADD OBJECT lbl_TAREA AS LABEL WITH ;
BackStyle = 0, ; BACKSTYLE = 0, ;
Caption = ".", ; CAPTION = ".", ;
Height = 17, ; HEIGHT = 17, ;
Left = 12, ; LEFT = 12, ;
Top = 20, ; TOP = 20, ;
Width = 604, ; WIDTH = 604, ;
Name = "lbl_Tarea" NAME = "lbl_Tarea"
PROCEDURE nvalue_assign PROCEDURE nvalue_assign
LPARAMETERS vNewVal LPARAMETERS vNewVal
WITH THIS WITH THIS
.nvalue = m.vNewVal .nVALUE = m.vNewVal
.shp_Avance.Width = m.vNewVal * .shp_base.Width / .nMax_Value .shp_avance.WIDTH = m.vNewVal * .shp_base.WIDTH / .nMAX_VALUE
ENDWITH ENDWITH
ENDPROC ENDPROC
PROCEDURE Init PROCEDURE INIT
THIS.nvalue = 0 THIS.nVALUE = 0
ENDPROC ENDPROC
@@ -559,6 +561,7 @@ DEFINE CLASS c_conversor_base AS SESSION
+ [<memberdata name="normalizarasignacion" type="method" display="normalizarAsignacion"/>] ; + [<memberdata name="normalizarasignacion" type="method" display="normalizarAsignacion"/>] ;
+ [<memberdata name="normalizarvalorpropiedad" type="method" display="normalizarValorPropiedad"/>] ; + [<memberdata name="normalizarvalorpropiedad" type="method" display="normalizarValorPropiedad"/>] ;
+ [<memberdata name="normalizarvalorxml" type="method" display="normalizarValorXML"/>] ; + [<memberdata name="normalizarvalorxml" type="method" display="normalizarValorXML"/>] ;
+ [<memberdata name="sortpropsandvalues" type="method" display="sortPropsAndValues"/>] ;
+ [<memberdata name="writelog" type="method" display="writeLog"/>] ; + [<memberdata name="writelog" type="method" display="writeLog"/>] ;
+ [<memberdata name="c_curdir" type="property" display="c_CurDir"/>] ; + [<memberdata name="c_curdir" type="property" display="c_CurDir"/>] ;
+ [<memberdata name="c_inputfile" type="property" display="c_InputFile"/>] ; + [<memberdata name="c_inputfile" type="property" display="c_InputFile"/>] ;
@@ -859,7 +862,7 @@ DEFINE CLASS c_conversor_base AS SESSION
IF VARTYPE(m.ltDateTime) <> 'T' IF VARTYPE(m.ltDateTime) <> 'T'
m.ltDateTime = DATETIME() m.ltDateTime = DATETIME()
ENDIF ENDIF
tnTimeStamp = ( YEAR(m.ltDateTime) - 1980) * 2^25 ; tnTimeStamp = ( YEAR(m.ltDateTime) - 1980) * 2^25 ;
+ MONTH(m.ltDateTime) * 2^21 ; + MONTH(m.ltDateTime) * 2^21 ;
+ DAY(m.ltDateTime) * 2^16 ; + DAY(m.ltDateTime) * 2^16 ;
@@ -899,7 +902,7 @@ DEFINE CLASS c_conversor_base AS SESSION
*lcTimeStamp_Ret = DTOC(laDir[1,3])+" "+lcTime *lcTimeStamp_Ret = DTOC(laDir[1,3])+" "+lcTime
ltTimeStamp = EVALUATE( '{^' + DTOC(laDir(1,3)) + ' ' + TRANSFORM(laDir(1,4)) + '}' ) ltTimeStamp = EVALUATE( '{^' + DTOC(laDir(1,3)) + ' ' + TRANSFORM(laDir(1,4)) + '}' )
*-- En mi arreglo, si la hora pasada tiene 32 segundos o m<>s, redondeo al siguiente minuto, ya que *-- En mi arreglo, si la hora pasada tiene 32 segundos o m<>s, redondeo al siguiente minuto, ya que
*-- la descodificaci<63>n posterior de GetTimeStamp tiene ese margen de error. *-- la descodificaci<63>n posterior de GetTimeStamp tiene ese margen de error.
IF SEC(m.ltTimeStamp) >= 32 IF SEC(m.ltTimeStamp) >= 32
@@ -935,7 +938,7 @@ DEFINE CLASS c_conversor_base AS SESSION
+ STR(lnHour,2) + ":" + STR(lnMinutes,2) + ":" + STR(lnSeconds,2) + STR(lnHour,2) + ":" + STR(lnMinutes,2) + ":" + STR(lnSeconds,2)
ltTimeStamp = EVALUATE( "{^" + lcTimeStamp + "}" ) ltTimeStamp = EVALUATE( "{^" + lcTimeStamp + "}" )
lcTimeStamp_Ret = TTOC( ltTimeStamp ) lcTimeStamp_Ret = TTOC( ltTimeStamp )
CATCH TO loEx CATCH TO loEx
@@ -1131,6 +1134,126 @@ DEFINE CLASS c_conversor_base AS SESSION
ENDFUNC ENDFUNC
*******************************************************************************************************************
PROCEDURE sortPropsAndValues
* KNOWLEDGE BASE:
* 02/12/2013 FDBOZZO Fidel Charny me pas<61> un ejemplo donde se pierden propiedades f<>sicamente
* si se ordenan alfab<61>ticamente en un ADD OBJECT. Pierde "picture" y otras m<>s.
* Pareciera que la <20>ltima debe ser "Name".
*--------------------------------------------------------------------------------------------------------------
* PAR<41>METROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT)
* taPropsAndValues (!@ IN ) El array con las propiedades y valores del objeto o clase
* tnPropsAndValues_Count (!v IN ) Cantidad de propiedades
* tnSortType (!v IN ) Tipo de sort:
* 0=Solo separar propiedades de clase y de objetos (.)
* 1=Sort completo de propiedades (para la versi<73>n TEXTO)
* 2=Sort completo de propiedades con "Name" al final (para la versi<73>n BIN)
*--------------------------------------------------------------------------------------------------------------
LPARAMETERS taPropsAndValues, tnPropsAndValues_Count, tnSortType
EXTERNAL ARRAY taPropsAndValues
TRY
LOCAL I, X, laPropsAndValues(1,2)
DIMENSION laPropsAndValues( tnPropsAndValues_Count, 2 )
ACOPY( taPropsAndValues, laPropsAndValues )
IF m.tnSortType >= 1
* CON SORT:
* - A las que no tienen '.' les pongo 'A' por delante, y al resto 'B' por delante para que queden al final
FOR I = 1 TO m.tnPropsAndValues_Count
IF '.' $ laPropsAndValues(I,1)
IF m.tnSortType = 2 AND JUSTEXT( laPropsAndValues(I,1) ) == 'Name'
laPropsAndValues(I,1) = JUSTSTEM( laPropsAndValues(I,1) ) + '.' + CHR(255) + 'Name'
ENDIF
laPropsAndValues(I,1) = 'B' + laPropsAndValues(I,1)
ELSE
IF m.tnSortType = 2 AND laPropsAndValues(I,1) == 'Name'
laPropsAndValues(I,1) = CHR(255) + 'Name'
ENDIF
laPropsAndValues(I,1) = 'A' + laPropsAndValues(I,1)
ENDIF
ENDFOR
ASORT( laPropsAndValues, 1, -1, 0, 1)
*-- Quitar el agregado
FOR I = 1 TO m.tnPropsAndValues_Count
taPropsAndValues(I,1) = SUBSTR( laPropsAndValues(I,1), 2 )
taPropsAndValues(I,2) = laPropsAndValues(I,2)
DO CASE
CASE m.tnSortType <> 2
*-- Saltear
CASE taPropsAndValues(I,1) == CHR(255) + 'Name'
taPropsAndValues(I,1) = 'Name'
CASE JUSTEXT( taPropsAndValues(I,1) ) == CHR(255) + 'Name'
taPropsAndValues(I,1) = JUSTSTEM( taPropsAndValues(I,1) ) + '.Name'
ENDCASE
ENDFOR
ELSE && m.tnSortType = 0
*-- SIN SORT: Creo 2 arrays, el bueno y el temporal, y al terminar agrego el temporal al bueno.
*-- Debo separar las props.normales de las de los objetos (ocurre cuando es un ADD OBJECT)
X = 0
*-- PRIMERO las que no tienen punto
FOR I = 1 TO m.tnPropsAndValues_Count
IF EMPTY( laPropsAndValues(I,1) )
LOOP
ENDIF
IF NOT '.' $ laPropsAndValues(I,1)
X = X + 1
taPropsAndValues(X,1) = laPropsAndValues(I,1)
taPropsAndValues(X,2) = laPropsAndValues(I,2)
ENDIF
ENDFOR
*-- LUEGO las dem<65>s props.
FOR I = 1 TO m.tnPropsAndValues_Count
IF EMPTY( laPropsAndValues(I,1) )
LOOP
ENDIF
IF '.' $ laPropsAndValues(I,1)
X = X + 1
taPropsAndValues(X,1) = laPropsAndValues(I,1)
taPropsAndValues(X,2) = laPropsAndValues(I,2)
ENDIF
ENDFOR
ENDIF
*-- VER ESTO SI HACE FALTA, SOBRE LO DE PONER LOS METODOS AL FINAL Y ADAPTAR
*-- Agregar propiedades primero
*FOR I = 1 TO m.tnPropsAndValues_Count
* *-- SI HACE FALTA QUE LOS M<>TODOS EST<53>N AL FINAL, DESCOMENTAR ESTO (Y EL DE M<>S ARRIBA)
* *IF LEFT(taPropsAndValues(I), 1) == '*' && Only Reserved3 have this
* * lcMethods = m.lcMethods + m.taPropsAndValues(I,1) + ' = ' + m.taPropsAndValues(I,2) + CR_LF
* * LOOP
* *ENDIF
* tcSortedMemo = m.tcSortedMemo + m.laPropsAndValues(I,1) + ' = ' + m.laPropsAndValues(I,2) + CR_LF
*ENDFOR
*-- Agregar m<>todos al final
*tcSortedMemo = m.tcSortedMemo + m.lcMethods
CATCH TO loEx
IF THIS.l_Debug AND _VFP.STARTMODE = 0
SET STEP ON
ENDIF
THROW
ENDTRY
RETURN
ENDPROC
ENDDEFINE ENDDEFINE
@@ -1281,6 +1404,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
* LOS BLOQUES DE EXCLUSI<53>N SON AQUELLOS QUE TIENEN TEXT/ENDTEXT OF #IF .F./#ENDIF Y SE USAN PARA NO BUSCAR * LOS BLOQUES DE EXCLUSI<53>N SON AQUELLOS QUE TIENEN TEXT/ENDTEXT OF #IF .F./#ENDIF Y SE USAN PARA NO BUSCAR
* INSTRUCCIONES COMO "DEFINE CLASS" O "PROCEDURE" EN LOS MISMOS. * INSTRUCCIONES COMO "DEFINE CLASS" O "PROCEDURE" EN LOS MISMOS.
*-------------------------------------------------------------------------------------------------------------- *--------------------------------------------------------------------------------------------------------------
* PAR<41>METROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT)
* taCodeLines (!@ IN ) El array con las l<>neas del c<>digo de texto donde buscar * taCodeLines (!@ IN ) El array con las l<>neas del c<>digo de texto donde buscar
* tnCodeLines (?@ IN ) Cantidad de l<>neas de c<>digo * tnCodeLines (?@ IN ) Cantidad de l<>neas de c<>digo
* ta_ID_Bloques (?@ IN ) Array de pares de identificadores (2 cols). Ej: '#IF .F.','#ENDI' ; 'TEXT','ENDTEXT' ; etc * ta_ID_Bloques (?@ IN ) Array de pares de identificadores (2 cols). Ej: '#IF .F.','#ENDI' ; 'TEXT','ENDTEXT' ; etc
@@ -1344,8 +1468,6 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
ENDIF ENDIF
CATCH TO loEx CATCH TO loEx
lnCodError = loEx.ERRORNO
IF THIS.l_Debug AND _VFP.STARTMODE = 0 IF THIS.l_Debug AND _VFP.STARTMODE = 0
SET STEP ON SET STEP ON
ENDIF ENDIF
@@ -1579,14 +1701,17 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
*-- Fin: ESTRUCTURA A ANALIZAR: *-- Fin: ESTRUCTURA A ANALIZAR:
TRY TRY
LOCAL lcDefinedPAM, lnPos, lnPos2, laProps(1,2), lcLine, lcPropName, lcValue, I, lcAsignacion, lcMemo LOCAL lcDefinedPAM, lnPos, lnPos2, laProps(1,2), lcLine, lcPropName, lcValue, I, lcAsignacion, lcMemo ;
, laPropsAndValues(1,2), lnPropsAndValues_Count
lcMemo = '' lcMemo = ''
IF toClase._Prop_Count > 0 IF toClase._Prop_Count > 0
DIMENSION laProps( toClase._Prop_Count, 2 ) DIMENSION laProps( toClase._Prop_Count, 2 )
ACOPY( toClase._Props, laProps ) ACOPY( toClase._Props, laProps )
lnPropsAndValues_Count = 0
WITH THIS WITH THIS
*-- OBTENGO LAS PROPIEDADES Y SUS VALORES
FOR I = 1 TO toClase._Prop_Count FOR I = 1 TO toClase._Prop_Count
.get_SeparatedPropAndValue( toClase._Props(I,1), @lcPropName, @lcValue ) .get_SeparatedPropAndValue( toClase._Props(I,1), @lcPropName, @lcValue )
@@ -1597,20 +1722,36 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
CASE THIS.analizarAsignacion_TAG_Indicado( @lcPropName, @lcValue, @laProps, toClase._Prop_Count, @I ; CASE THIS.analizarAsignacion_TAG_Indicado( @lcPropName, @lcValue, @laProps, toClase._Prop_Count, @I ;
, C_FB2P_VALUE_I, C_FB2P_VALUE_F, C_LEN_FB2P_VALUE_I, C_LEN_FB2P_VALUE_F, @lcAsignacion ) , C_FB2P_VALUE_I, C_FB2P_VALUE_F, C_LEN_FB2P_VALUE_I, C_LEN_FB2P_VALUE_F, @lcAsignacion )
*-- FB2P_VALUE *-- FB2P_VALUE
lnPropsAndValues_Count = lnPropsAndValues_Count + 1
CASE THIS.analizarAsignacion_TAG_Indicado( @lcPropName, @lcValue, @laProps, toClase._Prop_Count, @I ; CASE THIS.analizarAsignacion_TAG_Indicado( @lcPropName, @lcValue, @laProps, toClase._Prop_Count, @I ;
, C_MEMBERDATA_I, C_MEMBERDATA_F, C_LEN_MEMBERDATA_I, C_LEN_MEMBERDATA_F, @lcAsignacion ) , C_MEMBERDATA_I, C_MEMBERDATA_F, C_LEN_MEMBERDATA_I, C_LEN_MEMBERDATA_F, @lcAsignacion )
*-- MEMBERDATA *-- MEMBERDATA
lnPropsAndValues_Count = lnPropsAndValues_Count + 1
OTHERWISE OTHERWISE
*-- Propiedad normal *-- Propiedad normal
THIS.desnormalizarValorPropiedad( @lcPropName, @lcValue, '' ) THIS.desnormalizarValorPropiedad( @lcPropName, @lcValue, '' )
lnPropsAndValues_Count = lnPropsAndValues_Count + 1
ENDCASE ENDCASE
lcMemo = lcMemo + lcPropName + ' = ' + lcValue + CR_LF DIMENSION laPropsAndValues(lnPropsAndValues_Count,2)
laPropsAndValues(lnPropsAndValues_Count,1) = lcPropName
laPropsAndValues(lnPropsAndValues_Count,2) = lcValue
ENDFOR ENDFOR
*-- REORDENO LAS PROPIEDADES
THIS.sortPropsAndValues( @laPropsAndValues, lnPropsAndValues_Count, 2 )
*-- ARMO EL MEMO A DEVOLVER
FOR I = 1 TO lnPropsAndValues_Count
lcMemo = lcMemo + laPropsAndValues(I,1) + ' = ' + laPropsAndValues(I,2) + CR_LF
ENDFOR
ENDWITH && THIS ENDWITH && THIS
ENDIF && laProps > 0 ENDIF && laProps > 0
@@ -1629,6 +1770,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
******************************************************************************************************************* *******************************************************************************************************************
PROCEDURE objectProps2Memo PROCEDURE objectProps2Memo
*-- ARMA EL MEMO DE PROPERTIES CON LAS PROPIEDADES Y SUS VALORES
LPARAMETERS toObjeto, toClase LPARAMETERS toObjeto, toClase
#IF .F. #IF .F.
@@ -1636,15 +1778,31 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
, toObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' , toObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG'
#ENDIF #ENDIF
LOCAL lcMemo, I LOCAL lcMemo, I, laPropsAndValues(1,2), lcPropName, lcValue
lcMemo = '' lcMemo = ''
FOR I = 1 TO toObjeto._Prop_Count IF toObjeto._Prop_Count > 0
TEXT TO lcMemo ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 DIMENSION laPropsAndValues( toObjeto._Prop_Count, 2 )
<<toObjeto._Props(I,1)>>
ENDTEXT WITH THIS
ENDFOR FOR I = 1 TO toObjeto._Prop_Count
.get_SeparatedPropAndValue( toObjeto._Props(I,1), @lcPropName, @lcValue )
laPropsAndValues(I,1) = lcPropName
laPropsAndValues(I,2) = lcValue
ENDFOR
ENDWITH && THIS
*-- REORDENO LAS PROPIEDADES
THIS.sortPropsAndValues( @laPropsAndValues, toObjeto._Prop_Count, 2 )
*-- ARMO EL MEMO A DEVOLVER
FOR I = 1 TO toObjeto._Prop_Count
lcMemo = lcMemo + laPropsAndValues(I,1) + ' = ' + laPropsAndValues(I,2) + CR_LF
ENDFOR
ENDIF
RETURN lcMemo RETURN lcMemo
ENDPROC ENDPROC
@@ -4309,7 +4467,7 @@ DEFINE CLASS c_conversor_pjx_a_prg AS c_conversor_bin_a_prg
* (ES) AUTOGENERADO - PARA MANTENER INFORMACI<43>N DE SERVIDORES DLL USAR "FOXBIN2PRG", SI NO IMPORTAN, EJECUTAR DIRECTAMENTE PARA REGENERAR EL PROYECTO. * (ES) AUTOGENERADO - PARA MANTENER INFORMACI<43>N DE SERVIDORES DLL USAR "FOXBIN2PRG", SI NO IMPORTAN, EJECUTAR DIRECTAMENTE PARA REGENERAR EL PROYECTO.
* (EN) AUTOGENERATED - TO KEEP DLL SERVER INFORMATION USE "FOXBIN2PRG", OTHERWISE YOU CAN EXECUTE DIRECTLY TO REGENERATE PROJECT. * (EN) AUTOGENERATED - TO KEEP DLL SERVER INFORMATION USE "FOXBIN2PRG", OTHERWISE YOU CAN EXECUTE DIRECTLY TO REGENERATE PROJECT.
*-------------------------------------------------------------------------------------------------------------------------------------------------------- *--------------------------------------------------------------------------------------------------------------------------------------------------------
<<C_FB2PRG_META_I>> Version="<<TRANSFORM(THIS.n_FB2PRG_Version)>>" SourceFile="<<THIS.c_InputFile>>" <<C_FB2PRG_META_F>> (Para uso con Visual FoxPro 9.0) <<C_FB2PRG_META_I>> Version="<<TRANSFORM(THIS.n_FB2PRG_Version)>>" SourceFile="<<THIS.c_InputFile>>" Generated="<<TTOC(DATETIME())>>" <<C_FB2PRG_META_F>> (Para uso con Visual FoxPro 9.0)
* *
ENDTEXT ENDTEXT
ENDPROC ENDPROC
@@ -4860,7 +5018,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
* (ES) AUTOGENERADO - <20><>ATENCI<43>N!! - <20><>NO PENSADO PARA EJECUTAR!! USAR SOLAMENTE PARA INTEGRAR CAMBIOS Y ALMACENAR CON HERRAMIENTAS SCM!! * (ES) AUTOGENERADO - <20><>ATENCI<43>N!! - <20><>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!! * (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!!
*-------------------------------------------------------------------------------------------------------------------------------------------------------- *--------------------------------------------------------------------------------------------------------------------------------------------------------
<<C_FB2PRG_META_I>> Version="<<TRANSFORM(THIS.n_FB2PRG_Version)>>" SourceFile="<<THIS.c_InputFile>>" <<C_FB2PRG_META_F>> (Para uso con Visual FoxPro 9.0) <<C_FB2PRG_META_I>> Version="<<TRANSFORM(THIS.n_FB2PRG_Version)>>" SourceFile="<<THIS.c_InputFile>>" Generated="<<TTOC(DATETIME())>>" <<C_FB2PRG_META_F>> (Para uso con Visual FoxPro 9.0)
* *
ENDTEXT ENDTEXT
ENDPROC ENDPROC
@@ -5251,9 +5409,6 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
* los objetos contenidos, causa un error. Se deben ordenar primero las * los objetos contenidos, causa un error. Se deben ordenar primero las
* props.nativas (sin punto) y luego las de los objetos (con punto) * props.nativas (sin punto) y luego las de los objetos (con punto)
* *
* 02/12/2013 FDBOZZO Fidel Charny me pas<61> un ejemplo donde se pierden propiedades f<>sicamente
* si se ordenan alfab<61>ticamente en un ADD OBJECT. Pierde "picture" y otras m<>s.
* Pareciera que la <20>ltima debe ser "Name".
*--------------------------------------------------------------------------------------------------- *---------------------------------------------------------------------------------------------------
* PAR<41>METROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT) * PAR<41>METROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT)
* tcMemo (v! IN ) Contenido de un campo MEMO * tcMemo (v! IN ) Contenido de un campo MEMO
@@ -5265,7 +5420,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
LPARAMETERS tcMemo, tnSort, taPropsAndValues, tnPropsAndValues_Count, tcSortedMemo LPARAMETERS tcMemo, tnSort, taPropsAndValues, tnPropsAndValues_Count, tcSortedMemo
EXTERNAL ARRAY taPropsAndValues EXTERNAL ARRAY taPropsAndValues
TRY TRY
LOCAL laItems(1), I, X, lnLenAcum, lnPosEQ, lcPropName, lnLenVal, lcValue, lcMethods, laPropsAndValues(1,2) LOCAL laItems(1), I, X, lnLenAcum, lnPosEQ, lcPropName, lnLenVal, lcValue, lcMethods
tcSortedMemo = '' tcSortedMemo = ''
tnPropsAndValues_Count = 0 tnPropsAndValues_Count = 0
@@ -5287,7 +5442,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
ENDIF ENDIF
X = X + 1 X = X + 1
DIMENSION laPropsAndValues(X,2) DIMENSION taPropsAndValues(X,2)
IF C_MPROPHEADER $ laItems(I) IF C_MPROPHEADER $ laItems(I)
*-- Solo entrar<61> por aqu<71> cuando se eval<61>e una propiedad de PROPERTIES con un valor especial (largo) *-- Solo entrar<61> por aqu<71> cuando se eval<61>e una propiedad de PROPERTIES con un valor especial (largo)
@@ -5313,8 +5468,8 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
ENDIF ENDIF
*-- Es un valor especial, por lo que se encapsula en un marcador especial *-- Es un valor especial, por lo que se encapsula en un marcador especial
laPropsAndValues(X,1) = lcPropName taPropsAndValues(X,1) = lcPropName
laPropsAndValues(X,2) = THIS.normalizarValorPropiedad( lcPropName, lcValue, '' ) taPropsAndValues(X,2) = THIS.normalizarValorPropiedad( lcPropName, lcValue, '' )
ELSE ELSE
*-- Propiedad normal *-- Propiedad normal
@@ -5324,81 +5479,19 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
*ENDIF *ENDIF
lnPosEQ = AT( '=', laItems(I) ) lnPosEQ = AT( '=', laItems(I) )
laPropsAndValues(X,1) = LEFT( laItems(I), lnPosEQ - 2 ) taPropsAndValues(X,1) = LEFT( laItems(I), lnPosEQ - 2 )
laPropsAndValues(X,2) = THIS.normalizarValorPropiedad( laPropsAndValues(X,1), LTRIM( SUBSTR( laItems(I), lnPosEQ + 2 ) ), '' ) taPropsAndValues(X,2) = THIS.normalizarValorPropiedad( taPropsAndValues(X,1), LTRIM( SUBSTR( laItems(I), lnPosEQ + 2 ) ), '' )
ENDIF ENDIF
ENDFOR ENDFOR
*-- 2) SORT
tnPropsAndValues_Count = X tnPropsAndValues_Count = X
lcMethods = '' lcMethods = ''
DO CASE
CASE m.tnSort = 1
* CON SORT:
* - A las que no tienen '.' les pongo 'A' por delante, y al resto 'B' por delante para que queden al final
* - Las "Name" deben estar al final, por lo que les agrego "_" pro delante
FOR I = 1 TO m.tnPropsAndValues_Count
IF '.' $ laPropsAndValues(I,1)
laPropsAndValues(I,1) = 'B' + laPropsAndValues(I,1)
ELSE
laPropsAndValues(I,1) = 'A' + laPropsAndValues(I,1)
ENDIF
*-- "Name" debe ser la <20>ltima. La modifico temporalmente. 02/12/2013 FDBOZZO *-- 2) SORT
IF JUSTEXT( laPropsAndValues(I,1) ) == 'Name' THIS.sortPropsAndValues( @taPropsAndValues, tnPropsAndValues_Count, tnSort )
laPropsAndValues(I,1) = JUSTSTEM( laPropsAndValues(I,1) ) + '.' + CHR(255) + 'Name'
ENDIF
ENDFOR
ASORT(laPropsAndValues,1,-1,0,1)
*-- Quitar el agregado
DIMENSION taPropsAndValues( tnPropsAndValues_Count, 2 )
FOR I = 1 TO m.tnPropsAndValues_Count
taPropsAndValues(I,1) = SUBSTR( laPropsAndValues(I,1), 2 )
taPropsAndValues(I,2) = laPropsAndValues(I,2)
*-- Restauro "Name". 02/12/2013 FDBOZZO
IF JUSTEXT( taPropsAndValues(I,1) ) == CHR(255) + 'Name'
taPropsAndValues(I,1) = JUSTSTEM( taPropsAndValues(I,1) ) + '.Name'
ENDIF
ENDFOR
CASE m.tnSort = 0
*-- SIN SORT: Creo 2 arrays, el bueno y el temporal, y al terminar agrego el temporal al bueno.
*-- Debo separar las props.normales de las de los objetos (ocurre cuando es un ADD OBJECT)
X = 0
DIMENSION taPropsAndValues( tnPropsAndValues_Count, 2 )
*-- PRIMERO las que no tienen punto
FOR I = 1 TO m.tnPropsAndValues_Count
IF EMPTY( laPropsAndValues(I,1) )
LOOP
ENDIF
IF NOT '.' $ laPropsAndValues(I,1)
X = X + 1
taPropsAndValues(X,1) = laPropsAndValues(I,1)
taPropsAndValues(X,2) = laPropsAndValues(I,2)
ENDIF
ENDFOR
*-- LUEGO las dem<65>s props.
FOR I = 1 TO m.tnPropsAndValues_Count
IF EMPTY( laPropsAndValues(I,1) )
LOOP
ENDIF
IF '.' $ laPropsAndValues(I,1)
X = X + 1
taPropsAndValues(X,1) = laPropsAndValues(I,1)
taPropsAndValues(X,2) = laPropsAndValues(I,2)
ENDIF
ENDFOR
ENDCASE
*-- Agregar propiedades primero *-- Agregar propiedades primero
FOR I = 1 TO m.tnPropsAndValues_Count FOR I = 1 TO m.tnPropsAndValues_Count