From ec02de65e92d65ad5dab66e40c1823fcf4ad9327 Mon Sep 17 00:00:00 2001 From: fernando Date: Wed, 8 Jan 2014 01:03:52 +0100 Subject: [PATCH] =?UTF-8?q?Changeset:=20133=20-=20Agregado=20nuevo=20flag?= =?UTF-8?q?=20de=20depuraci=C3=B3n=20en=20los=20scripts=20.vbs=20de=20proc?= =?UTF-8?q?eso=20por=20lotes=20para=20mostrar=20un=20mensaje=20de=20"Proce?= =?UTF-8?q?so=20finalizado"=20-=20Bug=20Fix=20vcx/scx:=20Arreglado=20probl?= =?UTF-8?q?ema=20con=20orden=20de=20propiedades=20y=20m=C3=A9todos=20en=20?= =?UTF-8?q?campo=20Rseerved3=20que=20provocaba=20que=20los=20eventos=20ass?= =?UTF-8?q?ign=20no=20se=20ejecuten=20-=20Agregado=20soporte=20para=20conv?= =?UTF-8?q?ertir=20archivos=20PJM=20de=20SourceSafe=20a=20PJ2=20-=20Agrega?= =?UTF-8?q?da=20validaci=C3=B3n=20para=20avisar=20cuando=20un=20men=C3=BA?= =?UTF-8?q?=20MNX=20no=20es=20versi=C3=B3n=20VFP=209=20para=20que=20el=20u?= =?UTF-8?q?suario=20lo=20pueda=20convertir=20con=20MODIFY=20MENU=20=20-=20CAMBIO=20en=20archivos=20MN2:=20Por=20un=20error=20tipo?= =?UTF-8?q?gr=C3=A1fico=20se=20ha=20cambiado=20el=20nombre=20"Autor"=20por?= =?UTF-8?q?=20"Author".=20Se=20puede=20agregar=20esa=20letra=20al=20MN2=20?= =?UTF-8?q?o=20regenerar=20-=20Limpieza=20de=20c=C3=B3digo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Convert_VFP9_BIN_2_PRG.vbs | 24 +- Convert_VFP9_PRG_2_BIN.vbs | 24 +- Normalize_FileNames.vbs | 22 +- TESTS/DATOS_READONLY/FB2P_FREE.DB2 | 4 +- TESTS/DATOS_READONLY/bmps/CarpetaAbierta.bmp | Bin 0 -> 822 bytes TESTS/DATOS_READONLY/bmps/CarpetaCerrada.bmp | Bin 0 -> 822 bytes TESTS/DATOS_READONLY/bmps/SCCCheckout.bmp | Bin 0 -> 822 bytes TESTS/DATOS_READONLY/bmps/container.ico | Bin 0 -> 1086 bytes TESTS/DATOS_READONLY/fb2p_test.pjm | 40 ++ TESTS/DATOS_READONLY/fb2p_test.pjt | Bin 4917 -> 5676 bytes TESTS/DATOS_READONLY/fb2p_test.pjx | Bin 2623 -> 2753 bytes TESTS/DATOS_READONLY/fb2p_test.vct | Bin 10223 -> 9008 bytes TESTS/DATOS_READONLY/fb2p_test.vcx | Bin 2885 -> 2885 bytes .../ft__foxbin2prg__c_conversor_prg_a_mnx.prg | 387 ++++++++++++++ foxbin2prg.pj2 | 8 +- foxbin2prg.pjt | Bin 324800 -> 332544 bytes foxbin2prg.pjx | Bin 1583 -> 1583 bytes foxbin2prg.prg | 501 +++++++++++++++--- 18 files changed, 921 insertions(+), 89 deletions(-) create mode 100644 TESTS/DATOS_READONLY/bmps/CarpetaAbierta.bmp create mode 100644 TESTS/DATOS_READONLY/bmps/CarpetaCerrada.bmp create mode 100644 TESTS/DATOS_READONLY/bmps/SCCCheckout.bmp create mode 100644 TESTS/DATOS_READONLY/bmps/container.ico create mode 100644 TESTS/DATOS_READONLY/fb2p_test.pjm create mode 100644 TESTS/ft__foxbin2prg__c_conversor_prg_a_mnx.prg diff --git a/Convert_VFP9_BIN_2_PRG.vbs b/Convert_VFP9_BIN_2_PRG.vbs index 2e0fd2f..e2e2df1 100644 --- a/Convert_VFP9_BIN_2_PRG.vbs +++ b/Convert_VFP9_BIN_2_PRG.vbs @@ -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 = 5 'Cumulative Flags: 0=OFF, 1=Create FoxBin2prg LOG, 2=Only show script calls, 4=Don't show FoxBin2prg error modal messages +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 '--------------------------------------------------------------------------------------------------- If cConvertType = "BIN2PRG" Then @@ -84,6 +84,9 @@ If WScript.Arguments.Count = 0 Then If GetBit(nDebug, 3) Then cErrMsg = cErrMsg & Chr(13) & "Bit 2 ON: (4) Don't show FoxBin2prg error modal messages" End If + If GetBit(nDebug, 4) Then + cErrMsg = cErrMsg & Chr(13) & "Bit 3 ON: (8) Show End of Process message" + End If MsgBox cErrMsg, 64, "No parameters - Debug Status" Else cEXETool = Replace(WScript.ScriptFullName, WScript.ScriptName, "foxbin2prg.exe") @@ -91,6 +94,10 @@ Else For i = 0 To WScript.Arguments.Count-1 scanDirs( WScript.Arguments(i) ) Next + + If GetBit(nDebug, 4) Then + MsgBox "Fin del Proceso!", 64, WScript.ScriptName + End If End If WScript.Quit(nExitCode) @@ -117,16 +124,17 @@ End Sub Private Sub evaluateFile( tcFile ) For x = 1 TO 8 If aExtensions(x) = UCase( FileSystemObject.GetExtensionName( tcFile ) ) Then - cFlagGenerateLog = "'0'" - cFlagDontShowErrMsg = "'0'" - cFlagShowCall = "'0'" - If GetBit(nDebug,1) Then + cFlagGenerateLog = "'0'" + cFlagDontShowErrMsg = "'0'" + cFlagShowCall = "'0'" + + If GetBit(nDebug, 1) Then cFlagGenerateLog = "'1'" End If - If GetBit(nDebug,2) Then + If GetBit(nDebug, 2) Then cFlagJustShowCall = "1" End If - If GetBit(nDebug,3) Then + If GetBit(nDebug, 3) Then cFlagDontShowErrMsg = "'1'" End If @@ -136,7 +144,7 @@ Private Sub evaluateFile( tcFile ) cCMD = "DO " & chr(34) & cEXETool & chr(34) & " WITH '" & tcFile & "','0','0','0'," & cFlagDontShowErrMsg & "," & cFlagGenerateLog End If If cFlagJustShowCall = "1" Then - MsgBox cCMD, 0, "PARAMETROS ENVIADOS" + MsgBox cCMD, 64, "PARAMETROS ENVIADOS" Else oVFP9.DoCmd( cCMD ) nExitCode = oVFP9.Eval("_SCREEN.ExitCode") diff --git a/Convert_VFP9_PRG_2_BIN.vbs b/Convert_VFP9_PRG_2_BIN.vbs index ad4fcd8..804d25a 100644 --- a/Convert_VFP9_PRG_2_BIN.vbs +++ b/Convert_VFP9_PRG_2_BIN.vbs @@ -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 = 5 'Cumulative Flags: 0=OFF, 1=Create FoxBin2prg LOG, 2=Only show script calls, 4=Don't show FoxBin2prg error modal messages +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 '--------------------------------------------------------------------------------------------------- If cConvertType = "BIN2PRG" Then @@ -84,6 +84,9 @@ If WScript.Arguments.Count = 0 Then If GetBit(nDebug, 3) Then cErrMsg = cErrMsg & Chr(13) & "Bit 2 ON: (4) Don't show FoxBin2prg error modal messages" End If + If GetBit(nDebug, 4) Then + cErrMsg = cErrMsg & Chr(13) & "Bit 3 ON: (8) Show End of Process message" + End If MsgBox cErrMsg, 64, "No parameters - Debug Status" Else cEXETool = Replace(WScript.ScriptFullName, WScript.ScriptName, "foxbin2prg.exe") @@ -91,6 +94,10 @@ Else For i = 0 To WScript.Arguments.Count-1 scanDirs( WScript.Arguments(i) ) Next + + If GetBit(nDebug, 4) Then + MsgBox "Fin del Proceso!", 64, WScript.ScriptName + End If End If WScript.Quit(nExitCode) @@ -117,16 +124,17 @@ End Sub Private Sub evaluateFile( tcFile ) For x = 1 TO 8 If aExtensions(x) = UCase( FileSystemObject.GetExtensionName( tcFile ) ) Then - cFlagGenerateLog = "'0'" - cFlagDontShowErrMsg = "'0'" - cFlagShowCall = "'0'" - If GetBit(nDebug,1) Then + cFlagGenerateLog = "'0'" + cFlagDontShowErrMsg = "'0'" + cFlagShowCall = "'0'" + + If GetBit(nDebug, 1) Then cFlagGenerateLog = "'1'" End If - If GetBit(nDebug,2) Then + If GetBit(nDebug, 2) Then cFlagJustShowCall = "1" End If - If GetBit(nDebug,3) Then + If GetBit(nDebug, 3) Then cFlagDontShowErrMsg = "'1'" End If @@ -136,7 +144,7 @@ Private Sub evaluateFile( tcFile ) cCMD = "DO " & chr(34) & cEXETool & chr(34) & " WITH '" & tcFile & "','0','0','0'," & cFlagDontShowErrMsg & "," & cFlagGenerateLog End If If cFlagJustShowCall = "1" Then - MsgBox cCMD, 0, "PARAMETROS ENVIADOS" + MsgBox cCMD, 64, "PARAMETROS ENVIADOS" Else oVFP9.DoCmd( cCMD ) nExitCode = oVFP9.Eval("_SCREEN.ExitCode") diff --git a/Normalize_FileNames.vbs b/Normalize_FileNames.vbs index e06849f..ab244bb 100644 --- a/Normalize_FileNames.vbs +++ b/Normalize_FileNames.vbs @@ -17,7 +17,7 @@ Set oVFP9 = CreateObject("VisualFoxPro.Application.9") filename_caps_log = Replace(WScript.ScriptFullName, WScript.ScriptName, "filename_caps.log") nExitCode = 0 '--------------------------------------------------------------------------------------------------- -nDebug = 5 'Cumulative Flags: 0=OFF, 1=Create filename_caps LOG, 2=Only show script calls, 4=Don't show filename_caps error modal messages +nDebug = 13 'Cumulative Flags: 0=OFF, 1=Create filename_caps LOG, 2=Only show script calls, 4=Don't show filename_caps error modal messages, 8=Show end of process message '--------------------------------------------------------------------------------------------------- If WScript.Arguments.Count = 0 Then @@ -32,6 +32,9 @@ If WScript.Arguments.Count = 0 Then If GetBit(nDebug, 3) Then cErrMsg = cErrMsg & Chr(13) & "Bit 2 ON: (4) Don't show filename_caps error modal messages" End If + If GetBit(nDebug, 4) Then + cErrMsg = cErrMsg & Chr(13) & "Bit 3 ON: (8) Show End of Process message" + End If MsgBox cErrMsg, 64, "No parameters - Debug Status" Else cEXETool = Replace(WScript.ScriptFullName, WScript.ScriptName, "filename_caps.exe") @@ -42,6 +45,10 @@ Else For i = 0 To WScript.Arguments.Count-1 scanDirs( WScript.Arguments(i) ) Next + + If GetBit(nDebug, 4) Then + MsgBox "Fin del Proceso!", 64, WScript.ScriptName + End If End If WScript.Quit(nExitCode) @@ -66,16 +73,17 @@ End Sub Private Sub evaluateFile( tcFile ) - cFlagGenerateLog = "'0'" - cFlagDontShowErrMsg = "'0'" - cFlagShowCall = "'0'" - If GetBit(nDebug,1) Then + cFlagGenerateLog = "'0'" + cFlagDontShowErrMsg = "'0'" + cFlagShowCall = "'0'" + + If GetBit(nDebug, 1) Then cFlagGenerateLog = "'1'" End If - If GetBit(nDebug,2) Then + If GetBit(nDebug, 2) Then cFlagJustShowCall = "1" End If - If GetBit(nDebug,3) Then + If GetBit(nDebug, 3) Then cFlagDontShowErrMsg = "'1'" End If diff --git a/TESTS/DATOS_READONLY/FB2P_FREE.DB2 b/TESTS/DATOS_READONLY/FB2P_FREE.DB2 index 9d2fc7f..8348722 100644 --- a/TESTS/DATOS_READONLY/FB2P_FREE.DB2 +++ b/TESTS/DATOS_READONLY/FB2P_FREE.DB2 @@ -2,11 +2,11 @@ * (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.14" SourceFile="C:\DESA\FOXBIN2PRG\TESTS\DATOS_READONLY\FB2P_FREE.DBF" Generated="2013/12/11 21:33:10" /> (Para uso con Visual FoxPro 9.0) +*< FOXBIN2PRG: Version="1.18" SourceFile="C:\DESA\foxbin2prg\TESTS\DATOS_READONLY\fb2p_free.dbf" Generated="2014/01/08 00:49:45" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) * - C:\DESA\FOXBIN2PRG\TESTS\DATOS_READONLY\FB2P_FREE.FPT + 12522013/12/11 diff --git a/TESTS/DATOS_READONLY/bmps/CarpetaAbierta.bmp b/TESTS/DATOS_READONLY/bmps/CarpetaAbierta.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d36d9ad332fec081864359531d9be3f64e75d3e7 GIT binary patch literal 822 zcmchT%MpV>2!_dccXG4@E3g3XR*|;0oSe5M{o!}XDn2qfgaHKnc<49{jhGDZJ?y#K zLprMq-oINK3nKHsq%6F7@*GL&UTu=|2vVL??U9s=Oq!(*DuH4iKv>An0*o)WIp81JS< H;J3;G=G817 literal 0 HcmV?d00001 diff --git a/TESTS/DATOS_READONLY/bmps/CarpetaCerrada.bmp b/TESTS/DATOS_READONLY/bmps/CarpetaCerrada.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0224b18660979180ac0c8fa8d7d13c2a835aa3da GIT binary patch literal 822 zcmcJNy%B&Q429#_dzOyi1P);D6t2ZM)>(%#K8bP&^3%w@02e;;6j-;VC)XDAGh)1> zqsiq7>&Kv>2_pHwJy!J*-$KUh%q>DWqtiWF~pL(c_q_vm5t>WP6wsg#n0+j3Ic3(j@cjdm`?xmkwd*AQJ`DmP!DFWRSGJX>LXWkyZWMpWTzn8Pu z6uxJUrln3P@)Uv%uV(#=S+khcGdh`V(JG>0RbJMo!s~tGZsFE(tOsAzC-uf{bfZ2p!$99fjX8d% Og{M7|JLNjp=JgkV&58m5 literal 0 HcmV?d00001 diff --git a/TESTS/DATOS_READONLY/fb2p_test.pjm b/TESTS/DATOS_READONLY/fb2p_test.pjm new file mode 100644 index 0000000..f155aa8 --- /dev/null +++ b/TESTS/DATOS_READONLY/fb2p_test.pjm @@ -0,0 +1,40 @@ +Version= 1.20 +Author=El autor +Company=La companía +Address=La dirección +City=Ciudad +State=State +Zip=Cod.Post +Country=País +SaveCode=.T. +Debug=.T. +Encrypt=.T. +NoLogo=.F. +CommentStyle=1 +Comments=Comentarios +CompanyName=Company Name +FileDescription=File Description +LegalCopyright=Legal Copyright +LegalTrademarks=Legal Trademark +ProductName=Product Name +Major=1 +Minor=0 +Revision=5 +AutoIncrement=.T. +[OLEServers] +C:\DESA\test2\fb2p_test.exe,fb2p_test,fb2p_test,fb2p_test Type Library,0,{97DF3026-912D-4604-B06D-60EF52C19B70} +cl_form,c:\desa\test2\fb2p_test.vcx,fb2p_test.cl_form,0,mi OLE server DLL,,1,{E888ECF1-F911-4F1B-A5DC-8739057087B1},{63194B79-0E07-44E6-9FC3-2EBCAA27787A} +cl_imagen,c:\desa\test2\fb2p_test.vcx,fb2p_test.cl_imagen,0,otro ole,,1,{BA0AD3CE-E874-402F-A835-85AE1CDCE515},{6B05B62A-2C51-4C45-921F-E09FA0E66CF5} +[OLEServersEnd] +[ProjectFiles] + 0,i,bmps\container.ico,.F.,.F.,0,,, +1132700355,V,fb2p_test.vcx,.F.,.T.,1252,,,clase descrip +1132700357,K,fb2p_frm_1.scx,.F.,.F.,1252,,, +1132700358,K,fb2p_frm_2.scx,.F.,.F.,1252,,, +1132700438,x,bmps\sobrepostal.bmp,.F.,.F.,0,,, +1132700438,x,bmps\scccheckout.bmp,.F.,.F.,0,,, +1132700438,x,bmps\carpetaabierta.bmp,.F.,.F.,0,,, +1132700438,x,bmps\carpetacerrada.bmp,.F.,.F.,0,,, +1132700438,x,bmps\treeview.bmp,.F.,.F.,0,,, +1132700450,T,config\config.fpw,.T.,.F.,1252,,, +[EOF] \ No newline at end of file diff --git a/TESTS/DATOS_READONLY/fb2p_test.pjt b/TESTS/DATOS_READONLY/fb2p_test.pjt index bedf8f9ebffbfa786e06d5733a7098212e45fa3c..b44124a1f975cd60047a274f60422d5140423628 100644 GIT binary patch literal 5676 zcmeHKL2uhO6jqjPL5p_9vK1YM9W?B+iwsG&EW0QMP!yGVRV+bLlMWCd&@%04wM~JN z(*#5R(f(RbyY4X3c5Fv+(+ufhT};@L$oKKRkKdz6N|K~MB}w{`|F>nUfKXtE|C{h> zY@-mwj`zyybag*Ch$9q6VQhoQ3zGl=+v~c&#g3)>iLliCUteA5Cp_GH7Sbt8$uAd; z>vsXTpELS)9NETjLT(>4A+F%us?&(*oy#bfe` zQU4fpooqy8n-nR_@-m}0n1df9>VL+EONMwPLzl%yzYr|H?6 zQ9KI3t@rMozhzl&$eLQ8-DO$lKl9>5AR_DWiUc_$9M)boR4Tf@vP9=Ok=?AvFgstk zR%N-~`lD^yPF>ZTN?X%yrO{LyilsJfrKuvv(4p40O!Y1Ap>eooE*;j=Q8J)xEE>m| z?72uT2st#(h%YxH<%`qj0XxxS&?6g`lG;PFvHIhND>uFl?x_ z%z9fjOtocN8t1}UH|tuvVVP}3MXISZ8i@0EU|rFX1p&}avt@!M>y@}|aX6%XIfP!I$@iU34G0Blh4v(}^fC^~;P3z1@$lM<(d@f`p!0|~&T z5Wwo7Ai7Nm+{*|nFNb&{;yel=gwGLt;k}I3hahZ^XC#X>O;1Srnoi3lLv9p+g$K_H zkne>NaNpyB_87_e*%*(i9=@6DK=}bUn-EsZQp)`E4v%K5 zz<`Yty;fA$LE)kJl3(sEzfX=N>1*IbJZauB^j!EHbPv#ASK42sb6sm5enXNsh{k8+ zlA?BrVwI$}nWP~4-Xe?-(-AI+%$F^3QmjBZVCV4z-uROrczy@jz)ozGKo^Ak>UEPN z;CevoV+1m_oULM9T!S5BLR^DGV!|AQJpF@X!kipid|@OCz7C@CCI=55OveAA z9=!TE`YSjZnBDBWX5Yt&mKGAJC-NLuO~W)xjIps;EVhYBspolI zro(0sVMRUdF15*@GULTffGtuImOXYMNnLGz<;#Ah;JoG{7zgIAtZxvZ>B2 z778wq>JDgs<8VV%c8*o$?}lP1{_PgX_%L<`eNqrOBt?~-4w>y?VU+muX0r9z6YI*zmCI+fa*hfQpgt%Tp|KA|f65&Rx}2mFMrD$NLf7us?`=H80y*2``KW|EWeC=p=?USyj89|fgo zj&1u32Bo@Iw4ozTOWdhdd3h0yQ}7^(q=IzA|AXY;L_O%sdH9Nt2pPB{nvnYe?&fV- delta 554 zcmaiuIZFdU7>0K-dm8UVvq51j1|-$&J?VsXS3|%A9b;o-VUfb4j7MkT6*2gw5d0Bp zVXIhL`U_H8_$Qp*1SLUmU|_y?p7)t~%f4nLGLjw|ev+P3*tUE^9GhkYLCErr5MwMd z5wbjD@Ht*H&`IUB$?hOj;Z9#zL=8UHOf%`*uG>3tQx6j&hPumjoH#q_U2wBUDD25| zaIa$<9rC>VBl7Tfi7d~sIN@_FQ37-9G9CimX3M34inN8yvs{G8&$Az z&a=j^2Kheq970_ms%lQWfE^`nw-lVa93ZJl?4s*Y_)rb;3Oqu?jTi3*&XnVI@oxfwY9eOv=dlX5bXC&x=kh_eM`R;1<> zgVX^rM}A3BzCwOZ>f``s*~yVo+LI-ucqY$~6r1cKE;^Y-Ns|jnyRWc{n^012L2*oS zeqKppW?pKMUS@JW)F|9Cg1MOrKu0JPrxul^7Ad&+_yBDanOr96apq^un0|_E+x8o zhEy@rWN~pxpi^}=^T@U^PUa97n7mFhbMpkbwTzo5u}@$G`o5qjKPx^XKRTmlk+x*MSaDxm9;nwg$aqF}3FWW>uAo|#gT0b(2Ta``3ZrUIEta5I&7xuBY` R7|flLTAW;zS&$6$2LP~3c6ZCbs1;LRYpC zLc)5_uCN9XHz2Nr++A1|++-vYr61CRG#u%sBjP!_7f!p&$u|KS>`T#5`V74pPS9-M zS$8A;Q}CmVWQslyo~EPWBpnGP=|;cWfr5*srPJ-s6ulu{qFbHU_+583T@~HQzGcCc z20jWjm7b*o@vk(RB=mEl$n$ocQnYz~cV5v;^t$NZyLfby`$kC2dAs`{vKbl@d0*>E zIXk!b`ZDWZ_=L4hHb&U^<8aOQ_5vt?iU_?Gf@s?7NA(mMg7M-cr5a!oYPe0Wrm|d`}qc2tbnfRAw_^LiGhHwu%tuqZLfDo^fVGoH-Nnkd>S#Q+ASKw4cI!Y-fO$SN)= z2;|8Du^m(tBzG66>hkChbVWHWnj1}JXw*|cJeU}J~1sIR}_f#lTAcacXka z0bK_IE*wB1DW+TyB?k(QP$xfUw-9I`n46hAVuvVX0BU#-Wv>^7h_L|8ln{o>1F17W z`I|s21Px@6%sL={4?8H{nC7wrEm30X0Z|~kxHTdp3@v=T3@jnmSsEIcZd8I8$E6JP h9h7}l38+C#Y&MX)0xASi1PpVf$sah)nQA~PoB#^iUw!}p delta 595 zcmX>qc2tbnfR|?@^LiGh9`?ywSd=E8;WC}f&6+4WQHlW!YJs%AG=yD0xsg>|QWD5h z17bI*C`j%pP}S$j8(B@b&O!Apm72`RY&F@Rm2a{+n=zxz#3C0U-L3#(gGd{oyeANwBZ=urO+LkC&Lk@}`5;@k9N1JdbJKER zh%P~(>Sic=xg^jjVq#f9?k^^YG>nW9p6tjfJGq{nPidkg149iEX995$5IX~LmmEYP zt1M7le6k{|?c_J?d}2Z33=FnFtO>+|K+FWh+M-bZ@~gNzo46So!dxUJ%D})1#6LtB z7@h&~bs&xvfd!7LQ-Gm+7(%rVP}UrXwSZUxh&h3Hk}z2H4K7VCU#OQ' + #DEFINE C_FB2P_VALUE_F '' + #DEFINE CR_LF CHR(13) + CHR(10) + #DEFINE C_CR CHR(13) + #DEFINE C_LF CHR(10) + #DEFINE C_TAB CHR(9) + #DEFINE C_PROC 'PROCEDURE' + #DEFINE C_ENDPROC 'ENDPROC' + #DEFINE C_TEXT 'TEXT' + #DEFINE C_ENDTEXT 'ENDTEXT' + #DEFINE C_IF_F '#IF .F.' + #DEFINE C_ENDIF '#ENDIF' + #DEFINE C_DEFINE_CLASS 'DEFINE CLASS' + #DEFINE C_ENDDEFINE_CLASS 'ENDDEFINE' + icObj = NULL + + + ******************************************************************************************************************************************* + FUNCTION SETUP + PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + *LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + SET PROCEDURE TO 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + oFXU_LIB = CREATEOBJECT('CL_FXU_CONFIG') + oFXU_LIB.setup_comun() + + *THIS.icObj = NEWOBJECT("c_conversor_base", "FOXBIN2PRG.PRG") + *loObj = THIS.icObj + *loObj.l_Test = .F. + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION TearDown + #IF .F. + PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + #ENDIF + THIS.icObj = NULL + + IF VARTYPE(oFXU_LIB) = "O" + oFXU_LIB.teardown_comun() + oFXU_LIB = NULL + ENDIF + RELEASE PROCEDURE 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Evaluate_results + LPARAMETERS toEx AS EXCEPTION, tnCodError_Esperado + + #IF .F. + PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + #ENDIF + + IF PCOUNT() = 0 + THIS.messageout( "* Support method, not a valid test." ) + RETURN .T. + ENDIF + + + IF ISNULL(toEx) + *-- Validaciones en método + ELSE + *-- Evaluación de errores + THIS.messageout( "Error " + TRANSFORM(toEx.ERRORNO) + ', ' + TRANSFORM(toEx.MESSAGE) ) + THIS.messageout( toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) ) + IF NOT INLIST( toEx.ERRORNO, 1098, 2071 ) && Error del usuario (ERROR y THROW) + THIS.messageout( TRANSFORM(toEx.LINECONTENTS) ) + ENDIF + + THIS.assertequals( tnCodError_Esperado, toEx.ERRORNO, 'Error' ) + ENDIF + + THIS.messageout( '' ) + THIS.messageout( REPLICATE('*',80) ) + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_Ejecutar_FOXBIN2PRG_ParaElArchivo_MENU1_MN2_YRegenerarEl_MNX_ConTodosSusObjetos + LOCAL lnCodError, lnCodError_Esperado ; + , lc_File, lc_InputFile, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado, loReg, lcTipoBinario ; + , laCampos_IN(1,18), laCampos_OUT(1,18), lnFields_OUT, lnFields_IN, I, X, lcMN2, lcMN3, lnLenHeader ; + , loModulo AS CL_CLASE OF "FOXBIN2PRG.PRG" ; + , 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 + loCnv = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG") + + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lc_File = 'MENU1.MNX' + lc_InputFile = FORCEPATH( lc_File, 'TESTS\DATOS_READONLY' ) + lc_OutputFile = FORCEPATH( lc_File, 'TESTS\DATOS_TEST' ) + lcTipoBinario = UPPER( JUSTEXT( lc_OutputFile ) ) + + oFXU_LIB.copiarArchivosParaTest( FORCEEXT(lc_File,'*') ) + + *-- Genero el DC2 + loCnv.Ejecutar( FORCEEXT(lc_File,'MNX'), '', '', '', '1', '0', '1',.F.,.F.,.T. ) + *-- Regenero el DBC + loCnv.Ejecutar( FORCEEXT(lc_File,'MN2'), '', '', '', '1', '0', '1',.F.,.F.,.T. ) + *-- Renombro el DC2 a DC3 (ORIGINAL) + RENAME (FORCEEXT(lc_OutputFile,'MN2')) TO (FORCEEXT(lc_OutputFile,'MN3')) + *-- Genero el DC2 desde el DBC regenerado + loCnv.Ejecutar( FORCEEXT(lc_File,'MNX'), '', '', '', '1', '0', '1',.F.,.F.,.T. ) + *-- Comparo los MN2 y MN3 + lnLenHeader = LEN( loCnv.get_PROGRAM_HEADER() ) + lcMN2 = SUBSTR( FILETOSTR( FORCEEXT(lc_File,'MN2') ), lnLenHeader ) + lcMN3 = SUBSTR( FILETOSTR( FORCEEXT(lc_File,'MN3') ), lnLenHeader ) + + + *-- Visualización de valores + THIS.messageout( 'Bytes MN3: ' + TRANSFORM(LEN(lcMN3)) ) + THIS.messageout( 'Bytes MN2: ' + TRANSFORM(LEN(lcMN2)) ) + + + *-- Evaluación de valores + this.assertequals( lcMN2, lcMN3, '[Comparación MN2 y MN3]' ) + + + CATCH TO loEx + THIS.Evaluate_results( loEx, lnCodError_Esperado ) + + FINALLY + USE IN (SELECT("ARCHIVOBIN_IN")) + USE IN (SELECT("TABLABIN")) + ENDTRY + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_Ejecutar_FOXBIN2PRG_ParaElArchivo_MENU2_MN2_YRegenerarEl_MNX_ConTodosSusObjetos + LOCAL lnCodError, lnCodError_Esperado ; + , lc_File, lc_InputFile, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado, loReg, lcTipoBinario ; + , laCampos_IN(1,18), laCampos_OUT(1,18), lnFields_OUT, lnFields_IN, I, X, lcMN2, lcMN3, lnLenHeader ; + , loModulo AS CL_CLASE OF "FOXBIN2PRG.PRG" ; + , 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 + loCnv = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG") + + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lc_File = 'MENU2.MNX' + lc_InputFile = FORCEPATH( lc_File, 'TESTS\DATOS_READONLY' ) + lc_OutputFile = FORCEPATH( lc_File, 'TESTS\DATOS_TEST' ) + lcTipoBinario = UPPER( JUSTEXT( lc_OutputFile ) ) + + oFXU_LIB.copiarArchivosParaTest( FORCEEXT(lc_File,'*') ) + + *-- Genero el DC2 + loCnv.Ejecutar( FORCEEXT(lc_File,'MNX'), '', '', '', '1', '0', '1',.F.,.F.,.T. ) + *-- Regenero el DBC + loCnv.Ejecutar( FORCEEXT(lc_File,'MN2'), '', '', '', '1', '0', '1',.F.,.F.,.T. ) + *-- Renombro el DC2 a DC3 (ORIGINAL) + RENAME (FORCEEXT(lc_OutputFile,'MN2')) TO (FORCEEXT(lc_OutputFile,'MN3')) + *-- Genero el DC2 desde el DBC regenerado + loCnv.Ejecutar( FORCEEXT(lc_File,'MNX'), '', '', '', '1', '0', '1',.F.,.F.,.T. ) + *-- Comparo los MN2 y MN3 + lnLenHeader = LEN( loCnv.get_PROGRAM_HEADER() ) + lcMN2 = SUBSTR( FILETOSTR( FORCEEXT(lc_File,'MN2') ), lnLenHeader ) + lcMN3 = SUBSTR( FILETOSTR( FORCEEXT(lc_File,'MN3') ), lnLenHeader ) + + + *-- Visualización de valores + THIS.messageout( 'Bytes MN3: ' + TRANSFORM(LEN(lcMN3)) ) + THIS.messageout( 'Bytes MN2: ' + TRANSFORM(LEN(lcMN2)) ) + + + *-- Evaluación de valores + this.assertequals( lcMN2, lcMN3, '[Comparación MN2 y MN3]' ) + + + CATCH TO loEx + THIS.Evaluate_results( loEx, lnCodError_Esperado ) + + FINALLY + USE IN (SELECT("ARCHIVOBIN_IN")) + USE IN (SELECT("TABLABIN")) + ENDTRY + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_Ejecutar_FOXBIN2PRG_ParaElArchivo_MENU3_MN2_YRegenerarEl_MNX_ConTodosSusObjetos + LOCAL lnCodError, lnCodError_Esperado ; + , lc_File, lc_InputFile, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado, loReg, lcTipoBinario ; + , laCampos_IN(1,18), laCampos_OUT(1,18), lnFields_OUT, lnFields_IN, I, X, lcMN2, lcMN3, lnLenHeader ; + , loModulo AS CL_CLASE OF "FOXBIN2PRG.PRG" ; + , 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 + loCnv = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG") + + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lc_File = 'MENU3.MNX' + lc_InputFile = FORCEPATH( lc_File, 'TESTS\DATOS_READONLY' ) + lc_OutputFile = FORCEPATH( lc_File, 'TESTS\DATOS_TEST' ) + lcTipoBinario = UPPER( JUSTEXT( lc_OutputFile ) ) + + oFXU_LIB.copiarArchivosParaTest( FORCEEXT(lc_File,'*') ) + + *-- Genero el DC2 + loCnv.Ejecutar( FORCEEXT(lc_File,'MNX'), '', '', '', '1', '0', '1',.F.,.F.,.T. ) + *-- Regenero el DBC + loCnv.Ejecutar( FORCEEXT(lc_File,'MN2'), '', '', '', '1', '0', '1',.F.,.F.,.T. ) + *-- Renombro el DC2 a DC3 (ORIGINAL) + RENAME (FORCEEXT(lc_OutputFile,'MN2')) TO (FORCEEXT(lc_OutputFile,'MN3')) + *-- Genero el DC2 desde el DBC regenerado + loCnv.Ejecutar( FORCEEXT(lc_File,'MNX'), '', '', '', '1', '0', '1',.F.,.F.,.T. ) + *-- Comparo los MN2 y MN3 + lnLenHeader = LEN( loCnv.get_PROGRAM_HEADER() ) + lcMN2 = SUBSTR( FILETOSTR( FORCEEXT(lc_File,'MN2') ), lnLenHeader ) + lcMN3 = SUBSTR( FILETOSTR( FORCEEXT(lc_File,'MN3') ), lnLenHeader ) + + + *-- Visualización de valores + THIS.messageout( 'Bytes MN3: ' + TRANSFORM(LEN(lcMN3)) ) + THIS.messageout( 'Bytes MN2: ' + TRANSFORM(LEN(lcMN2)) ) + + + *-- Evaluación de valores + this.assertequals( lcMN2, lcMN3, '[Comparación MN2 y MN3]' ) + + + CATCH TO loEx + THIS.Evaluate_results( loEx, lnCodError_Esperado ) + + FINALLY + USE IN (SELECT("ARCHIVOBIN_IN")) + USE IN (SELECT("TABLABIN")) + ENDTRY + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_Ejecutar_FOXBIN2PRG_ParaElArchivo_MENU_SHORTCUT_MN2_YRegenerarEl_MNX_ConTodosSusObjetos + LOCAL lnCodError, lnCodError_Esperado ; + , lc_File, lc_InputFile, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado, loReg, lcTipoBinario ; + , laCampos_IN(1,18), laCampos_OUT(1,18), lnFields_OUT, lnFields_IN, I, X, lcMN2, lcMN3, lnLenHeader ; + , loModulo AS CL_CLASE OF "FOXBIN2PRG.PRG" ; + , 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 + loCnv = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG") + + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lc_File = 'MENU_SHORTCUT.MNX' + lc_InputFile = FORCEPATH( lc_File, 'TESTS\DATOS_READONLY' ) + lc_OutputFile = FORCEPATH( lc_File, 'TESTS\DATOS_TEST' ) + lcTipoBinario = UPPER( JUSTEXT( lc_OutputFile ) ) + + oFXU_LIB.copiarArchivosParaTest( FORCEEXT(lc_File,'*') ) + + *-- Genero el DC2 + loCnv.Ejecutar( FORCEEXT(lc_File,'MNX'), '', '', '', '1', '0', '1',.F.,.F.,.T. ) + *-- Regenero el DBC + loCnv.Ejecutar( FORCEEXT(lc_File,'MN2'), '', '', '', '1', '0', '1',.F.,.F.,.T. ) + *-- Renombro el DC2 a DC3 (ORIGINAL) + RENAME (FORCEEXT(lc_OutputFile,'MN2')) TO (FORCEEXT(lc_OutputFile,'MN3')) + *-- Genero el DC2 desde el DBC regenerado + loCnv.Ejecutar( FORCEEXT(lc_File,'MNX'), '', '', '', '1', '0', '1',.F.,.F.,.T. ) + *-- Comparo los MN2 y MN3 + lnLenHeader = LEN( loCnv.get_PROGRAM_HEADER() ) + lcMN2 = SUBSTR( FILETOSTR( FORCEEXT(lc_File,'MN2') ), lnLenHeader ) + lcMN3 = SUBSTR( FILETOSTR( FORCEEXT(lc_File,'MN3') ), lnLenHeader ) + + + *-- Visualización de valores + THIS.messageout( 'Bytes MN3: ' + TRANSFORM(LEN(lcMN3)) ) + THIS.messageout( 'Bytes MN2: ' + TRANSFORM(LEN(lcMN2)) ) + + + *-- Evaluación de valores + this.assertequals( lcMN2, lcMN3, '[Comparación MN2 y MN3]' ) + + + CATCH TO loEx + THIS.Evaluate_results( loEx, lnCodError_Esperado ) + + FINALLY + USE IN (SELECT("ARCHIVOBIN_IN")) + USE IN (SELECT("TABLABIN")) + ENDTRY + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_Ejecutar_FOXBIN2PRG_ParaElArchivo_MENU_SHORTCUT2_MN2_YRegenerarEl_MNX_ConTodosSusObjetos + LOCAL lnCodError, lnCodError_Esperado ; + , lc_File, lc_InputFile, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado, loReg, lcTipoBinario ; + , laCampos_IN(1,18), laCampos_OUT(1,18), lnFields_OUT, lnFields_IN, I, X, lcMN2, lcMN3, lnLenHeader ; + , loModulo AS CL_CLASE OF "FOXBIN2PRG.PRG" ; + , 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 + loCnv = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG") + + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lc_File = 'MENU_SHORTCUT2.MNX' + lc_InputFile = FORCEPATH( lc_File, 'TESTS\DATOS_READONLY' ) + lc_OutputFile = FORCEPATH( lc_File, 'TESTS\DATOS_TEST' ) + lcTipoBinario = UPPER( JUSTEXT( lc_OutputFile ) ) + + oFXU_LIB.copiarArchivosParaTest( FORCEEXT(lc_File,'*') ) + + *-- Genero el DC2 + loCnv.Ejecutar( FORCEEXT(lc_File,'MNX'), '', '', '', '1', '0', '1',.F.,.F.,.T. ) + *-- Regenero el DBC + loCnv.Ejecutar( FORCEEXT(lc_File,'MN2'), '', '', '', '1', '0', '1',.F.,.F.,.T. ) + *-- Renombro el DC2 a DC3 (ORIGINAL) + RENAME (FORCEEXT(lc_OutputFile,'MN2')) TO (FORCEEXT(lc_OutputFile,'MN3')) + *-- Genero el DC2 desde el DBC regenerado + loCnv.Ejecutar( FORCEEXT(lc_File,'MNX'), '', '', '', '1', '0', '1',.F.,.F.,.T. ) + *-- Comparo los MN2 y MN3 + lnLenHeader = LEN( loCnv.get_PROGRAM_HEADER() ) + lcMN2 = SUBSTR( FILETOSTR( FORCEEXT(lc_File,'MN2') ), lnLenHeader ) + lcMN3 = SUBSTR( FILETOSTR( FORCEEXT(lc_File,'MN3') ), lnLenHeader ) + + + *-- Visualización de valores + THIS.messageout( 'Bytes MN3: ' + TRANSFORM(LEN(lcMN3)) ) + THIS.messageout( 'Bytes MN2: ' + TRANSFORM(LEN(lcMN2)) ) + + + *-- Evaluación de valores + this.assertequals( lcMN2, lcMN3, '[Comparación MN2 y MN3]' ) + + + CATCH TO loEx + THIS.Evaluate_results( loEx, lnCodError_Esperado ) + + FINALLY + USE IN (SELECT("ARCHIVOBIN_IN")) + USE IN (SELECT("TABLABIN")) + ENDTRY + + ENDFUNC + + +ENDDEFINE diff --git a/foxbin2prg.pj2 b/foxbin2prg.pj2 index d218fe5..ddbac99 100644 --- a/foxbin2prg.pj2 +++ b/foxbin2prg.pj2 @@ -2,7 +2,7 @@ * (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.18" SourceFile="C:\DESA\foxbin2prg\foxbin2prg.pjx" Generated="2014/01/07 00:46:40" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) +*< FOXBIN2PRG: Version="1.18" SourceFile="C:\DESA\foxbin2prg\foxbin2prg.pjx" Generated="2014/01/08 00:50:45" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) * LPARAMETERS tcDir @@ -10,7 +10,7 @@ lcCurdir = SYS(5)+CURDIR() CD ( EVL( tcDir, JUSTPATH( SYS(16) ) ) ) * -_Autor = "Fernando D. Bozzo" +_Author = "Fernando D. Bozzo" _Company = "" _Address = "" _City = "Coslada" @@ -26,7 +26,7 @@ _LegalTrademark = "Open Source" _ProductName = " FOXBIN2PRG" _MajorVer = "1" _MinorVer = "18" -_Revision = " 177" +_Revision = " 183" _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="1143388948" ID="1130644423" ObjRev="544" /> + .ADD('foxbin2prg.prg') && *< FileMetadata: Type="P" Cpid="1252" Timestamp="1143473629" ID="1130644423" ObjRev="544" /> * .ITEM('__newproject.f2b').Remove() diff --git a/foxbin2prg.pjt b/foxbin2prg.pjt index fe04924089ea5b69e00cfa389df28ebacd4c797c..bdadb92762cf405ae3fed13ffb67220c64ad31a7 100644 GIT binary patch delta 18976 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 Y%J3f@@Bz1#%uw+kIEg=Sdg{;r1MEMD9RL6T delta 14434 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%0A=eAZp}rIBud8-kNzKgCDaA@#5` zf_FKXXb^(KG2k5Vx3KqlnP?k$2KctOi9QH2(KGNS@G#gjLroN3A3-R1Z8a11s%@g- z;3Dw&d_b%ECfWqS8GHE2W+n=1ZX#0yG$FVE_T&~Oat8Z=JzJWnVuXo&!GYj)u!puX zQFU-t@Cw+caMc4>1NVqD(ND1^Y66Z2C$~3|SGBG0|UL zO>`N&5Io`|6IDjIYu6A>4sKyFQS*K#`Vhi`7K48sj|< zJPvmFK@%MTPXYIUJ@c@Mx-~%;X#TKwA2rb@U@fM21pCMt6O9IM1@HeA_AL{g1y}UP z`o9cN|FMbUo8svZRCI;?0j}@B5#SreCR&E?cdg)&;6Gpod)rY!GXxOe6xfIB*wF!S z9D<5_u+y5^(U|7gSHNGvuF%GgPJ`Eio5D^=u%l`%i2lllFa$6N*H{R5!GT@vC>Gal z@O^L|>_b_0R0xhlQ1TD#Yk79ms3lPv*mZy%%^Yb*AA`4of7I-Wc614R75o+KAv5gA zGXkq3f|yxz?dXdIb~FQ=9|GaGHbmbnBdU+njuddja-3eQ#+uC$Jbm}mv+^raWXNRR4dLG6L;EC5Ta9Av-$_UG~MJ5L9-JR2N#B{SUhd%>n zBBm=qOgAuq=nHTjLb~k;={TN#1b8??x|#^-R)9x=@57EmNOvhHAA36lSHyHH5Yu&s zJpor=#B@6l)9r;l8P^EJbWw=u91${21>c1|4k247umm^UhX@HF*l6%v@C(?+(}H$_ zSAy5Uo_q%R5izX?H^Cu6H$+sy`4Fx_aJq}|3L(`d@Lh1iL(~`{)HyImA-}>-ekmvv z5sw|1bwj#|c>fdtkTv1;R>vI=>uOZ}1s# zH|%cJv72RrwMh0H?4#I>Zh{G|GUjU|6=L(T$L3-H4_RcS_p!N*1^a<3?lMvv>?PsY zD}uq#U_Zj%uo4^wUU<<+rYBhc8(^)EfUx?a5fnyMaexZT}u? z`QP9k;H0W1io?>~2TOMrm^CobEv%%Mz@xx(aIRe&E9YLUq+f$C!j?TuR0}KPT=086 zP1HIWOJ#cqOCUUg{To)Qcd+tp1y4I`qTX1De!@!i6L>l7(O4%IVj(&U-lnY?nAcOV gE);|J!k&bA-6KMduVm$*vVZpc4|B`%Hvj+t diff --git a/foxbin2prg.pjx b/foxbin2prg.pjx index 09c4ecc75e0359d74d45e0df50e5f111bb2addf7..fde884274a9e9f45329c48acfcbe132c839ed8ad 100644 GIT binary patch delta 71 zcmZ3_vz~{=fRB-5Bg;+}R&!%BOUucJSnMaWvT07%Vx6XJ0u(Z`WPk#<5CsJ{1t2gr PF#!qb0ddvj$E-d8CE5-U delta 73 zcmZ3_vz~{=fRB-VBg;+}Rs#zIBa_L8SnL_ACbO|=Ox9wZrfh6sVQFH)00nL#3JPut SKwxTO0us^#;{M5xS$zOTG7gjg diff --git a/foxbin2prg.prg b/foxbin2prg.prg index 955b108..0f9e0d5 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -72,6 +72,7 @@ * 14/12/2013 Fidel Charny REPORTE BUG scx v1.13: La regeneración de los forms (SCX) no regenera el último registro COMMENT (arreglado en v.1.14) * 01/01/2014 Fidel Charny REPORTE BUG mnx v1.16: El menú no siempre respeta la posición original LOCATION y a veces se genera mal el MNX (se arregla en v1.17) * 05/01/2014 Fidel Charny REPORTE BUG mnx v1.17: Se genera cláusula "DO" o llamada Command cuando no Procedure ni Command que llamar // Diferencia de Case en NAME (se arregla en v1.18) +* 07/01/2014 F.D.Bozzo BUG vcx/scx v1.18: Los *métodos deben ir siempre al final en el Reserved3, si no los eventos ACCESS no se disparan * * *--------------------------------------------------------------------------------------------------- @@ -439,7 +440,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM DO CASE CASE INLIST( lcExt_1, THIS.c_PJ2, THIS.c_VC2, THIS.c_SC2, THIS.c_FR2 ; - , THIS.c_LB2, THIS.c_DB2, THIS.c_DC2, THIS.c_MN2 ) + , THIS.c_LB2, THIS.c_DB2, THIS.c_DC2, THIS.c_MN2, 'PJM' ) *-- Extensiones TEXTO CASE lcExt_1 = 'DBF' @@ -687,14 +688,23 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' loFSO = THIS.o_FSO .c_InputFile = FULLPATH( tc_InputFile ) + IF ADIR( laDirFile, .c_InputFile, '', 1 ) = 0 ERROR 'No se encontró el archivo [' + .c_InputFile + ']' ENDIF + .c_InputFile = loFSO.GetAbsolutePathName( FORCEPATH( laDirFile(1,1), JUSTPATH(.c_InputFile) ) ) + IF NOT EMPTY(tcOriginalFileName) tcOriginalFileName = loFSO.GetAbsolutePathName( tcOriginalFileName ) ENDIF + .c_OriginalFileName = EVL( tcOriginalFileName, .c_InputFile ) + + IF UPPER( JUSTEXT(.c_OriginalFileName) ) = 'PJM' + .c_OriginalFileName = FORCEEXT(.c_OriginalFileName,'pjx') + ENDIF + THIS.writeLog( 'c_InputFile=' + .c_InputFile ) .o_Conversor = NULL @@ -724,6 +734,10 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM .c_OutputFile = FORCEEXT( .c_InputFile, .c_PJ2 ) .o_Conversor = CREATEOBJECT( 'c_conversor_pjx_a_prg' ) + CASE lcExtension = 'PJM' + .c_OutputFile = FORCEEXT( .c_InputFile, .c_PJ2 ) + .o_Conversor = CREATEOBJECT( 'c_conversor_pjm_a_prg' ) + CASE lcExtension = 'FRX' .c_OutputFile = FORCEEXT( .c_InputFile, .c_FR2 ) .o_Conversor = CREATEOBJECT( 'c_conversor_frx_a_prg' ) @@ -791,7 +805,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM .o_Conversor.l_MethodSort_Enabled = .l_MethodSort_Enabled .o_Conversor.l_PropSort_Enabled = .l_PropSort_Enabled .o_Conversor.l_ReportSort_Enabled = .l_ReportSort_Enabled - .o_Conversor.c_OriginalFileName = tcOriginalFileName + .o_Conversor.c_OriginalFileName = .c_OriginalFileName .o_Conversor.c_Foxbin2prg_FullPath = .c_Foxbin2prg_FullPath *-- .o_Conversor.Convertir( @toModulo, .F., THIS ) @@ -2010,6 +2024,8 @@ DEFINE CLASS c_conversor_base AS SESSION lcPropName = 'A590' + lcPropName CASE lcPropName == 'Dockable' lcPropName = 'A595' + lcPropName + CASE lcPropName == '_memberdata' + lcPropName = 'A995' + lcPropName CASE lcPropName == 'Name' lnPropType = 1 && System "Name" property lcPropName = 'A999' + lcPropName @@ -2041,7 +2057,7 @@ DEFINE CLASS c_conversor_base AS SESSION EXTERNAL ARRAY taPropsAndValues TRY - LOCAL I, X, lnArrayCols, laPropsAndValues(1,2), lcPropName + LOCAL I, X, lnArrayCols, laPropsAndValues(1,2), lcPropName, lcSortedMemo, lcMethods lnArrayCols = ALEN( taPropsAndValues, 2 ) DIMENSION laPropsAndValues( tnPropsAndValues_Count, lnArrayCols ) ACOPY( taPropsAndValues, laPropsAndValues ) @@ -2052,11 +2068,6 @@ DEFINE CLASS c_conversor_base AS SESSION * - 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) IF m.tnSortType = 2 laPropsAndValues(I,1) = 'B' + JUSTSTEM(laPropsAndValues(I,1)) + '.' ; + .sortPropsAndValues_SetAndGetSCXPropNames( 'SETNAME', JUSTEXT(laPropsAndValues(I,1)) ) @@ -2064,11 +2075,6 @@ DEFINE CLASS c_conversor_base AS SESSION laPropsAndValues(I,1) = 'B' + laPropsAndValues(I,1) ENDIF ELSE - *IF m.tnSortType = 2 AND laPropsAndValues(I,1) == 'Name' - * laPropsAndValues(I,1) = CHR(255) + 'Name' - *ENDIF - - *laPropsAndValues(I,1) = 'A' + laPropsAndValues(I,1) IF m.tnSortType = 2 laPropsAndValues(I,1) = .sortPropsAndValues_SetAndGetSCXPropNames( 'SETNAME', laPropsAndValues(I,1) ) ELSE @@ -2083,8 +2089,6 @@ DEFINE CLASS c_conversor_base AS SESSION FOR I = 1 TO m.tnPropsAndValues_Count - *taPropsAndValues(I,1) = SUBSTR( laPropsAndValues(I,1), 2 ) && Quitar el carácter agregado - *-- Quitar caracteres agregados antes del SORT IF '.' $ laPropsAndValues(I,1) IF m.tnSortType = 2 @@ -2106,15 +2110,6 @@ DEFINE CLASS c_conversor_base AS SESSION IF lnArrayCols >= 3 taPropsAndValues(I,3) = laPropsAndValues(I,3) ENDIF - - *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 @@ -2156,20 +2151,6 @@ DEFINE CLASS c_conversor_base AS SESSION ENDIF ENDWITH && THIS AS C_CONVERSOR_BASE OF 'FOXBIN2PRG.PRG' - *-- 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É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 @@ -2529,7 +2510,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , LOCAL ; , KEY ) ; VALUES ; - ( UPPER(THIS.c_OutputFile) ; + ( UPPER(EVL(THIS.c_OriginalFileName,THIS.c_OutputFile)) ; , 'H' ; , 0 ; , '' + CHR(0) ; @@ -3045,6 +3026,10 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ******************************************************************************************************************* PROCEDURE defined_PAM2Memo + *-------------------------------------------------------------------------------------------------------------- + * PARÁMETROS: (!=Obligatorio | ?=Opcional) (@=Pasar por referencia | v=Pasar por valor) (IN/OUT) + * toClase (!@ IN ) Objeto de la Clase + *-------------------------------------------------------------------------------------------------------------- LPARAMETERS toClase RETURN toClase._Defined_PAM ENDPROC @@ -3409,6 +3394,18 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ******************************************************************************************************************* PROCEDURE analizarBloque_DEFINED_PAM + *-------------------------------------------------------------------------------------------------------------- + * 07/01/2014 FDBOZZO Los *métodos deben ir siempre al final, si no los eventos ACCESS no se ejecutan! + *-------------------------------------------------------------------------------------------------------------- + * PARÁMETROS: (!=Obligatorio | ?=Opcional) (@=Pasar por referencia | v=Pasar por valor) (IN/OUT) + * toClase (!@ IN ) Objeto de la Clase + * tcLine (!@ IN ) Línea de datos en evaluación + * taCodeLines (!@ IN ) El array con las líneas del código de texto donde buscar + * tnCodeLines (!@ IN ) Cantidad de líneas de código + * I (!@ IN ) Número de línea en evaluación + *-------------------------------------------------------------------------------------------------------------- + LPARAMETERS toClase, tcLine, taCodeLines, tnCodeLines, I + *-- ESTRUCTURA A ANALIZAR: * *m: *metodovacio_con_comentarios && Este método no tiene código, pero tiene comentarios. A ver que pasa! @@ -3419,18 +3416,17 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base *a: ^array_2_d[1,2] && Array una dimension (1,2) *p: _memberdata && XML Metadata for customizable properties * - LPARAMETERS toClase, tcLine, taCodeLines, tnCodeLines, I #IF .F. LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' #ENDIF TRY - LOCAL llBloqueEncontrado, lcDefinedPAM, lnPos, lnPos2, lcPAM_Name + LOCAL llBloqueEncontrado, lcDefinedPAM, lnPos, lnPos2, lcPAM_Name, lcItem, lcMethods IF LEFT( tcLine, C_LEN_DEFINED_PAM_I) == C_DEFINED_PAM_I llBloqueEncontrado = .T. - lcDefinedPAM = '' + STORE '' TO lcDefinedPAM, lcItem, lcMethods WITH THIS FOR I = I + 1 TO tnCodeLines @@ -3448,21 +3444,32 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base IF lnPos2 > 0 *-- Con comentarios lcPAM_Name = RTRIM( SUBSTR( tcLine, lnPos+1, lnPos2 - lnPos - 1 ), 0, ' ', CHR(9) ) - lcDefinedPAM = lcDefinedPAM ; - + lcPAM_Name + ' ' + SUBSTR( tcLine, lnPos2 + 3 ) ; - + CR_LF + lcItem = lcPAM_Name + ' ' + SUBSTR( tcLine, lnPos2 + 3 ) + CR_LF + + *-- Separo propiedades y métodos + IF LEFT(lcItem,1) == '*' + lcMethods = lcMethods + lcItem + ELSE + lcDefinedPAM = lcDefinedPAM + lcItem + ENDIF ELSE *-- Sin comentarios lcPAM_Name = RTRIM( SUBSTR( tcLine, lnPos+1 ), 0, ' ', CHR(9) ) - lcDefinedPAM = lcDefinedPAM ; - + lcPAM_Name + IIF(ISALPHA(lcPAM_Name), '', ' ') ; - + CR_LF + lcItem = lcPAM_Name + IIF(ISALPHA(lcPAM_Name), '', ' ') + CR_LF + + *-- Separo propiedades y métodos + IF LEFT(lcItem,1) == '*' + lcMethods = lcMethods + lcItem + ELSE + lcDefinedPAM = lcDefinedPAM + lcItem + ENDIF ENDIF ENDCASE ENDFOR ENDWITH && THIS - toClase._Defined_PAM = lcDefinedPAM + *-- Junto propiedades y los métodos al final. + toClase._Defined_PAM = lcDefinedPAM + lcMethods I = I - 1 ENDIF @@ -6489,7 +6496,6 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base * 29/11/2013 FDBOZZO En un pageframe, si las props.nativas del mismo no están antes que las de * los objetos contenidos, causa un error. Se deben ordenar primero las * props.nativas (sin punto) y luego las de los objetos (con punto) - * *--------------------------------------------------------------------------------------------------- * PARÁMETROS: (!=Obligatorio | ?=Opcional) (@=Pasar por referencia | v=Pasar por valor) (IN/OUT) * tcMemo (v! IN ) Contenido de un campo MEMO @@ -6577,7 +6583,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base *-- Agregar propiedades primero FOR I = 1 TO m.tnPropsAndValues_Count *-- SI HACE FALTA QUE LOS MÉTODOS ESTÉN AL FINAL, DESCOMENTAR ESTO (Y EL DE MÁS ARRIBA) - *IF LEFT(taPropsAndValues(I), 1) == '*' && Only Reserved3 have this + *IF LEFT(taPropsAndValues(I,1), 1) == '*' && Only Reserved3 have this * lcMethods = m.lcMethods + m.taPropsAndValues(I,1) + ' = ' + m.taPropsAndValues(I,2) + CR_LF * LOOP *ENDIF @@ -8413,6 +8419,376 @@ DEFINE CLASS c_conversor_pjx_a_prg AS c_conversor_bin_a_prg ENDDEFINE +DEFINE CLASS c_conversor_pjm_a_prg AS c_conversor_bin_a_prg + #IF .F. + LOCAL THIS AS c_conversor_pjm_a_prg OF 'FOXBIN2PRG.PRG' + #ENDIF + + + PROCEDURE Convertir + *--------------------------------------------------------------------------------------------------- + * PARÁMETROS: (!=Obligatorio | ?=Opcional) (@=Pasar por referencia | v=Pasar por valor) (IN/OUT) + * toModulo (@! OUT) Objeto generado de clase CL_PROJECT con la información leida del texto + * toEx (@! OUT) Objeto con información del error + * toFoxbin2prg (v! IN ) Referencia al objeto principal + *--------------------------------------------------------------------------------------------------- + LPARAMETERS toModulo, toEx AS EXCEPTION, toFoxbin2prg + #IF .F. + LOCAL toFoxbin2prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' + #ENDIF + DODEFAULT( @toModulo, @toEx ) + + TRY + LOCAL lnCodError, lcStr, lnPos, lnLen, lnServerCount, loReg, lcDevInfo, lnLen ; + , lcStrPJM, laLines(1), laProps(1) ; + , loEx AS EXCEPTION ; + , loProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' ; + , loServerHead AS CL_PROJ_SRV_HEAD OF 'FOXBIN2PRG.PRG' ; + , loServerData AS CL_PROJ_SRV_DATA OF 'FOXBIN2PRG.PRG' + + STORE NULL TO loProject, loReg, loServerHead, loServerData + lcStrPJM = FILETOSTR( THIS.c_InputFile ) + loServerHead = CREATEOBJECT('CL_PROJ_SRV_HEAD') + + + *-- Obtengo los archivos del proyecto + loProject = CREATEOBJECT('CL_PROJECT') + + WITH loProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' + *-- Proj.Info + ._CmntStyle = STREXTRACT( lcStrPJM, 'CommentStyle=', CR_LF ) + ._Debug = STREXTRACT( lcStrPJM, 'Debug=', CR_LF ) + ._Encrypted = STREXTRACT( lcStrPJM, 'Encrypt=', CR_LF ) + ._HomeDir = ['] + LOWER( JUSTPATH( SYS(5)+CURDIR() ) ) + ['] + ._ID = '' + ._NoLogo = STREXTRACT( lcStrPJM, 'NoLogo=', CR_LF ) + ._ObjRev = 0 + ._ProjectHookClass = '' + ._ProjectHookLibrary = '' + ._SaveCode = STREXTRACT( lcStrPJM, 'SaveCode=', CR_LF ) + ._ServerHead = NULL + ._ServerInfo = 'ServerData' + ._SourceFile = '' + ._TimeStamp = 0 + ._Version = STREXTRACT( lcStrPJM, 'Version=', CR_LF ) + + *-- Dev.info + ._Author = STREXTRACT( lcStrPJM, 'Author=', CR_LF ) + ._Company = STREXTRACT( lcStrPJM, 'Company=', CR_LF ) + ._Address = STREXTRACT( lcStrPJM, 'Address=', CR_LF ) + ._City = STREXTRACT( lcStrPJM, 'City=', CR_LF ) + ._State = STREXTRACT( lcStrPJM, 'State=', CR_LF ) + ._PostalCode = STREXTRACT( lcStrPJM, 'Zip=', CR_LF ) + ._Country = STREXTRACT( lcStrPJM, 'Country=', CR_LF ) + + ._Comments = STREXTRACT( lcStrPJM, 'Comments=', CR_LF ) + ._CompanyName = STREXTRACT( lcStrPJM, 'CompanyName=', CR_LF ) + ._FileDescription = STREXTRACT( lcStrPJM, 'FileDescription=', CR_LF ) + ._LegalCopyright = STREXTRACT( lcStrPJM, 'LegalCopyright=', CR_LF ) + ._LegalTrademark = STREXTRACT( lcStrPJM, 'LegalTrademarks=', CR_LF ) + ._ProductName = STREXTRACT( lcStrPJM, 'ProductName=', CR_LF ) + ._MajorVer = STREXTRACT( lcStrPJM, 'Major=', CR_LF ) + ._MinorVer = STREXTRACT( lcStrPJM, 'Minor=', CR_LF ) + ._Revision = STREXTRACT( lcStrPJM, 'Revision=', CR_LF ) + ._AutoIncrement = IIF( STREXTRACT( lcStrPJM, 'AutoIncrement=', CR_LF ) = '.T.', '1', '0' ) + ENDWITH + + 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) + ._InternalName = laProps(2) + ._ProjectName = laProps(3) + ._TypeLibDesc = laProps(4) + ._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) + ._Description = laProps(5) + ._HelpFile = laProps(6) + ._ServerClass = laProps(1) + ._ClassLibrary = laProps(2) + ._Instancing = laProps(7) + ._CLSID = laProps(8) + ._Interface = laProps(9) + ENDWITH + + loServerHead.add_Server( loServerData ) + loServerData = NULL + ENDIF + ENDFOR + + + + *-- Escaneo el proyecto + FOR I = 1 TO ALINES( laLines, STREXTRACT( lcStrPJM, '[ProjectFiles]', '[EOF]' ), 4 ) + ALINES( laProps, laLines(I) + ',', 1, ',' ) + loReg = CREATEOBJECT("EMPTY") + ADDPROPERTY( loReg, 'ID', VAL( laProps(1) ) ) + ADDPROPERTY( loReg, 'TYPE', laProps(2) ) + ADDPROPERTY( loReg, 'NAME', laProps(3) ) + ADDPROPERTY( loReg, 'EXCLUDE', EVALUATE( laProps(4) ) ) + ADDPROPERTY( loReg, 'MAINPROG', laProps(5) ) + ADDPROPERTY( loReg, 'CPID', VAL( laProps(6) ) ) + ADDPROPERTY( loReg, 'COMMENTS', laProps(9) ) + ADDPROPERTY( loReg, 'TIMESTAMP', 0 ) + ADDPROPERTY( loReg, 'OBJREV', 0 ) + + *-- TIP: Si el "Name" del objeto está vacío, lo salteo + IF EMPTY(loReg.NAME) + LOOP + ENDIF + + TRY + DO CASE + CASE loReg.MAINPROG = '.T.' + loProject._MainProg = loReg.NAME + loProject.ADD( loReg, loReg.NAME ) + CASE loReg.TYPE == 'W' + * + CASE loReg.TYPE == 'i' + loProject._Icon = loReg.NAME + OTHERWISE + loProject.ADD( loReg, loReg.NAME ) + ENDCASE + + CATCH TO loEx WHEN loEx.ERRORNO = 2062 && The specified key already exists ==> loProject.ADD( loReg, loReg.NAME ) + *-- Saltear y no agregar el archivo duplicado / Bypass and not add the duplicated file + FINALLY + loReg = NULL + ENDTRY + ENDFOR + + + C_FB2PRG_CODE = C_FB2PRG_CODE + toFoxbin2prg.get_PROGRAM_HEADER() + + + *-- Directorio de inicio + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + LPARAMETERS tcDir + <<>> + lcCurdir = SYS(5)+CURDIR() + CD ( EVL( tcDir, JUSTPATH( SYS(16) ) ) ) + <<>> + ENDTEXT + + + *-- Información del programa + C_FB2PRG_CODE = C_FB2PRG_CODE + loProject.getFormattedDeviceInfoText() + CR_LF + + + *-- Información de los Servidores definidos + IF NOT EMPTY(loProject._ServerInfo) + C_FB2PRG_CODE = C_FB2PRG_CODE + loServerHead.getFormattedServerText() + CR_LF + loServerHead = NULL + ENDIF + + + *-- Generación del proyecto + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <> + <<>>*<.HomeDir = <> /> + <<>> + FOR EACH loProject IN _VFP.Projects FOXOBJECT + <<>> loProject.Close() + ENDFOR + <<>> + STRTOFILE( '', '__newproject.f2b' ) + BUILD PROJECT <> FROM '__newproject.f2b' + ENDTEXT + + + *-- Abro el proyecto + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + FOR EACH loProject IN _VFP.Projects FOXOBJECT + <<>> loProject.Close() + ENDFOR + <<>> + MODIFY PROJECT '<>' NOWAIT NOSHOW NOPROJECTHOOK + <<>> + loProject = _VFP.Projects('<>') + <<>> + WITH loProject.FILES + ENDTEXT + + + *-- Definir archivos del proyecto y metadata: CPID, Timestamp, ID, etc. + loProject.KEYSORT = 2 + + FOR EACH loReg IN loProject &&FOXOBJECT + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <<>> .ADD('<>') + ENDTEXT + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2+4+8 + <<>> <<'&'>><<'&'>> <> + Type="<>" + Cpid="<>" + Timestamp="<>" + ID="<>" + ObjRev="<>" + <> + ENDTEXT + ENDFOR + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <<>> <> + <<>> + <<>> .ITEM('__newproject.f2b').Remove() + <<>> + ENDTEXT + + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <<>> <> + ENDTEXT + + + *-- Agrego los comentarios + loProject.KEYSORT = 2 + + FOR EACH loReg IN loProject &&FOXOBJECT + IF NOT EMPTY(loReg.COMMENTS) + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <<>> .ITEM(lcCurdir + '<>').Description = '<>' + ENDTEXT + ENDIF + ENDFOR + + + *-- Exclusiones + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <<>> <> + <<>> + <<>> <> + ENDTEXT + + loProject.KEYSORT = 2 + + FOR EACH loReg IN loProject &&FOXOBJECT + IF loReg.EXCLUDE + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <<>> .ITEM(lcCurdir + '<>').Exclude = .T. + ENDTEXT + ENDIF + ENDFOR + + + *-- Tipos de archivos especiales + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <<>> <> + <<>> + <<>> <> + ENDTEXT + + loProject.KEYSORT = 2 + + FOR EACH loReg IN loProject &&FOXOBJECT + IF INLIST( UPPER( JUSTEXT( loReg.NAME ) ), 'H','FPW' ) + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <<>> .ITEM(lcCurdir + '<>').Type = 'T' + ENDTEXT + ENDIF + ENDFOR + + + *-- ProjectHook, Debug, Encrypt, Build y cierre + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <<>> <> + <> + <<>> + <> loProject + <<>> <> + ENDTEXT + + IF NOT EMPTY(loProject._MainProg) + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <<>> .SetMain(lcCurdir + '<>') + ENDTEXT + ENDIF + + IF NOT EMPTY(loProject._Icon) + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <<>> .Icon = lcCurdir + '<>' + ENDTEXT + ENDIF + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <<>> .Debug = <> + <<>> .Encrypted = <> + <<>> *<.CmntStyle = <> /> + <<>> *<.NoLogo = <> /> + <<>> *<.SaveCode = <> /> + <<>> .ProjectHookLibrary = '<>' + <<>> .ProjectHookClass = '<>' + <<>> <> + <> + <<>> + ENDTEXT + + + *-- Build y cierre + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <<>> + _VFP.Projects('<>').Close() + ENDTEXT + + *-- Restauro Directorio de inicio + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + *ERASE '__newproject.f2b' + CD (lcCurdir) + RETURN + ENDTEXT + + + toFoxbin2prg.doBackup( .F., .T., '', '', '' ) + + *-- Genero el PJ2 + IF THIS.l_Test + toModulo = C_FB2PRG_CODE + ELSE + lnLen = LEN( toFoxbin2prg.get_PROGRAM_HEADER() ) + DO CASE + CASE FILE(THIS.c_OutputFile) AND SUBSTR( FILETOSTR( THIS.c_OutputFile ), lnLen ) == SUBSTR( C_FB2PRG_CODE, lnLen ) + THIS.writeLog( 'El archivo de salida [' + THIS.c_OutputFile + '] no se sobreescribe por ser igual al generado.' ) + CASE 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 + + + CATCH TO toEx + lnCodError = toEx.ERRORNO + + DO CASE + CASE lnCodError = 2062 && The specified key already exists ==> loProject.ADD( loReg, loReg.NAME ) + toEx.USERVALUE = 'Archivo duplicado: ' + loReg.NAME + ENDCASE + + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + FINALLY + *USE IN (SELECT("TABLABIN")) + + ENDTRY + + RETURN + ENDPROC +ENDDEFINE + + ******************************************************************************************************************* DEFINE CLASS c_conversor_frx_a_prg AS c_conversor_bin_a_prg #IF .F. @@ -8738,6 +9114,11 @@ DEFINE CLASS c_conversor_mnx_a_prg AS c_conversor_bin_a_prg STORE 0 TO lnCodError USE (THIS.c_InputFile) SHARED NOUPDATE ALIAS TABLABIN + + *-- 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)) + ENDIF *-- Header C_FB2PRG_CODE = C_FB2PRG_CODE + toFoxbin2prg.get_PROGRAM_HEADER() @@ -9294,7 +9675,7 @@ DEFINE CLASS CL_PROJECT AS CL_COL_BASE + [] ; + [] ; + [] ; - + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -9340,7 +9721,7 @@ DEFINE CLASS CL_PROJECT AS CL_COL_BASE _Version = '' *-- Dev.info - _Autor = '' + _Author = '' _Company = '' _Address = '' _City = '' @@ -9411,7 +9792,7 @@ DEFINE CLASS CL_PROJECT AS CL_COL_BASE TRY WITH THIS - ._Autor = .parseNullTerminatedValue( @tcDevInfo, 1, 45 ) + ._Author = .parseNullTerminatedValue( @tcDevInfo, 1, 45 ) ._Company = .parseNullTerminatedValue( @tcDevInfo, 47, 45 ) ._Address = .parseNullTerminatedValue( @tcDevInfo, 93, 45 ) ._City = .parseNullTerminatedValue( @tcDevInfo, 139, 20 ) @@ -9454,7 +9835,7 @@ DEFINE CLASS CL_PROJECT AS CL_COL_BASE ENDIF WITH THIS - tcDevInfo = STUFF( tcDevInfo, 1, LEN(._Autor), ._Autor) + tcDevInfo = STUFF( tcDevInfo, 1, LEN(._Author), ._Autor) tcDevInfo = STUFF( tcDevInfo, 47, LEN(._Company), ._Company) tcDevInfo = STUFF( tcDevInfo, 93, LEN(._Address), ._Address) tcDevInfo = STUFF( tcDevInfo, 139, LEN(._City), ._City) @@ -9499,7 +9880,7 @@ DEFINE CLASS CL_PROJECT AS CL_COL_BASE WITH THIS TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <> - _Autor = "<<._Autor>>" + _Author = "<<._Author>>" _Company = "<<._Company>>" _Address = "<<._Address>>" _City = "<<._City>>" @@ -13508,7 +13889,7 @@ DEFINE CLASS CL_DBF_INDEX AS CL_CUS_BASE TEXT TO lcText TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<>> <<>> <> - <<>> <> + <<>> <> <<>> <> <<>> <> <<>> <> @@ -13593,15 +13974,15 @@ DEFINE CLASS CL_PROJ_SRV_HEAD AS CL_CUS_BASE ************************************************************************************************ PROCEDURE add_Server - LPARAMETERS toServer + LPARAMETERS toServerData #IF .F. - LOCAL toServer AS CL_PROJ_SRV_HEAD OF 'FOXBIN2PRG.PRG' + LOCAL toServerData AS CL_PROJ_SRV_DATA OF 'FOXBIN2PRG.PRG' #ENDIF THIS._ServerCount = THIS._ServerCount + 1 DIMENSION THIS._Servers( THIS._ServerCount ) - THIS._Servers( THIS._ServerCount ) = toServer + THIS._Servers( THIS._ServerCount ) = toServerData ENDPROC