From ba7c88a198980074cc28b7add39d7767d0b91b7a Mon Sep 17 00:00:00 2001 From: Lutz Date: Thu, 16 Mar 2023 19:12:16 +0100 Subject: [PATCH] Property problems --- .github/CONTRIBUTING.md | 6 +- README.md | 4 +- ThorUpdater/FoxBin2PrgVersion.txt | 8 +- ThorUpdater/Project.txt | 2 +- docs/FoxBin2Prg_Changes.md | 6 +- foxbin2prg.cfg.txt | 2 +- foxbin2prg.dbf.cfg.txt | 2 +- foxbin2prg.exe | Bin 765877 -> 766852 bytes foxbin2prg.pjt | Bin 733164 -> 734175 bytes foxbin2prg.pjx | Bin 7433 -> 7433 bytes foxbin2prg.prg | 802 ++++++++++++++++++------------ 11 files changed, 493 insertions(+), 339 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 7890868..4aeaff6 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -30,6 +30,7 @@ Please note, there are some tasks to set up a new version. Stuff is a bit scattered, so this is where to look up. 1. Please create a fork at github - See this [guide](https://www.dataschool.io/how-to-contribute-on-github/) for setting up and using a fork + - If allready forked, pull the recent state, or get most recent version otherwise. 0. In _FoxBin2Prg.prg_ there are two version numbers in properties: `n_FB2PRG_Version = 1.19` `c_FB2PRG_Version_Real = '1.19.60'` @@ -52,11 +53,12 @@ Stuff is a bit scattered, so this is where to look up. 5. If a change to the parameters is made, change _C_FOXBIN2PRG_SYNTAX_INFO_EXAMPLE_LOC_ properties. 4. For changed functionality, add descriptive text on the appropriate _.md_ file in _docs_ folder. 2. Alter the version number for the EXE to the version used above. -0. Compile to EXE +0. Compile to EXE **in VFP9 SP2** 8. Change Thor ([see below](#thor-conventions)) 8. commit 9. push to your fork 0. create a pull request +1. ## Thor conventions This project is part of [VFPX](https://vfpx.github.io/) and published via [Thor](https://github.com/VFPX/Thor). @@ -74,4 +76,4 @@ In special: Thanks ---- -Last changed: _2022/04/08_ ![Picture](../docs/pictures/vfpxpoweredby_alternative.gif) +Last changed: _2023/03/16_ ![Picture](../docs/pictures/vfpxpoweredby_alternative.gif) diff --git a/README.md b/README.md index 4f3103a..ef1e824 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# FoxBin2Prg v1.19.76 +# FoxBin2Prg v1.19.77 **Binary/Text Converting program for Microsoft Visual FoxPro** ## Lutz Scheffler @@ -143,4 +143,4 @@ DO FOXBIN2PRG.PRG WITH "-t","template.dbf.cfg" ==> Generates a template for tab ## Usage For usage see [documentation](./docs/FoxBin2Prg.md) -Last changed: _2022/12/01_ ![Picture](./docs/pictures/vfpxpoweredby_alternative.gif) \ No newline at end of file +Last changed: _2023/03/16_ ![Picture](./docs/pictures/vfpxpoweredby_alternative.gif) \ No newline at end of file diff --git a/ThorUpdater/FoxBin2PrgVersion.txt b/ThorUpdater/FoxBin2PrgVersion.txt index b8c6c6e..2b27508 100644 --- a/ThorUpdater/FoxBin2PrgVersion.txt +++ b/ThorUpdater/FoxBin2PrgVersion.txt @@ -10,8 +10,8 @@ local; lcappName = "FoxBin2Prg" *Set following two numbers on version -ldDate = date(2022,06,13) -lcmajorVersion = "1.19.76" +ldDate = date(2023,03,16) +lcmajorVersion = "1.19.77" *lnJulian = val(sys(11, m.ldDate)) - val(sys(11, {^2000-01-01})) *lcJulian = padl(transform(lnJulian), 4, '0') @@ -39,6 +39,10 @@ Demo video using FoxBin2Prg with PlasticSCM: http://youtu.be/sE4wQ50Itqg +++++++++++++++++++++++ Change History +++++++++++++++++++++++ +2023-03-16 v1.19.77 +- Bug Fix: Bin2Txt Operation on VCX loses leading spaces in Property Values #90 (JoergSchneider) +- Bug Fix: Txt2Bin Operation on VCX looses double ampersand in Property Values #91 (LScheffler) + 2022-06-08 v1.19.76 - Bug Fix: On operation per folder, change of folder must change configuration (JoergSchneider) diff --git a/ThorUpdater/Project.txt b/ThorUpdater/Project.txt index 9aab5af..a11920d 100644 --- a/ThorUpdater/Project.txt +++ b/ThorUpdater/Project.txt @@ -1,5 +1,5 @@ appName = FoxBin2Prg appID = FoxBin2Prg -majorVersion = 1.19.73 +majorVersion = 1.19.77 excludeFiles = *.bak,*.bat,*.fxp,*.tbk,*.tmp,*.dat,*.log,*.cvp,README.md,.gitignore,*.zip*,*.7z*,*- copia.*,*.private.*,test_*.*,xx*.*,*.lnk,vfp_init.*,tmp*.*,*.err, *.conflict.*, *.private., .gitignore, *.pui. *.prj* excludeFolders = *.plastic*,*ThorUpdater*,*Documentacion*,*foxunit*,*foxunit_*,*pruebas varias*,*versiones*,*datos_test* diff --git a/docs/FoxBin2Prg_Changes.md b/docs/FoxBin2Prg_Changes.md index 44f1790..6e42eb0 100644 --- a/docs/FoxBin2Prg_Changes.md +++ b/docs/FoxBin2Prg_Changes.md @@ -27,10 +27,12 @@ _**Note:** you can click on the version number for downloading this version from | Rel.Date | Developer | Version | Details | | - | - | - | - | +| 2023/03/16 | LScheffler | [v1.19.77](https://github.com/fdbozzo/foxbin2prg/releases/tag/v1.19.77) | **Bug Fix**: Bin2Txt Operation on VCX loses leading spaces in Property Values #90 (JoergSchneider) | +| | | | **Bug Fix**: Txt2Bin Operation on VCX looses double ampersand in Property Values #91 (LScheffler) | | 2022/11/09 | LScheffler | Docu | **Enhancement**: Documentation for git on handling line endings | | 2022/06/13 | LScheffler | [v1.19.76](https://github.com/fdbozzo/foxbin2prg/releases/tag/v1.19.76) | **Bug Fix**: On operation per folder, change of folder must change configuration (JoergSchneider) | | 2022/06/08 | LScheffler | [v1.19.75](https://github.com/fdbozzo/foxbin2prg/releases/tag/v1.19.75) | **Bug Fix**: Multiple text2bin and bin2text conversion on MNX causes space grow (JoergSchneider) | -| | | [ | **Enhancement**: Typo in German (JoergSchneider) | +| | | | **Enhancement**: Typo in German (JoergSchneider) | | 2022/05/13 | bjornhoeksel | [v1.19.74](https://github.com/fdbozzo/foxbin2prg/releases/tag/v1.19.74) | **Bug Fix**: Fix menu bars with shortcuts keys like KEY F6, "F6"; are lost. (DanLauer) | | 2022/04/08 | LScheffler | [v1.19.73](https://github.com/fdbozzo/foxbin2prg/releases/tag/v1.19.73) | **Bug Fix**: Problem converting trailing spaces on line end in memo (again) (bjornhoeksel) | | 2022/04/07 | LScheffler | [v1.19.72](https://github.com/fdbozzo/foxbin2prg/releases/tag/v1.19.72) | **Bug Fix**: Problem converting trailing spaces on line end in memo (bjornhoeksel) | @@ -420,4 +422,4 @@ _**Note:** you can click on the version number for downloading this version from This project is part of [VFPX](https://vfpx.github.io/). ---- -Last changed: _2022/11/09_ ![Picture](./pictures/vfpxpoweredby_alternative.gif) \ No newline at end of file +Last changed: _2023/03/16_ ![Picture](./pictures/vfpxpoweredby_alternative.gif) \ No newline at end of file diff --git a/foxbin2prg.cfg.txt b/foxbin2prg.cfg.txt index cd092cc..c814eef 100644 --- a/foxbin2prg.cfg.txt +++ b/foxbin2prg.cfg.txt @@ -1,6 +1,6 @@ *################################################################################################################ *FOXBIN2PRG.CFG configuration options: (If no values given, these are the DEFAULTS) -*Version: v1.19.76 +*Version: v1.19.77 ***************************************************************************************************************** * Note, configuration files will follow an inheritance. diff --git a/foxbin2prg.dbf.cfg.txt b/foxbin2prg.dbf.cfg.txt index cb52f98..232e9a7 100644 --- a/foxbin2prg.dbf.cfg.txt +++ b/foxbin2prg.dbf.cfg.txt @@ -1,6 +1,6 @@ *################################################################################################################ *-- Individual DBF configuration file (syntax: filename.dbf.cfg) Defaults see FoxBin2prg.cfg -*Version: v1.19.76 +*Version: v1.19.77 ***************************************************************************************************************** *DBF_Conversion_Support: <0,1,2,4,8> && 0=No support, 1=Generate Header TXT only (Diff), 2=Generate Header TXT and BIN (Merge/Only Structure!), 4=Generate TXT with DATA (Diff), 8=Export and Import DATA (Merge/Structure & Data) diff --git a/foxbin2prg.exe b/foxbin2prg.exe index 59c2e30b347351d64b90371f7f12f9b1c0257cf7..b57341141b637b1c4da8bb9616f29087b77031a6 100644 GIT binary patch delta 19825 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 XbNK)_PnQOg$_1RytDQS9K%M^|dxLJo delta 19152 zcmZvk2V4}__x8`s)|qYeCQWRh*cC-Zr78-7iY-PFVO5kSVArfQ_Sm8~G4@_!Ax78U zHO6j?n%Ir8#v~YHZ|`$=a3$~WPd*c#?{m)Fow+k}+boX1S8MByTAQEMkdnxq1R_eB z^S*|sKHc_7rb8P~rH!jnXs=QzOxY%Qvdy7lqHvGB3Kg4H^P#lo zBDuVYjeSn^Tt_biQTu81+js6%jUxUP=y@f28~WzChVUsX z*!68S z?7|K)OlZvB?+|@$k@QwM=_Sf;{@8WGI}cuye4i$?6uX?{F&A0`&zGJzrH4;dZ;==H z&X3Y~Rx^Gve4Y#B^IWFio<*TdFD26aL*%z-Ek3#}ov!IwH0&BmatvFsQ>-q;vNJoy z2wNPktDsGPqN3MC5zZ3ho%=pZz^?AfuC3tmBWeB7N-VS5e6-q@SxFzQA1=yEMygqt9lDxv(JvJnhJB-&f}_4!hL(=6RI|%`jVQ6O*x^ez?Pm;-4$Zkq|>S@ z?y>aLgoojomT(c2M}qA=t?Da`WL3|o3e;CM*ekiGHc0$g!%7lFFI7b?v5W_zAKO$< z6=HWetD0C(GekvH4fkgizjsEOsm3+c;aO8|(ck$aP=_|Mg1cfx_C{343O89xm3ozM zmEBXRbNqa9+Zs`OxN!WQRrA|%1K%lzZBnZP*iUM8WgCA=aXa(MLwGF@SH~0MkNsl* zz-Kwm!-%->OyK`VBLBbI^3e6|yDEHVf5*o=`#=m4P`kgVy|p>0kaxJM zf;xyD*Ql%GNq(wP|0_rmCAEu9NluPu`!{NRCcf9Hv1zbrvFYsZb^1AvbscsHXdTsT zh9G$gsch3reXy{HoqehI6vnf=FZI>xT|4N=AenOVGqRHNvj*i@>4@UFQ(k^yZbnY_ zaBFl?QFh~`;ES`=aV-|u3VOzfOB5RQs1Dehz)$B z_iVMEL`P{KGLo%%gHCG|&!QY=Om<#I;jo149P2CTLm)FJqo~MnPW6(lx%pn~)Em8T z;|!A$cO^$W*;?E$KdZ=*kz!FoZj|4fA8z^B7cB5Cj;I=I@m3!w1hbxR^;Ijl_$WKL zP?oh%cAhmWJvBPnQIv@-eyjJzv$^A~KFB-3PsuZqb#O+`AXErXJj?!mtM^I?4ft?C z*?C2%*7WF{oD|3B7cB}=LV7B)7N;lS6OL3>98b!~%g7lvoY!ooHEU3zl}C$wtBGvs zYrPN4d8e19l5i#2pPdsVclOyhN!I<|*x|8YmE^%LkCTjI&F1Xyclr?7H%ZC%CRTHT zHvXRmCYC*sAyXYND|-JM&&2DsJn_UV>#^ zcjwN#Ct~MIJ@|+CvR;j3N!*#Cz=%nbB)0B5cbZg5eBF0$iR34?%9(pg@)y?>%>6?O za_==*DaCoqZ5+-51j#$<>=Yi*k~0wg6*qMBKet1V6-vOF`S@Er%#yeGx`a&;BtP9} zJ9vVg2^CNw`|wg#-l^$?}1 zy0<@-D`%02a#mhsYelJgc)iPx$j5^{bd4L*{~oN*ZT4P7EodLI3M#2eWw$?-MBfir zJ2pSd8k3WsIUv0tC!@Fzo|NG%S|$0h&s37$ef|?A-FdG1SL|z*R8jO)vE3>uNW5-j z*O1+2ucrzJAb&if>b~4C{O=K|YA68@%FaULlig<+uMKOV;~#C8e%j4Sf9Zgh`*k?;{ibK-aCLX`mot@QSzdw7hQjJulW}S2;Pp0fVeg?cH zXpy0KCc-E#KQS*Q&++t>SXqo#suTNfpATXF)OEr$*%=S5wQ=@`l6aG;v<;*36wio~ zcso)ry09=~*xo|6RV#&x!^g85THHvTr!YZ>V+xthD(Y}9TV}InI#k=HxvZ-W_kJ2< zqjXYb@#0r(Ipr&QIk9zri8OzX1Apt{{D{p@SMf8aOH+8ZiJ%Z!uX-Z zg&CQ}>9HLG>MQn#JX`S$hvW9KcujMj;*JmKU@a=nFSN$R#KsTC9a3~YNr`;exi~AC z8y+9`o&O0pJU<%sdU3<+qj5Kj8{VX*#Jud{i`s0CK5UkY{sXm6e{76u;hK_@Qy)MlA0^I}GJHez-K&q1i>nR^B%i z=Og!pGr)6GGm85m)Gi~}dVd(-!ygyL5%|zU{WRRB_{I-@0lK?ky+=*=NmIh z@$?RlcWvRHaVOyaFY}ti#=Pu5MeZ5RlLO0Yf9)7f!KfWJI#2SIpM2!#;aXp@#aPzW zC1K6KL7M9Wg+y1f8LUOD(oMxq*|ze=fznEXJ=Y@^6d%i zlu`1L2TxWK{D`^UlKgtjpRTYA^|d-4rJ{EE#R>U?^0JQ1QX&!!D!_D---flnJ>U(;NcZ9+qHm$9iPscM@#^LYUwxFPXrD3A|=cvUCH z#SG&Y=;hM?JI-S<$eO=FiB}?)`ber2>%Bu^iQ-~fp>9xIhg~17j*3P570VS_sU1>M z(OxB_pmB+9mvZ6|%P>m;;^H6JXtNaTTKc1ss^JHi7`N*rD=|y%-oKwzYy-D>!^>Oi z7bn>j>?0aavA1Tal5g-SCCS8-lrghz`q=MwOznC@36{HHHE$`_hsWx~ z9S5_UW~qYj)kjKDc^Ysva8g)0=Hh?-@0?EtyJ00 zPaWXgZ&`1J%T?L39QNKF=W;lgRrEmBwJ83$zqo1`>){~`AO{xa?W?Xc_+>U6Ges*;VN-J6a1d75`1c5`3gE zakiEX^g*)`u47;LV2;yK$8PyxT=Ck#4)~z*Mq3nK=*C`yb&;ODtY$3QPxAIU=*^)y z##>73m>l1(Q{MoV>?_q1KM!DId@-2#B!uU*a7>mAX!Zvc@Rsp-7~AKI@oT4WcE?w$ zsJmb5W0qsa=Qb_U;W%sXc2m~OPxAMQYNhz)KhxNnobWW2PFjlR30>7O<+b z!vEQ^hr@GRGe2(!M3b2c(T5DSrel1Vo!7T0Gm`~Zkb*QZ(H(NET!z%FU&!~1c9z{^ zl)|pOgGrBb%QrA3YK4KZqn>bbe2?Ue%)|ZyPDu zCXBZ;vUrD_T!p9VBe~xii$%rxILL@53Vzt_>n5yifaGuM*G%ypLxc3T)?xf|^o~+Y zrOK;ka7x5L^*_fGpFE%}@S#kyDv9Qghhoj`oKbk+;kUsx%Pw+ECP;{|?~Ibv@xmVazOm9CGkfwa7A@w_l6(!v`Kt$+ zmOY>oZ0{^7+;GxqoU%WiCDl@?Ps3pWb0sUgwL$W?ubC^g64bwP^T9l+zGB8O>9U}{ z!A-BPr69%Z{_UA?^%#hsf!w$ZV5G&Y(^+`Wgag$VuE!reWSmEUb z*>`P{wu@?il*Dqslj_^oeJ3pt)ghc)ZbiMQB4s!GjIGj6m1n5)8fi` z4W|?CR5hKdmc82vX{B1IZGV48`cvax#~G>1m5Mr{I!;KwcAtyVL9@CZO!o8dQg?gg z9Z9b;G;^j$vG3lnNe2I1M2Nm znf6<6Bu|w(i|3ZUM=dq1E4yuNArBVR{kgYEkb`*5dDtHbvPz}S2 zQjt>?vvV5xjd~Ez{6UM%+f8J*xh-TJlXP-~=P+mDaHkq!Pt(a`bn20OpEG8;z8V$j zH@B`FWUpduj~K>3qfZ zzLo+Q8-rIyEi1_vG+*-&bEzx`+8bAv`-_H!&fG<8LsdE7bFtG{;#5mn-D+}U^)eVN zvl@(|%&n-^pd#BoJuNfha5!KuH z-fJ4m?d`axKM0=toEiI_>VW-56ZscWeURstM9HoA1#E6_*<7~h)yKJ+m>^pjZYnp1 z$4RoEPmpiugbVg9?c`8b;iCO&y8M|WT(Wo1mW{4zyr97Aso`iyP`~>{HGgl*nv9ae z?75@l5rXGUu+kvha;o1L4#A7Hy(5|I!8W;>Mtz&_)p@+!-Eo7mQ{&~Y{G_#bkB4DS zpTgYqjKLXsnN~INmkyr4GTQ{XLbElGcwFy@=VoN*DN*}B+;ySMbmjF276H?HXB1hr z6gvp(N4d$*cpMM0;K3eFkUhoLCMJ9?*AxBx`EMVV{JHEWwl9M*943{)Rt}-T>>N)& zSdstsV?h&TAMr{hW#9G_k>Od5@7}=Wctaxj7Zju|GpK;3h+C?+(g3J7$`O= zJ+@QF^qA<5@gGjKX%n_@vK%1(8pWF59)srcxUO$t+edO|B}gpT)kKCRY--&0>3| z;p}hBV%Mf&|9kV9b~^GKE@0KCgMF5=j+~>HvLVy)IqA#USJUNS@%d`Dle5QaT^PyL=Gov1OHeVn6eofm7Ldh(+Od-qIs{2jhp2?39+6)KNzr zt$5{_pSS-Q54!y)n4XXrpA`4uen|g`XE-W9HUZ;#<#9NA*?AO6(e0de{9o+c4BXgB z#QvCpo27z^>1U#vQZy`lrtB{^*0VM<14Alpc$sFqA~r%#Mfs8@pVnnk7WrUAD_T)WRKm-fp?O zNm$K}|0rjwDypOHb&ktHYWF!pMf9~x#SWsNiYESFp}ps6d5}?9WB>WGoERwFwg8xQXk+_svGC9D|LUi%ONY$`ksKbnbhT03wY@8<0aP%X;fxiVW zhrahEUZ&#x{r6x`bR=2mI()zf!84#=ekD*%@G)>0`VNy7G9fuK&gvHR4(I1@$R|OCIPM}`s zjWA;;K9>3tdIb6;Owy?ycn9>}tpYs(HwHg}zJ?y^4VVvxJneX&w;eTxudT#^TSC{z zi+D4*jSWT?AZ90)=V7FRH$v~&g%wwDXK*R>&D~gL0)Gk)*dtKTUK9fE4ekNm8(m;C za6j4}Ck~<(z&1X5Q6CcM6}Db5MuY1f#)spje>Rv8 zLE1pO9K|I8<947(==a!0fN?ue=nn$@g>5_-m!7hCD21o3v>vK6QM28 z-<`pSfbqHX7xbTJ1-bx6h{Dcc#qTG9u7iIDXF+G4$BnGT^}h^bF<=oQrAW95z6|~A z1>DKtyI{|Yc;RwMAW=v32%HL?@(W&3g8u0P-~jMDuy_SuySR$A zPp}$a3W;=98eGEs|2J8efVJ&t^7enE!~JJfzLzV@=;SSZ~(AW;49G8@z!kv_!amQ=wWyXb{Oo7T3imjb-0>dfh&XWK+hSW zCO2=Q8sMGKwn=!k6#%0?j4jZ)c!O0J+yuM?I)1d8nt|iN1E5=uQByl`J8%wk*a|g$ z3f=>bgs!k!O_@GKm%wq*1#8tb7JL`{-}Z>vdr548a94-SV; z#MTp>3oe45hb;>{5S;K%O&+3#&VZ+Zn?N7KK7J$wQY`YD(j#na)Fq*+|tFECpH8d0tZUwF%uAy)0YN#_f9efHpCqhFu@Cfj7 z=yQ!Vv=TfHEJbQaY^tHH;ECXd(5;$j=m2;+xDdKF8i-Ti*=Dr=T>#@+Yv>M){YW?s z?cEhgf#?^&DbSt!AP4MYK{Z0}%G1zga82+F=xGJ0wIJMp;62bD12t3u+!Wjzx*uAc zVDMz{9OxI=mV&2QY&gP+ID_dLS_@+l5?(=nI!i-m!ArqkKo7=yi{HWDg4aVQf32aX z;QioH(6I|NR5_UFIJgt^&x2j7NXhS5eZ@LO;ftmX${bg>eQm$Z}x-9XaP zR!D--sp+m4Ve-YdToDAI^qnAhE4Dfj9rC5}2T^ZMZ z0E{z$JJ<><<1qre*VfYKSfd{bo(A3u-5^R!N5BigSx)Y8x$uS3wnn z-P&p?0!#F1;Je`d(63T)QsBqni1u1~+CfWGtJsL%!>HO(OJ~xwvcR-uEX=xwW2iyeO*j-DPz*RXz@9LwazroGHe?mXb#|c$M^@IHiw0Mo7r60gW z;Pue`N8&SWFjl}=1^Ah1sY*3Gx9+%%Uuo(6N-doOw*W`2($XJCv=kXiG#6a;D5~%n zzFZ4l1^yMf=5a0ggb{55_kq@)f(PCWj)yKir=Zs`R^-j)FbFnb2_$v~&*~3LXXB^s$x<)zQj<2Sb;>(^7NrKyZ!sTAGMy z-xTn0@FD2&l8zRG*MjZP6+Lw}DurP6_bPe1<;G57FYwKtU*biN3&AK`Y z?XIII;FaL6(3Pj?=w>+48}Oj1I-0y1``1E0fgW!M^t~T+bQR2d(03#3*23VI5yhbjku4t=U3R@cF5^oZIJJyo}b>S+~>>M#aC zN7mNU9dHV`XI(uR@SdT5eWK66kuEfA7x*#su~a>kf`0|8+w1AKE_$lj05>(* zudAM>_R!Nna3H$eL(tE&^|TtC27Z#GCtFL5rQ92$uZJ-d`it3mS_FOyJ_cQ|97h>} z8wfq*QfRMl^|TJ$58MfZ!%-LY^bY(MydHY)H9g&Igl}!5hdTy+WyeM9;vRz@I|9xk{7}iODy(IkbnDL=(aH!7r;w zbRblsQt%((*U&R+OY|NrqQ^T7eXOxWb(&xf0Db}eBnI!m!QH`Ou{McT#7T4%Mkb6q z(8H1>x(uEG-T{3Gi$9)CG3Eomgr3_^qP5_M;MLHoe2FfC-+(=#ON!t%Lpy;E?K1S6 z5faq~CxAmoN_1(IM1#SffCFuxN%VLO3WZSwqrzB;s!o$=H<)*+$VSR z`mbFQC4&pm14iwZXz>pcHE)iC0bhjv@uWm^z`MZjpo=a^v;%w_yc|09xk%699MW(Q5jC#RGpodnIDH&V~JPG>u zP?CK%|`M9fOSC9Mq9FVjFp;IZJSECW@~H&Ej?Xg0y`q1}cX=o|3w;Cs+X6Abhk z?1BCybc%tFVjI{Nb4BnI=*QSbfdjx^Qw`L4x`D=kZNV_c0X~~ypy@DbfVV;KS!kdY z;B@dk=+2nvy$1IIKU->`FP9l8I0^GO@B!$3*uug2;NPJuuQX5{Fz*4|LnmPh)C@cd zJRW-LRs(fR!u2nKu@Mk!H_$pHYymgfZJ;iD40I8^6KsQCfH~7$@B#2~=opPz1l}}|=9Yo} zMZz0!*nI;n!yKzYJ6vOQ!Ka|_Ju*-#*aMvL4uxa84E6?JgZ>3;mbbtaz%GK3Bust( z1P6hmpr>Mc2@V18f=<&Kab_tPjlh@+u;`5x1dic5K#w&WsWvzrTmo(LG*TDvSnzh} zN0{VI0IvqWf&L=UNG0Hd;Dy0P>QTu^rQj3bsnF}NsZ&v7U>0tqdG%0c1dM-SoB+5s z#utadG6oe%&~dGeG#lI#JOq0Br$#ci$LI#UA3CMLNGri3FeaD*9Wcm9Q5`VO2ggEN zY)0w@J_2qCU1Oq=?BIvsUeMN=MjO3?Ay>!HdnO9|%1DtN@!WzhLyudGKO_OigI7ZD z!S*e<75ENxDYg=DBG_k%kt$)^25t-P3Z02<7dRRG4fHB(`@t#Tv(P2WZALl*qYsQf zmZOSR8|fioGSO$?LEzfZk3&tg5BwFl zYM6-*)H2Z<@OH2Z=IBqcb?!>E4;<3KL}Oaui-+KUz$;pq(EcZy=zAD}HBlh+j3g7i z1y=(fhK|HU-L)GI2%HD)g?V}va4WEXXXN)XQ9JM;@B!#1eND6g%)mXM7v-Di0{9sC zJhU*xM3p~5I{hNTv|OX%3iCOQbN1s)2m{=!60z)|2x==j+t(sf5| zfGf^1k@$^?s)GlEt3VH0YN7$)ufXe|_pUL~D)4UbSL;j^_MM4dfp375Y=EuXOw{mG zTt65Op)cD_)C2quY}sz2wmVFe4VG%7_u6Tqq=P1!2Cf6nhmJgEqEp~Ba31uo)3{7M zP$S^OznEyvuc#&PNbm({+Z_|l2Y&~)EdwNDC7~3?zc7lRe|l!3w4Uhcz`Exq3Rjz{ zAGl&2w0zJ%7|k>b90NXKHdCsvnNEWTg2zL@4Kh<;I;Ps-;9xV|sb;1w;6q@)P%{qH zOe?_m>!AI=-@r^Gu<~H(g{Brm=S9%@v1V!ut_fZN{Up&$qrfe}p>51GC&f&2!JWXV zsb=!*W~Lor8@MsFfR&2(;Kkqw=y83_)G!0J0S?PHQ~Lrl%>du2i}t@5Fme#i3I@K7 zNZ&)B!S)YW1gi&|DQKvfo`VhGH0U!}`q1{q*?@bGF;kVXW=a7EfjdA4V`-xsxEnYY zddfO89R{xfw^(nczrQn6UM42KHW+SO%(Q%mnKr@r2Rz|`nHC;1Q>84-gzKZJg*Klx zQ+IF#_!M;7MKgT`?g(BC{q(AtPJxTSEv}jA#ceZbtXO0MH^ef^)|Y0A2EPSIzcpiG zVTz5c*Y@q}gQQ+%d2#A62(dr@rXA!RKmN z$eduIJg|2|46C4j>tdnW{qP8aHC-+A_7e-0fb+n?-7R#uhlP&z!}YhpcmQzeWuePR z7zf_c*Fqb!E##4nMhScu`o;hY1%s!8-E(lj*uueIfM-Dm=3A&fcqzCQ^k)SYY7brm z-U~fxAoc-o0&j=Dg>67Ku73#(OQD5s4!6)iBwXe^!a@f}TWCG_4fr|qwec3Z0uG44 zJ%E*@s?#kL+8_M@xI46QriI#pJAlv5wb0{b7Fq#b4E9-Wq3>5%$ZY@)5d0cCZ;OR0 z*kJq$aHIWzuZ^9u&@*sd@DgbC&p6{8tYm_lK!-fEP;c;Fa5v~~ z_#0GhF3JOsgg&cwp{C%LjWI&fxX>7#3!Miig4aMlmR-p98;s5{LJTgn+0%vIgGYgz z`?%2l>Mmr>!zvc|HuTy?F7yCwio_X0pT^cAAGHPU)6|82Y3)MY!JWauZCq$(d*py~ z!1tj4816#m0!&=Nl}EVHXUxS$Q3El;X@Y8DE@WBdLN0|^Z~{j`yKTiEgo62WtR?iq zBQA6c9NZMoGW0=gor`er;Hzg`NPE_W=7KAO>q38Z*M;VTCxDMZzkTgO{>8YV!C`M) zXn|yNr7kdBo1ur2T&aVbEByj)0v-cB$={XCgNU-hCD7*sU8yU06j%syrQ6tw!4tr) z!LBq4+Zga9@OtRg6;TFwCinuhHN=(Xg1-b$sNqWeZM9tKCm73Mw2616=^b3D&tR7L+DfkRLm(bxeCL;J8@9D&*ZpMn0x)t#<@2ZCQiclL0ndLuC;1CQ}`$I7@n z^#D%-FM)38?@mSF>EPbbwlP8OGzP|e7_*?)g}Bo^@Cxuw=rtMez)`X2;qu+71Y18m zH7&shpzjTFr(AG0SRU$5sl(lA7q|$#akM){Om?Sd;AP-m&_7{|9nG6{tT9Y>w^8;K zcWMh`6^v=nG}WCtg4cknK+nR~9lQ>_1=@d_J7t2u1-F3ShHU_NBlt4(yqP#d@DJcs z&?U3oX(9Lm_&T(C0X(oV4h>%mn?Rr84MhhPMl10cw?Y4g7Yg%zFlzx>k^6W=zX7j={s*($op{7vOE3AHiw?Lo7WVN_81}NYNOjZjqSU16UAfq(Lx#LBe(D?U*XvOu-lp{4aDQ#`&gHG|M>a0_e3EhWANB zLjx{_PRB6&W+%*^!Aqf6VAMRnGhRM`??Rucg}b}7qHeu-7qG+51tQR3cVQH$WL((fNw+J z!ZrrH033ob9{Ar zccEut2(_gb=KkPw(AO{m8k&K^aNYezVlaXcP9=OE946n~B~M{1>!81}*=9 zBf#CE4`4ttI}6vp1&nuqd<;PTvf_GyA49*YZlR%lFv0;h#sDJ_;{$77%zD66pzonO ze$)?72{?3ug?!NcO6YDUfjdDjoMWLP@Lce9=#l7dzXUG??||Nm&Thm2T>tN2h+Zyq z6}?%#!xoKw%HMD~=A%&CVJm4-^-LiqqU+cZ)FkIDzQd9<+-AmL*~ z%gyXaCE!**z|9p=SX$zzSgCx(;Wk%xX<9x|2j;wJc3`u?-8L`UKpWzfq`u{oxY+{D z8ZUNm`2aVcv{eF=$_KdlWjiH+?>sqwwA@^tq6F~WBj=BHc?xRnTv-HPw{iYxxml~d zvJ1Xh;{4Hav#6sIxK}>F&CB=}B0t{e|h7#ymKEO>qdH{Y{h2;a>Y@Ny4e}{|E8hU+M($ext+}wo4 zPQLf|9c~u`9M{Oe|4z zv1^PmwrFDPy(_UdEQtT#-ookozW?Mi-0%C$voo_ZyED)1-ud8ay{mWY38ZUsm58`4 z{x0vhxhg)z$*-YbY+=DDziuf*%!3AHnDb^k4cT&)@2wS@!?96tlcuwsytniblj`%G zH*DDza=r@ZH}}V0?uMwO&Rr8a_Xv+2q@rrFWy_B-VNNdRj+H>+2(&TcXCWTc*r@0_&Y#{%xkPBwHbyQw#)*6+j|0cOa9c?JpkVC0f zkq(dol{c0fSjti4J3ZBD-8nBir$=%|p}9?)(El>Hp#486WtMQpEd3*$%Bu3(6u1P4+-Hd*B>AP_761o=R2Z@zPK#S870|9H=Fn-?Z3b;3b`=#Lj7+nlHJ;7d6+p_q5${8-r!d|l3k^_|a0 zvRN%P8u#$Hq{QBxqqP(pDPLs{_{5dgomI<17nINEB{pX+@6ArE<{g>G0(4Kg!1fla z8nICe_z2x20X0js11DxZw19uZb8XoE#k@Cngb1&j)2D%3h)JP2gc09|6?!qn-bDYn8C z_t6wzVeEO`%E<@cQtR#U9Iwy_&Qpav_@5p zZQ7_ZaEsWUjjDkhWB!{|t+=_Y-zL>q?vC~1CRImXeOgV#>Tgzgv#2eqJ6ss6yHyqB zM7R+g=#`dAC1oyRDO**8xl!!sR#gsnfwkVI3gG@`jjE{JwZ8Ibw_^MEs%o>&htzr& zHk(shw{25RY0ULzq4!j+gx_&{l?T%Xwz)v%!Eziq2e#~3+gS{M<@L1)^8kDGln#)&bus!4dtKh%p64Zbzl|3m@g;v+7P^@kIoT#+wC*xPm zK7Q|6qsN@PHeU8@E03QqoBpq=4(DV2>_acn$L(STOO%nFoEn#% zT9{!j|BXGB3u?~{*92c~8>@d!@Ny46Tv=XT_VC2COmnw_)C+Cf9mxfLgD>G6ulJoOzC)PO5oSETpj$tC|f; zz7yH<6l^B>9Rt%(z=G{@dmU~C2%6k;BnRf(V z=aVB9U;EYPGmh=QBe?enn;~at$)2%zk!*0F|G6lRf2U;FJ(D-d2H}4_)3>n(cLgtp zN4sne%;}EcqKha@%Se^4;ja&{th?x{b%)ukyFwse`q-4kj!WS;q?%tZ5u0@*3w^#Y5#C)DY%;y>9~~D~WgG4b?yd71$Qe3vu@7Abb8@OVPZ_*(jg;K~uWdOYj4Kg* z8@_3&_}JU9rL}C()BksnTLeoe5!{_eM=L(|gC?|RBTH~?Uu@5omk2(*b4RwXMDXOd z#IuX2g_japS&2}Gf1b!{{VUXtyxUVQz(DRa7ohk1W5~Cv%qoX<{DGqLw zHaIIg55t$2SC~^^POZ2l`y{h@{|Z5FO9v``5^iSs;*}?tA5+AO@Z!cb8}OnhW)_o(O{%haiCGiRjci@THqoG2k> zL_%RfKIRtru8m5|YqVR*(oW`Hjs-o%g zF}O-n%&CQWX7_Q5Szl?+!D>D7JBwnKlp1Yo_wVBsn_#oa3v})T*;4Jliwu}3n|(07 zRn#OG={=I4q?naXdSoL%@CLVLhK?qHVL94VOQ!Zer}Y zP&cOUF8SyHbbnMtd$TRtWP3iEx+$jU1B%HBUh=j%DJH&M0&e-p_yos8N*2rZ(YQ;u zjwpngZu3deqgAux3Tx!cFeZvlDyWlD4jSa?xAvz-d6t!pp(mN;1=`=`BrAR)1bUh) zoDA}j%AB4!GRHjfB)j}V2ue8ew^Fc)5VEEwp?i{)g)I-eEam)gXT;+IjEQ=ErqX2Z z%l2m#lQN!dF0d{yF$lVgEd8b6U1!M+IX4h}WIrJ9mSU>BtR3&$m`!*qczgOkQ8Jaw z6K%l>4K(Mmr?z6N#66RswCusbhvv@x6TO7M0a?5t!er*+R&rkb{Uxz2t!8`zJVR#o9o&T&qF z;xC_*!?wT*K)DXhYbYSkJt66}WT=IyD>*AUW8^4vLLLGNdqlXho|0YJQ_~yT*w#RY z`Arm%3#y`OE<Lmj*GvGz8$70d7I$d zG{t7ORa>RqH!?J`J8hf6#=wc+JeMt%KdUpg?=4PCTqOH7w)^c}YGY*(;)@lK2f=H~ zDjAyCJ%9L4VQ*{t5O3%x>?0fN^E;5BgoUhuH0*hgsb+d8+!8bt)68IW+%E&Tp=azsEl|usa8x z{g_$ho9i;PuxDy+vpuMxw)viHZ)vwbf2i=sWz+4s&0?z~zOM~Fv%CA0$(b@oXQg2B zy3c7VILa)uPOb3A;_7P^i+yEq$hTQqu`5rpN!qJri{InSbPlpxE9Uo1aB=IS0Adt* z$?0a!!=AmS$V%P|wJm2wnq*YOOd|&LXwivTGlNs!b<$RP3MD+NG0XbD{3GwNifKkkr+jQka*Y zHY__ewkTNisByNl>=b4n+kbm2{2v7kD9RE&y!sB1v%(Qs=3!wPW==v_n3gp-f9;^6 z<#?jMc?dpyGdqVzjVM$cD;v3Dyuwa$?YSV^XHA)|WPRF_ zrA3NOxxv;IvCf?6*5Rtn8iA`}5cZ<-au{XKPsvNmDM-uC8oOLRBmyA@Dwk*D&dGyq zA;zoKN=9WXCv9RIIMK^c z9^E7+56m#P%SaxaUvMTcRqWTk)_= z(G|2XL;$tNu5~b*$BWJ#E>svQi;HNbI2foamVbGfk4sL;%Z_U;n>*lHRzWseIyzLr z%A>A?vd6qwHR#8-irp5KBy}>6l!xKFFvX~Jd3GubR*CL)Hl@ne82e=tJw##S$BNCF zJ(Bb4r?Fg>=r*)NrkvjqK|DqQw_g63PYsdT8TlJ445I82Yt9;6FyuysNh_N$wK!&d zQb>GqrnyyxL69A6d(!MI_EaT$RN0)PxK^H`U!K)lEk^iq&8__dMRm0Hkdf$-o^f+U zXY1%8;%cK-q80b)2&+0=Y@|CXzm&2WjaEuteVnt|5XJEDs7O}8JCVON=U zm1RZOdaKynlFHii*xC|tgKNIsrNFKVS^B?X8OwbjdMaluOjj=v@AWm>#BVUO1l_Mus9O=byq%RwLO7pEX>7}@uW5&|TmV7CXLOp9jsrX*S zdc3PNPi5)v#FH$#Of)H-JKfs3OkBya_wOt3k~!9@F$l*Q|o+AYgid%cwHy4-FkwyPEF zs9tKp3)=`Xe0R=atdUHxpk zF36#Q>A}1+V8r`xn@55S#er-YKH209$phbdkfAZ3SX1%%7dhG) zbwpIox@4k;fJ~_hzo9M*$&?yvsg*4wYz*hlCL@=x--<1jGd@=`EMt-J5E26e%C5rN~(Mp^;AhjO^YmDI&aE^t<+Q79t6l@F4X+Ggrs3li89l|F#c% znk`l3d-i9h9DJTkW%YAVewmrY=12j&s*vU6NIrbdFg7a(^?xyrtYUcUc?&bNr8OBBGxkx&FNLdhUcM>0ZZBPJRG!P z8T(D<*{j$?nRl#WPWh5=^tm;1YYa+j+9kD%iH?oxru0%mtgSgY>py94g~xw%pNM80{H#Bm!-+P`ByeW z=BVG;#sZv5%|q<0{ONU=eJGH;`Ig66)k4Y7a_+R;5Zg#bwrh{iLOd$XYyrZxswCvtMm;V(vTMSBoa{W@`Gn9HrP(s&M^y=3qhuepvrrQK z{t#pbe9Hn3(Q!S(yZ*=Fn|16~p%kdEZ;-tl{Tr#m3|8l1(g-8xY@Ieq+HF#0a!swV z^Q4*_uhv=%izF9^xX)-Tm%|m)X8a$h+Dt1{Pr2D#6)s%Whzq9`G@GBmMPMHhPEEi! zh~pab$)E`2<-#%td*3JYl;^n-q+;_HOMSR!?7?EGP&JQ>wx%wT`l-2_)?bUIJ_c?L z^Vuk+sPyVc>!gj6uiDgxd&bYbZ;xRYRg6_M4qs?FeJRLfHBS$;H zM(`r&VfYHx0k8{rJ#^7#j*fx7IGpk!z*?+qr(y7e!)540TR6G`t^wYH_Cr!qrjt}Gk4;7Jh-C; zhNXZpyYPGyhR)zy(2sX>R1e$(Tw@R3Ane7%7O)(lb%XAXRkICvAb2kHe5{?g-)IQ< z1oYltIl|_cvcS)v&m7~sSc7*cm|RdA1+DEt;j zNnm_WfyO}3KuglVgTdROyYoC927e2l3|)Yl0}-06122FscHzkq4#Ptj{sQ!I_s(=_m3;0Mqp;cB`GcE?#)i%?T) zJ2l0-5;X&V1MPsp@(LuX#)5>csBF{ zqy^whU=!X34$M~5GVs6P$H@r*Ico9{>FoqphTj($h5ioebPy+3T zmq4-Ly5LUG=a90%jlk+t$VVChZUT;n9*;B@90LCO0>0#R6}AQ(`_|vx`(Gp;Gy6%(9e+u zgEPU^@CGRiDHEIve)0jsgWKgCcpCT;^iYk4)Kzg?f|pwWot-q~3d127#zFsxlnXu# zz6pKaLqo&Ccfop34fXQU&}Q&+@EB+}9}WEmehcme-Ng?Tf(1M!8V6m17d=nF!C>E- z8j7o}p~lrPDS<7M0psgxC<2DoFl>chT3?R;AticCKtfq*&5mh!%{fRf_^qnLwCW&;Oa#h(lZUc1OEUHhkk$= zOYesUgR3sl(2ZppY6U(5egU1oLPH(F=fF##cOeY|UjTC}HDuYRp>%LdizDWKK* zT?qIBcr)~Agg@!vJ7BSkmKG$U4)9a(Y3O-9w6r1!5c`4RWL*Y@)v2Tbxqv2&WM7bm#)*&J#bs_+V8b=bE}pTYY`0qx7((rZKt)g z4*U!F33U27q}rG_z$>AT;(O%Nz<-0)7qztNvX<6@uYzwv&$xm3Yd;JeRttbGKk)fmAAxS_8=)q?~|0bc|UfL>WwpkgqG74aH$O-o~euE9_fh5^u% zS_tIZ1Zy|=AoN_k)#wk-1OI|p%^WMx58z_(TxhS}0=)-c0e6B9NERrqDFRS%f9TeD zwXp^q;EC8D`ZnH5lz_v*)$jts(q)uDe$5b(!VouBpgFSyng%`qJ_3Dhg+T5h=n*WL z0V@SMf&g(PcnJ6%bj~h;0-Gb+0bBP8boCCtyA1Zjif6bhQ0YT~dbhw853Yk>UetUm z&=PPKxYt|3LT%I{J%V8d40+JyI*}T+#03X_Y7l9rhe+ArzrlN;3;ade3w{n>4n3@f zh-d`?DOR{XAtD8~6e$gC1owk}+E%0y;2>~~Fp=uSh_ntI3;sODB2xEmXaEf3VE6`F z+g+r#tuXC^+e2UMD^fS`TCjINk!lr)Gz0ts+#mYwD3Kbp#@S*4(~lOZ?*x(hfPKMP z(9)M8eFbg>ZUWtXhDck%Y2XPKK=3S)-oY>yhT+g1=ZWMMiU0vz0Bu<+QaJbz@EYjS z)gny?%PVFu9vQX&Q>4GaMOYEPg?@crqyud*eBg!`L<+bnl1E!yBjBFUhaZa62CT+{ zW_bfx^FpK|7y@B93!Q^sq?`aZ1b+`*^Q}m?z-_?;q5a;W!Qc+y&!KO=7fB4m(hK$} z7qLy3$QL{S?8!;=2B|rC2)HgU(J{RGi3U&e#r*#PP+KR_Fc^yAkOVzQFA)Q;122Q# zhDSJSz?;Fhp*7WE1ItTr8|aPo@Vl9COgi8z&93=eNZ}obV!-1AbhNR#j=F38rfaMkTP>bp}% zN5FHzUqesYt)nxs82_a(>;fD(s-uT+_#1o&dh~G}Ma5yi4$k{qM>9|9Ck zA03Sc-vINcb(C^ON3+0>!7U%?sPLhV8pUHf4qgU5@`;Yxg4I}2S3tjes-qt97=Hr{ z0nc=l_#B16!4=%&m5xG7ahBj};AH%M?*gZ%Kf(3D8eUJnDm|5en}HX&=;<<2K>{v1 zu&XP6M&quh(O`K=?*JW+J=qj+7`PDn0Mc9w43RKA2TZG~r-k62-~-U@ee|>)oFX3p zy#t%L!{G7Y`_NWw;+}$6f}cQF4@RRpW1avvh5o&%o;rbVf=`F&si>u%rh*@U4?y2Q zvMhz+F$^anaCRN^bQ0`}ph6X+rxJH8VpMt*fvqevz!;k}mVAa$8?RrWAPXPz+Ko?NAO1QTj-d5 zdfE%#0?vj``5oO3J_7#zn4Xp$*HfMDcwPWL2EFEzo|=K35Y(K3Zeh8ur{ypN!q6Xj zN{OEKgX6$IK*zk$lh6YT1$Z3v?pJ#13;qUt7y4AGp3=c{z~8>slf)Tl0(b|wA@oeG z0l_VzV(@R!U+eMPOz>;)EN25*ntK~4wI`;}_ip!nWcY`}w|4-GUB19t$ILFW!O(0XuB@EYiN?8Enhhkz3^ z;6Kbj_rTwR-$3V$HBiXsh@QYj&}SwaC>wkqtozbppqA4Ov=rhL*bOP)F)*VOhAeDlB!NGqTDC2~IRQ(W6 zf!CchQ06%U)c|(^&w~E^3cmdVE(FhnzH|$X0DlX<{m4LvA7hyMBMb*yUICWBGf-0) zPQh>hI!iRtRIqC>Vt450dLumo`+#d1j1=c(BtD5K0z47=UVxG6f>Xc`sv9Y{p^=7w z=YUs3`-B+j7w}eaIJCBnk)DEY1!Mki1t^R*QkwzTry-OUI~i$lS0k+h*8}f`p4Hn( zx54q?gU~JmjO3n-X&D>?z13`_hTvh~+(AYP$u?3q@N#f(=zu~aEdcKW_k>zeW9n|Nk{(_?20TfwBB!|2Y(nzNX0x3HXTM` zCyW#Wc5Z?$K5L|fSB$h9+!VYUT6f1tFTp**e?#|vV5G)o#Ealn&~Kj^@wFlhA2{~8 zku-0Ovjpy4452*cgJrdD7~TSw=9?%f4PypA09{gOqI~cw@bs}J`pROWAHi$E`=GZ^Kmz{&ehA%aqKOWI zH-gilUr#d8G4QWo|H&rm^(D##9|q5d9yrBBZ__aTCt;Wa*omYbitYs8hu$&EL=yO& z%+QO!HBl6}S_tNIXzM}~6@c4-8!R)STTHYc+zZ?c`p#+--38}^zh7^nqraFaG#!lx zKZBmJ!$j*XF#HO`X+Vd=CfW*q3tn-|L>n%dsCEVlYmO@wI{c=IW`etdM?qh?k23~m zgI!8YRQAC{@4#2VP4N4bCR#^YmWlGfJ)pn$a-@I2$t@5?LHDWVNS2H&ESE4$1RV8q zq|xBv;4#pbEIBmLCh zkzRm@gI^~(Qs`iO1vLl537!Mpf0m<#zJs9(wqIZAY4i)Sv+I19&fVjWYBKcn!D* z^fyixC)x(XIT)-?PE^O&iJpKPx5g3-eXXVw}e`)pn+% z;Kg8FeP{e4+?ig1*MaKclQ1RnsGEOoX} z-(}8p35J6(SfHOH-2xv1yDfL7sYnmNhrt`6y^Edc1^6g96nYI(8TdH(Fm%`oXHrkV zL-dOZg;e|sqA{6Lp zc)_sJ1Dg==LFi_9A28VquV=u6p=0s9-`g8czQJEXC&-Ux!D2gfJM^S52l_eyzTh*^ zU*REDYCS~2;0qQ&Cp?wf)BqC&3`?Mk@ysVK7~5m;Q|Kf-qFIi4dlC39^f)|nk*Co$ z;99!{((6SUgnN7ocpmhm8u%F&Zm~UJhngaFz~;6I?if{j%zV&k*xWiqAP;QW4w!-6 z?Pzp|4u&hxChTT!qBp95`$2EU?sYv1^8j<$y>4%=qu37E*MY?r*tlY|YKp-$3;qiF zdu&!6I%1^+zlF}gX7wnzHh33wA~vfHI-$qgWBy+Sn6U^6hDLBW2)!7a%ctPB;Iq(^ zu@_t!i^Raa@C19cfyEW6(6Ks`6b;d>$XI&4k#&Qwoe+O;= zUJHF4VK{Zi^CEC9gy9Tf_NX2RSit9@FCl7f+7k;C*auOwL$raMdf}R~zz_xKizxOa z3}1tbq1z)UJ=Yt-2zUzgHwZGhKA2{~e?h-P5V;fl6S&o0REC&vVqcsQ_*dwCNN)Ym z8(=kJL>|c-ycZk^U4od<4{Z4zh8njGcsXFCTQEEXw+b}U7YNCEBSw1zJ^=kILaYe` za7|#G9R?ZcCxlRO$#}j4eg<8R2&l?HoISV|UhEVh!r2XO1wIA60Rat%fF%t4FSI9u zmT9RN|K2e40vtv}QqPPBOkk}ezVMC!%k4z;P>e3Or%f8J^=g+bPuey_0uu_`(T(0n2*)Y z1rzTc8_yJ5%d$%*7XB7y@{Nxw;4VF1SG*%w(8qZ-QTeM?v4i mRJs)n#y^xqwP#`G!^D*_o{es(>*pf>LrU_00k*%&pZ^2!UtHV( delta 18075 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 WYhhV+bv<0=|6`2&5BeGVKmQMwI6yN1 diff --git a/foxbin2prg.pjx b/foxbin2prg.pjx index f953ee8f6ffefab1c865bdb7f61d93cbd6ba4d18..d17dfa4fe2fd5c521a36051de45445ec18f2c2f0 100644 GIT binary patch delta 581 zcmeCQ>a=1p5N8(H$g+)v!_>gY(9*)dV(}psMiygpBjd>d91@f7v8Ew732aE5M{G$D zJ*Gw$lYQ7_xVWPk7!*tlOij!u7qLembUkB->#9SDzT$w3N=(k-MB=W(hJ!O#&)2K?2DRElDKx UYmhm5Qb;lzkT{!-q^~mq02?5bod5s; delta 581 zcmeCQ>a=1p5M$%r$g+)v!^p_o%+%c6VDTXqMiwB$aB={L#N>OdX$VdN8xrRcTM|@{ znek*Fb{VecQ491XD8bpxnkP<~wKL?p3Cx#@m0GXpCjwG`LnWH8Fm6;%cWQUd{lKM5s R96c!{nGHys%|_DK83C)HmP`Nu diff --git a/foxbin2prg.prg b/foxbin2prg.prg index 67aadee..0bd32d4 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -112,7 +112,7 @@ * 19/11/2014 FDBOZZO v1.19.37 Mejora: Las configuraciones de foxbin2prg.cfg no permiten comentarios && al final (edyshor) * 19/11/2014 FDBOZZO v1.19.37 Arreglo bug: "String is too long to fit" cuando se procesa un DBF grande con DBF_Conversion_Support = 4 (edyshor) * 19/11/2014 FDBOZZO v1.19.37 Mejora dbf: Nuevo parámetro ClearDBFLastUpdate para evitar diferencias por este dato (edyshor) -* 21/10/2014 FDBOZZO v1.19.37 Mejora: Permitir generar una clase por archivo (Ryan Harris/Lutz Scheffler) +* 21/10/2014 FDBOZZO v1.19.37 Mejora: Permitir generar una clase por archivo (Ryan Harris/LScheffler) * 29/11/2014 FDBOZZO v1.19.37 Arreglo bug scx/vcx: Algunas propiedades a veces tomaban la descripción de otras propiedades similares * 29/11/2014 FDBOZZO v1.19.37 Arreglo bug scx/vcx: Las propiedades "Protected" y "Hidden" no siempre estaban ordenadas alfabéticamente * 30/10/2014 FDBOZZO v1.19.37 Mejora: Optimizaciones en velocidad de proceso para scx/vcx/dbf @@ -136,33 +136,33 @@ * 20/01/2015 FDBOZZO v1.19.42 Mejora: Validación de versión de Visual FoxPro SP1, para evitar problemas ajenos a FoxBin2Prg * 04/02/2015 FDBOZZO v1.19.42 Mejora dc2: Permitir ordenar los campos de vistas y tablas alfabéticamente y mantener en una lista aparte el orden real, para facilitar el diff y el merge (Ryan Harris) * 22/01/2015 FDBOZZO v1.19.42 Bug Fix: Compatibilidad con SourceSafe rota porque se genera un error al realizar la consulta para soporte de archivo (Tuvia Vinitsky) -* 25/02/2015 FDBOZZO v1.19.42 Bug Fix scx/vcx: Procesar solo un nivel de text/endtext, ya que no se admiten más niveles (Lutz Scheffler) -* 25/02/2015 FDBOZZO v1.19.42 Mejora: Hacer algunos mensajes de error más descriptivos (Lutz Scheffler) -* 03/03/2015 FDBOZZO v1.19.42 Mejora: Mejoras en la traducción al alemán (Lutz Scheffler) -* 03/03/2015 FDBOZZO v1.19.42 Mejora: Permitir definir el archivo de entrada con un path relativo (Lutz Scheffler) +* 25/02/2015 FDBOZZO v1.19.42 Bug Fix scx/vcx: Procesar solo un nivel de text/endtext, ya que no se admiten más niveles (LScheffler) +* 25/02/2015 FDBOZZO v1.19.42 Mejora: Hacer algunos mensajes de error más descriptivos (LScheffler) +* 03/03/2015 FDBOZZO v1.19.42 Mejora: Mejoras en la traducción al alemán (LScheffler) +* 03/03/2015 FDBOZZO v1.19.42 Mejora: Permitir definir el archivo de entrada con un path relativo (LScheffler) * 03/03/2015 FDBOZZO v1.19.42 Bug Fix scx: Metadato del Dataenvironment no se genera bien cuando el Dataenvironment es renombrado -* 03/03/2015 FDBOZZO v1.19.42 Bug Fix scx: Agregada la generación del PJX/PJ2 cuando se indica "file.pjx", "*" (Lutz Scheffler) -* 03/03/2015 FDBOZZO v1.19.42 Mejora: Agregado soporte multi-proyecto (*.PJX, *.PJ2) cuando se especifica "file.pjx", "*" (Lutz Scheffler) -* 05/03/2015 FDBOZZO v1.19.42 Mejora: Cambiada la clase de base de FoxBin2Prg de custom a session (Lutz Scheffler) -* 05/03/2015 FDBOZZO v1.19.42 Mejora: Permitir procesar los archivos de un proyecto sin convertir el PJX/2, usando *- (Lutz Scheffler) +* 03/03/2015 FDBOZZO v1.19.42 Bug Fix scx: Agregada la generación del PJX/PJ2 cuando se indica "file.pjx", "*" (LScheffler) +* 03/03/2015 FDBOZZO v1.19.42 Mejora: Agregado soporte multi-proyecto (*.PJX, *.PJ2) cuando se especifica "file.pjx", "*" (LScheffler) +* 05/03/2015 FDBOZZO v1.19.42 Mejora: Cambiada la clase de base de FoxBin2Prg de custom a session (LScheffler) +* 05/03/2015 FDBOZZO v1.19.42 Mejora: Permitir procesar los archivos de un proyecto sin convertir el PJX/2, usando *- (LScheffler) * 06/03/2015 FDBOZZO v1.19.42 Bug Fix pjx: Permitir usar fin de linea (CR/LF) en los atributos de versión del PJX * 10/03/2015 FDBOZZO v1.19.42 Mejora API: Agregado soporte de errOut e implementado en writeErrorLog -* 10/03/2015 FDBOZZO v1.19.42 Mejora: Agregado soporte total de comodines *? en nombres de archivo para procesar múltiples archivos de la misma extensión (Lutz Scheffler) -* 10/03/2015 FDBOZZO v1.19.42 Mejora API: Nuevo parámetro para permitir un CFG alternativo (Lutz Scheffler) -* 10/03/2015 FDBOZZO v1.19.42 Mejora API: Nuevo método get_Processed() para obtener información de los archivos procesados (Lutz Scheffler) -* 10/03/2015 FDBOZZO v1.19.42 Mejora: Nueva salida de archivos procesados a stdOut (Lutz Scheffler) +* 10/03/2015 FDBOZZO v1.19.42 Mejora: Agregado soporte total de comodines *? en nombres de archivo para procesar múltiples archivos de la misma extensión (LScheffler) +* 10/03/2015 FDBOZZO v1.19.42 Mejora API: Nuevo parámetro para permitir un CFG alternativo (LScheffler) +* 10/03/2015 FDBOZZO v1.19.42 Mejora API: Nuevo método get_Processed() para obtener información de los archivos procesados (LScheffler) +* 10/03/2015 FDBOZZO v1.19.42 Mejora: Nueva salida de archivos procesados a stdOut (LScheffler) * 10/03/2015 FDBOZZO v1.19.42 Bug Fix: Arreglada la cancelación del procesamiento con tecla Esc * 22/03/2015 FDBOZZO v1.19.42 Mejora: Ordenar los campos de vistas y tablas alfabéticamente y mantener en una lista aparte el orden real, para facilitar el diff y el merge (Ryan Harris) * 22/03/2015 FDBOZZO v1.19.42 Mejora: Aplicar ClassPerFile a las conexiones, tablas, vistas y stored procedures de los DBC (Ryan Harris) -* 23/03/2015 FDBOZZO v1.19.42 Bug Fix mnx: No se mantiene el Pad vacío al regenerar el menú cuando se define un menu con un Pad sin nombre (Lutz Scheffler) +* 23/03/2015 FDBOZZO v1.19.42 Bug Fix mnx: No se mantiene el Pad vacío al regenerar el menú cuando se define un menu con un Pad sin nombre (LScheffler) * 25/03/2015 FDBOZZO v1.19.42 Mejora API: Nueva propiedad l_ProcessFiles que permite obtener la lista de archivos a procesar sin procesarlos realmente usando el valor .F. * 25/03/2015 FDBOZZO v1.19.42 Bug Fix frx/lbx: Arreglo de CR,LF,TAB sobrantes en algunos archivos FR2/LB2 agregados en versiones anteriores (Ryan Harris) * 02/04/2015 FDBOZZO v1.19.42 Mejora: Herencia de CFGs entre directorios -* 12/04/2015 FDBOZZO v1.19.42 Mejora API: Crear un método API get_DirSettings() para obtener información de seteos del directorio indicado (Lutz Scheffler) -* 13/04/2015 FDBOZZO v1.19.42 Mejora: Permitir generar texto de una clase de una librería (Lutz Scheffler) +* 12/04/2015 FDBOZZO v1.19.42 Mejora API: Crear un método API get_DirSettings() para obtener información de seteos del directorio indicado (LScheffler) +* 13/04/2015 FDBOZZO v1.19.42 Mejora: Permitir generar texto de una clase de una librería (LScheffler) * 16/04/2015 FDBOZZO v1.19.42 Mejora API: Renombrados los nombres de los métodos al Inglés para facilitar su entendimiento internacional (Mike Potjer) * 23/04/2015 FDBOZZO v1.19.43 Mejora: Nueva configuración "RemoveZOrderSetFromProps" para quitar la propiedad ZOrderSet de los objetos que cambian constantemente, provocan diferencias y a veces dan problemas de objeto encima/debajo (Ryan Harris) -* 23/04/2015 FDBOZZO v1.19.43 Mejora: Hacer que la progressbar no se convierta en la ventana de salida por defecto de los ? (Lutz Scheffler) +* 23/04/2015 FDBOZZO v1.19.43 Mejora: Hacer que la progressbar no se convierta en la ventana de salida por defecto de los ? (LScheffler) * 28/04/2015 FDBOZZO v1.19.43 Bug Fix: FoxBin2Prg no retorna códigos de error cuando se llama como programa externo (Ralf Wagner) * 29/04/2015 FDBOZZO v1.19.43 Bug Fix: FoxBin2Prg a veces genera errores OLE cuando se ejecuta más de una vez en modo objeto sobre un archivo con errores (Fidel Charny) * 10/05/2015 FDBOZZO v1.19.43 Bug Fix: Cuando un form tiene AutoCenter=.T., hay veces en que al regenerar el binario y ejecutarlo no se muestra centrado (Esteban H) @@ -170,7 +170,7 @@ * 18/05/2015 FDBOZZO v1.19.44 Mejora: Permitir la exportación de datos de DBFs cuando se usa DBF_Conversion_Support:1 y CFG individual opcional * 31/05/2015 FDBOZZO v1.19.44 Bug Fix: Un arreglo previo en el manejo de errores en cascada provocó un reseteo del último estado de error de proceso, haciendo que a veces los errores no se reporten. * 01/06/2015 FDBOZZO v1.19.45 Bug Fix: Cuando se exporta a texto un menu que usa comillas simples o una expresión en el mensaje de las opciones, al regenerar el binario se recortan partes del mensaje de esas opciones (Mike Potjer) -* 09/06/2015 FDBOZZO v1.19.45 Bug Fix: Cuando se procesan múltiples archivos PJ2, puede ocurrir un error de "variable llError no definida" (Lutz Scheffler) +* 09/06/2015 FDBOZZO v1.19.45 Bug Fix: Cuando se procesan múltiples archivos PJ2, puede ocurrir un error de "variable llError no definida" (LScheffler) * 15/06/2015 FDBOZZO v1.19.45 Bug Fix pjx,*/pj2,*: Los proyectos PJX/PJ2 que referencian archivos de otras unidades de disco causan errores ne esos archivos al procesar con las opciones "*" o "*-" (Matt Slay) * 22/06/2015 FDBOZZO v1.19.46 Bug Fix: Arreglo de bug en método set_UserValue() cuando se intenta obtener información de un error que no puede abrir la tabla (por ej, porque el memo está corrupto) * 22/06/2015 FDBOZZO v1.19.46 Mejora: Agregado soporte interno para consulta de información de cfg de directorio, mediante nuevo parámetro opcional, para los métodos API que lo requieren (por ej: get_Ext2FromExt, hasSupport*) @@ -179,7 +179,7 @@ * 14/09/2015 FDBOZZO v1.19.46 Mejora: El objeto WSscript.Shell da problemas en algunos entornos o bajo ciertas condiciones, por lo que se reemplaza por llamadas Win32 nativas (Aurélien Dellieux) * 15/09/2015 FDBOZZO v1.19.46 Bug Fix Frx/Lbx : El ordenamiento de registros de los reportes cambia el orden Z de los objetos próximos que se solapan, pudiendo causar que se visualicen mal (Ryan Harris) * 18/09/2015 FDBOZZO v1.19.46 Bug Frx/Lbx: Cuando se regeneran reportes o etiquetas con textos multilinea alineados al centro o a la derecha, la alineación no es completamente correcta (Ryan Harris) -* 29/10/2015 FDBOZZO v1.19.46 Bug Frx/Lbx: Cuando se agrupan controles en diseño y se convierte a texto, al regenerar se pierden las agrupaciones (Lutz Scheffler) +* 29/10/2015 FDBOZZO v1.19.46 Bug Frx/Lbx: Cuando se agrupan controles en diseño y se convierte a texto, al regenerar se pierden las agrupaciones (LScheffler) * 04/11/2015 RALFXWAGNER v1.19.46 Bug Fix Pjx: Los archivos SPR y MPR no estan bien representados en la información del proyecto (Ralf Wagner) * 25/11/2015 FDBOZZO v1.19.46 Bug Fix Pj2: Se genera un error al regenerar un PJX desde un PJ2 donde algún archivo contiene paréntesis (EddieC) * 25/11/2015 FDBOZZO v1.19.46 Mejora dbf: Nuevo parámetro ExcludeDBFAutoincNextval para evitar diferencias por este dato (edyshor) @@ -194,17 +194,17 @@ * 10/07/2016 FDBOZZO v1.19.48 Fix defecto db2: Cuando se arregló el bug del memo multi-línea, se introdujo un nuevo defecto por el cual un memo de linea-simple se decodifica mal (Nathan Brown) * 11/07/2016 FDBOZZO v1.19.48 Bug Fix pj2: Cuando se regenera el binario de un PJ2 con archivos en una ruta con paréntesis y espacios, se genera un error "Error 36, Command contains unrecognized phrase/keyword" (Nathan Brown) * 11/07/2016 FDBOZZO v1.19.48 Bug Fix frx: Los ControlSource de objetos OLE que contienen comillas se generan mal (Nathan Brown) -* 23/03/2017 FDBOZZO v1.19.49 Bug Fix vcx: No funciona la generación de una clase individual con "classlib.vcx::classname" (Lutz Scheffler) -* 25/03/2017 FDBOZZO v1.19.49 Mejora vcx: Poder importar una clase (VC2 generado con ClassPerFile) en un VCX existente (Lutz Scheffler) +* 23/03/2017 FDBOZZO v1.19.49 Bug Fix vcx: No funciona la generación de una clase individual con "classlib.vcx::classname" (LScheffler) +* 25/03/2017 FDBOZZO v1.19.49 Mejora vcx: Poder importar una clase (VC2 generado con ClassPerFile) en un VCX existente (LScheffler) * 26/03/2017 FDBOZZO v1.19.49 Mejora cfg: Se permite indicar un archivo CFG por parámetro de cualquier directorio para anular los CFG predeterminados de los subdirectorios, para casos especiales donde sea necesario * 28/03/2017 FDBOZZO v1.19.49 Mejora vcx: Implementada sintaxis para importar o exportar clases individuales usando "classlibrary.vcx::classname::import" y "classlibrary.vcx::classname::export" * 11/04/2017 FDBOZZO v1.19.49 Bug Fix frx: Cuando dentro de una expresión se usa "&&", se corrompe el registro del FRX generado (Alejandro A Sosa) -* 11/04/2017 FDBOZZO v1.19.49 Mejora cfg : En modo objeto permitir indicar un objeto CFG en lugar de un archivo CFG (Lutz Scheffler) +* 11/04/2017 FDBOZZO v1.19.49 Mejora cfg : En modo objeto permitir indicar un objeto CFG en lugar de un archivo CFG (LScheffler) * 12/04/2017 DH&FDBOZZO v1.19.49 Bug Fix & Report pjx: No se estaba guardando el campo User en los archivos PJX (Doug Hennig) * 25/06/2017 FDBOZZO v1.19.49.1 Bug Fix tx2 v1.19.49: El campo DEVINFO usado en los PJX se estaba usando en los demás binarios, dando errores -* 02/12/2017 FDBOZZO v1.19.49.2 Bug Fix tx2 v1.19.49: No exporta los objetos a TX2 cuando se usa ClassPerFile (Lutz Scheffler) +* 02/12/2017 FDBOZZO v1.19.49.2 Bug Fix tx2 v1.19.49: No exporta los objetos a TX2 cuando se usa ClassPerFile (LScheffler) * 03/12/2017 JS&FDBOZZO v1.19.49.3 Bug Fix db2: Los campos "Double" asumen 2 decimales cuando se definen con 0 decimales (Jerry Stager) -* 04/12/2017 FDBOZZO v1.19.49.4 Cuando se usa ClassPerFile an Modo API y se importan clases simples, a veces sus nombres se toman sin comillas, provocando errores (Lutz Scheffler) +* 04/12/2017 FDBOZZO v1.19.49.4 Cuando se usa ClassPerFile an Modo API y se importan clases simples, a veces sus nombres se toman sin comillas, provocando errores (LScheffler) * 20/12/2017 DH&FDBOZZO v1.19.49.5 Bug Fix dbf: Cuando se importan datos de un DB2 a DBF (con DBF_Conversion_Support = 8), los tabs al inicio de los memo se pierden (Doug Hennig) * 04/01/2018 FDBOZZO v1.19.49.6 Bug Fix vcx/scx: FoxBin2Prg debería ignorar los registros que el diseñador de FoxPro ignora (Doug Hennig) * 04/01/2018 FDBOZZO v1.19.49.6 Bug Fix vcx/scx: Cuando se regenera la propiedad _MemberData se agregan CR/LF por cada miembro, pudiendo provocar un error de "valor muy largo" (Doug Hennnig) @@ -298,6 +298,8 @@ * 08/06/2022 LScheffler v1.19.75 Enhancement: Typo in German (JoergSchneider) * 08/06/2022 LScheffler v1.19.75 Bug Fix: Multiple text2bin and bin2text conversion on MNX causes space grow (JoergSchneider) * 13/06/2022 LScheffler v1.19.76 Bug Fix: On operation per folder, change of folder must change configuration (JoergSchneider) +* 16/03/2023 LScheffler v1.19.77 Bug Fix: Bin2Txt Operation on VCX loses leading spaces in Property Values #90 (JoergSchneider) +* 16/03/2023 LScheffler v1.19.77 Bug Fix: Txt2Bin Operation on VCX looses double ampersand in Property Values #91 (LScheffler) * * *--------------------------------------------------------------------------------------------------- @@ -347,7 +349,7 @@ * 19/11/2014 edyshor MEJORA cfg v1.19.36: DBF_Conversion_Excluded no permite comentarios && al final (Agregado en v1.19.37) * 19/11/2014 edyshor REPORTE BUG dbf v1.19.36: "String is too long to fit" cuando se procesa un DBF grande con DBF_Conversion_Support = 4 (Agregado en v1.19.37) * 19/11/2014 edyshor MEJORA dbf v1.19.36: Nuevo parámetro ClearDBFLastUpdate para evitar diferencias por este dato (Agregado en v1.19.37) -* 14/10/2014 Lutz Scheffler MEJORA v1.19.36: Permitir generar una clase por archivo (pregunta) (Agregado en v1.19.37) +* 14/10/2014 LScheffler MEJORA v1.19.36: Permitir generar una clase por archivo (pregunta) (Agregado en v1.19.37) * 21/10/2014 Ryan Harris MEJORA v1.19.36: Permitir generar una clase por archivo (sugerencia) (Agregado en v1.19.37) * 04/12/2014 Francisco Prieto MEJORA v1.19.36: Permitir hacer conversiones masivas bin2prg y prg2bin sin los scripts vbs (Agregado en v1.19.38) * 12/12/2014 Álvaro Castrillón MEJORA v1.19.36: Detección de métodos duplicados para notificar casos de corrupción (Agregado en v1.19.38) @@ -361,31 +363,31 @@ * 24/01/2015 Ryan Harris Mejora dc2 v1.19.41: Permitir ordenar los campos de vistas y tablas alfabéticamente y mantener en una lista aparte el orden real, para facilitar el diff y el merge (Agregado en v1.19.42) * 24/01/2015 Ryan Harris Mejora dc2 v1.19.41: Aplicar ClassPerFile a las conexiones, tablas, vistas y stored procedures de los DBC (Agregado en v1.19.42) * 22/01/2015 Tuvia Vinitsky Reporte bug v1.19.41: Compatibilidad con SourceSafe rota porque se genera un error al realizar la consulta para soporte de archivo (Arreglado en v1.19.42) -* 25/02/2015 Lutz Scheffler Reporte de Bug scx/vcx v1.19.41: Procesar solo un nivel de text/endtext, ya que no se admiten más niveles (Arreglado en v1.19.42) -* 25/02/2015 Lutz Scheffler Mejora v1.19.41: Hacer algunos mensajes de error más descriptivos (Agregado en v1.19.42) -* 03/03/2015 Lutz Scheffler Mejora v1.19.41: Mejoras en la traducción al alemán (Agregado en v1.19.42) -* 03/03/2015 Lutz Scheffler Mejora v1.19.41: Permitir definir el archivo de entrada con un path relativo (Agregado en v1.19.42) -* 03/03/2015 Lutz Scheffler Reporte bug scx v1.19.41: Agregada la generación del PJX/PJ2 cuando se indica "file.pjx", "*" (Agregado en v1.19.42) -* 03/03/2015 Lutz Scheffler Mejora v1.19.41: Permitir proceso multi-proyecto (*.PJX, *.PJ2) cuando se especifica "file.pjx", "*" (Agregado en v1.19.42) -* 05/03/2015 Lutz Scheffler Mejora v1.19.41: Cambiar clase de base de FoxBin2Prg de custom a session (Agregado en v1.19.42) -* 05/03/2015 Lutz Scheffler Mejora v1.19.41: Permitir procesar los archivos de un proyecto sin convertir el PJX/2 (Agregado en v1.19.42) -* 10/03/2015 Lutz Scheffler Mejora v1.19.41: Permitir configurar un CFG alternativo (Agregado en v1.19.42) -* 10/03/2015 Lutz Scheffler Mejora v1.19.41: Crear un método API get_Processed() para obtener información de los archivos procesados (Agregado en v1.19.42) -* 10/03/2015 Lutz Scheffler Mejora v1.19.41: Permitir salida de archivos procesados a stdOut (Agregado en v1.19.42) -* 23/03/2015 Lutz Scheffler Reporte bug mnx v1.19.41: No se mantiene el Pad vacío al regenerar el menú cuando se define un menu con un Pad sin nombre (Arreglado en v1.19.42) +* 25/02/2015 LScheffler Reporte de Bug scx/vcx v1.19.41: Procesar solo un nivel de text/endtext, ya que no se admiten más niveles (Arreglado en v1.19.42) +* 25/02/2015 LScheffler Mejora v1.19.41: Hacer algunos mensajes de error más descriptivos (Agregado en v1.19.42) +* 03/03/2015 LScheffler Mejora v1.19.41: Mejoras en la traducción al alemán (Agregado en v1.19.42) +* 03/03/2015 LScheffler Mejora v1.19.41: Permitir definir el archivo de entrada con un path relativo (Agregado en v1.19.42) +* 03/03/2015 LScheffler Reporte bug scx v1.19.41: Agregada la generación del PJX/PJ2 cuando se indica "file.pjx", "*" (Agregado en v1.19.42) +* 03/03/2015 LScheffler Mejora v1.19.41: Permitir proceso multi-proyecto (*.PJX, *.PJ2) cuando se especifica "file.pjx", "*" (Agregado en v1.19.42) +* 05/03/2015 LScheffler Mejora v1.19.41: Cambiar clase de base de FoxBin2Prg de custom a session (Agregado en v1.19.42) +* 05/03/2015 LScheffler Mejora v1.19.41: Permitir procesar los archivos de un proyecto sin convertir el PJX/2 (Agregado en v1.19.42) +* 10/03/2015 LScheffler Mejora v1.19.41: Permitir configurar un CFG alternativo (Agregado en v1.19.42) +* 10/03/2015 LScheffler Mejora v1.19.41: Crear un método API get_Processed() para obtener información de los archivos procesados (Agregado en v1.19.42) +* 10/03/2015 LScheffler Mejora v1.19.41: Permitir salida de archivos procesados a stdOut (Agregado en v1.19.42) +* 23/03/2015 LScheffler Reporte bug mnx v1.19.41: No se mantiene el Pad vacío al regenerar el menú cuando se define un menu con un Pad sin nombre (Arreglado en v1.19.42) * 24/03/2015 Ryan Harris Reporte bug frx/lbx v1.19.41: Hay algunos CR,LF,TAB sobrantes en las etiquetas tag de algunos archivos FR2/LB2 (Arreglado en v1.19.42) * 24/03/2015 Ryan Harris Mejora v1.19.41: Borrar archivos ERR al procesar, cuando se usa UseClassPerFile (Agregado en v1.19.42) -* 10/04/2015 Lutz Scheffler Mejora v1.19.41: Crear un método API get_DirSettings() para obtener información de seteos del directorio indicado (Agregado en v1.19.42) -* 12/04/2015 Lutz Scheffler Mejora v1.19.41: Permitir generar texto de una clase de una librería (Agregado en v1.19.42) +* 10/04/2015 LScheffler Mejora v1.19.41: Crear un método API get_DirSettings() para obtener información de seteos del directorio indicado (Agregado en v1.19.42) +* 12/04/2015 LScheffler Mejora v1.19.41: Permitir generar texto de una clase de una librería (Agregado en v1.19.42) * 15/04/2015 Mike Potjer Sugerencia v1.19.41: Los nombres de los métodos en Inglés facilitarían su entendimiento a más personas (Agregado en v1.19.42) * 22/04/2015 Ryan Harris Mejora v1.19.42: Permitir que FoxBin quite los ZOrderProps de los objetos que cambian constantemente, provocan diferencias y a veces dan problemas de objeto encima/debajo (Agregado en v1.19.43) -* 23/04/2015 Lutz Scheffler Mejora v1.19.42: Hacer que la progressbar no se convierta en la ventana de salida por defecto de los ? (Agregado en v1.19.43) +* 23/04/2015 LScheffler Mejora v1.19.42: Hacer que la progressbar no se convierta en la ventana de salida por defecto de los ? (Agregado en v1.19.43) * 28/04/2015 Ralf Wagner Reporte bug v1.19.42: FoxBin2Prg no retorna códigos de error cuando se llama como programa externo (Arreglado en v1.19.43) * 29/04/2015 Fidel Charny Reporte bug v1.19.42: FoxBin2Prg a veces genera errores OLE cuando se ejecuta más de una vez en modo objeto sobre un archivo con errores (Arreglado en v1.19.43) * 10/05/2015 Esteban Herrero Reporte bug v1.19.42: Cuando un form tiene AutoCenter=.T., hay veces en que al regenerar el binario y ejecutarlo no se muestra centrado (Arreglado en v1.19.43) * 29/04/2015 Ralf Wagner Reporte bug v1.19.43: En ciertos PCs FoxBin2Prg no retorna códigos de error cuando se llama como programa externo (Arreglado en v1.19.44) * 01/06/2015 Mike Potjer Reporte bug v1.19.44: Cuando se exporta a texto un menu que usa comillas simples o una expresión en el mensaje de las opciones, al regenerar el binario se recortan partes del mensaje de esas opciones (Arreglado en v1.19.45) -* 09/06/2015 Lutz Scheffler Reporte bug v1.19.44: Cuando se procesan múltiples archivos PJ2, puede ocurrir un error de "variable llError no definida" (Arreglado en v1.19.45) +* 09/06/2015 LScheffler Reporte bug v1.19.44: Cuando se procesan múltiples archivos PJ2, puede ocurrir un error de "variable llError no definida" (Arreglado en v1.19.45) * 13/06/2015 Matt Slay Reporte bug v1.19.44: Los proyectos PJX/PJ2 que referencian archivos de otras unidades de disco causan errores ne esos archivos al procesar con las opciones "*" o "*-" (Arreglado en v1.19.45) * 29/07/2015 Dave Crozier Reporte bug v1.19.45: Cuando se procesa un directorio o un proyecto con todos los archivos, a veces puede ocurrir el error "Alias already in use" (Arreglado en v1.19.46) * 29/07/2015 Walter Nicholls Mejora DBF-Data v1.19.45: Permitir exportar e importar datos de los DBF @@ -393,7 +395,7 @@ * 09/09/2015 Aurélien Dellieux Mejora v1.19.45: El objeto WSscript.Shell da problemas en algunos entornos o bajo ciertas condiciones (Cambiado en v1.19.46) * 11/09/2015 Ryan Harris Reporte bug Frx/Lbx v1.19.45: El ordenamiento de registros de los reportes cambia el orden Z de los objetos próximos que se solapan, pudiendo causar que se visualicen mal (Arreglado en v1.19.46) * 17/09/2015 Ryan Harris Reporte bug Frx/Lbx v1.19.45: Cuando se regeneran reportes o etiquetas con textos multilinea alineados al centro o a la derecha, la alineación no es completamente correcta (Arreglado en v1.19.46) -* 11/10/2015 Lutz Scheffler Reporte bug Frx/Lbx v1.19.45: Cuando se agrupan controles en diseño y se convierte a texto, al regenerar se pierden las agrupaciones (Arreglado en v1.19.46 Preview-7) +* 11/10/2015 LScheffler Reporte bug Frx/Lbx v1.19.45: Cuando se agrupan controles en diseño y se convierte a texto, al regenerar se pierden las agrupaciones (Arreglado en v1.19.46 Preview-7) * 04/11/2015 Ralf Wagner Reporte bug Pjx v1.19.45: Los archivos SPR y MPR no estan bien representados en la información del proyecto (Arreglado en v1.19.46 Preview-8) * 20/11/2015 EddieC Reporte bug Pjx v1.19.45: Se genera un error al regenerar un PJX desde un PJ2 donde algún archivo contiene paréntesis (Arreglado en v1.19.46 Preview-9) * 24/11/2015 edyshor Mejora dbf v1.19.45: Nuevo parámetro ExcludeDBFAutoincNextval para evitar diferencias por este dato (Agregado en v1.19.46 Preview-9) @@ -406,14 +408,14 @@ * 10/07/2016 Nathan Brown Reporte defecto v1.19.48-Preview3: Cuando se arregló el bug del memo multi-línea, se introdujo un nuevo defecto por el cual un memo de linea-simple se decodifica mal (Arreglado en v1.19.48 Preview-4) * 11/07/2016 Nathan Brown Reporte bug pj2 v1.19.48-Preview4: Cuando se regenera el binario de un PJ2 con archivos en una ruta con paréntesis y espacios, se genera un error "Error 36, Command contains unrecognized phrase/keyword" (Arreglado en v1.19.48 Preview-5) * 11/07/2016 Nathan Brown Reporte bug frx v1.19.48-Preview5: Los ControlSource de objetos OLE que contienen comillas se generan mal (Arreglado en v1.19.48 Preview-6) -* 23/03/2017 Lutz Scheffler Reporte bug vcx v1.19.48: No funciona la generación de una clase individual con "classlib.vcx::classname" (Arreglado en v1.19.49) -* 23/03/2017 Lutz Scheffler Mejora vcx v1.19.48: Poder importar una clase (VC2 generado con ClassPerFile) en un VCX existente (Agragado en v1.19.49) +* 23/03/2017 LScheffler Reporte bug vcx v1.19.48: No funciona la generación de una clase individual con "classlib.vcx::classname" (Arreglado en v1.19.49) +* 23/03/2017 LScheffler Mejora vcx v1.19.48: Poder importar una clase (VC2 generado con ClassPerFile) en un VCX existente (Agragado en v1.19.49) * 30/03/2017 Alejandro A Sosa Reporte bug frx v1.19.48: Cuando dentro de una expresión se usa "&&", se corrompe el registro del FRX generado (Arreglado en v1.19.49) -* 28/03/2017 Lutz Scheffler Mejora cfg v1.19.48: En modo objeto permitir indicar un objeto CFG en lugar de un archivo CFG (Agragado en v1.19.49) +* 28/03/2017 LScheffler Mejora cfg v1.19.48: En modo objeto permitir indicar un objeto CFG en lugar de un archivo CFG (Agragado en v1.19.49) * 06/04/2017 Doug Hennig Reporte Bug y arreglo parcial PJX v1.19.48: No se estaba guardando el campo User en los archivos PJX (Agregado en v1.19.49) -* 28/11/2017 Lutz Scheffler Reporte Bug vx2 v1.19.49: No exporta los objetos a VX2 cuando se usa ClassPerFile (Arreglado en v1.19.49.2) +* 28/11/2017 LScheffler Reporte Bug vx2 v1.19.49: No exporta los objetos a VX2 cuando se usa ClassPerFile (Arreglado en v1.19.49.2) * 31/08/2017 Jerry Stager Reporte bug db2 v1.19.48: Los campos "Double" asumen 2 decimales cuando se definen con 0 decimales (Agregado en v1.19.49.3) -* 03/12/2017 Lutz Scheffler Reporte Bug vx2 v1.19.49: Cuando se usa ClassPerFile an Modo API y se importan clases simples, a veces sus nombres se toman sin comillas, provocando errores (Arreglado en v1.19.49.4) +* 03/12/2017 LScheffler Reporte Bug vx2 v1.19.49: Cuando se usa ClassPerFile an Modo API y se importan clases simples, a veces sus nombres se toman sin comillas, provocando errores (Arreglado en v1.19.49.4) * 18/12/2017 Doug Hennnig Reporte Bug dbf v1.19.49: Cuando se importan datos de un DB2 a DBF (con DBF_Conversion_Support = 8), los tabs al inicio de los memo se pierden (Arreglado en v1.19.49.5) * 04/01/2018 Doug Hennnig Reporte Bug vcx/scx v1.19.49: FoxBin2Prg debería ignorar los registros que el diseñador de FoxPro ignora (Arreglado en v1.19.49.6) * 04/01/2018 Doug Hennnig Reporte Bug vcx/scx v1.19.49: Cuando se regenera la propiedad _MemberData se agregan CR/LF por cada miembro, pudiendo provocar un error de "valor muy largo" (Arreglado en v1.19.49.6) @@ -431,20 +433,20 @@ * 13/11/2019 Eric Selje Reporte Bug v1.19.51: Incompatible with VFPA (#36) (Se arregla en v1.19.51.6) * 31/03/2020 Ryan Harris Reporte Bug v1.19.51: Si alguno de los archivos-por-clase no tiene CR_LF al final, al ensamblar la clase se pueden superponer instrucciones de forma inválida (Se arregla en v1.19.51.6) * 01/04/2020 FDBOZZO Bug report v1.19.51 No se respetan las propiedades de VCX/SCX con nombre "note" (Tracy Pearson) -* 14/02/2021 Lutz Scheffler Bug report v1.19.51 conversion dbf -> prg, error if only test mode (toFoxBin2Prg.l_ProcessFiles is false) -* 14/02/2021 Lutz Scheffler Bug report v1.19.51 conversion prg -> dbf, fields with .NULL. value are incorectly recreated -* 15/02/2021 Lutz Scheffler Bug report v1.19.52 processing directory, flush log file after loop instead of file -* 16/02/2021 Lutz Scheffler Bug report v1.19.52 conversion prg -> vcx, files per class could create one class multiple times -* 03/03/2021 Lutz Scheffler Bug report v1.19.53 DBF_Conversion_Condition, problem with macro expansion -* 04/03/2021 Lutz Scheffler Bug report v1.19.55 Inputfile in form classlib.class.vc2 AND RedirectClassType = 1 and Execute param tcRecompile = 1 +* 14/02/2021 LScheffler Bug report v1.19.51 conversion dbf -> prg, error if only test mode (toFoxBin2Prg.l_ProcessFiles is false) +* 14/02/2021 LScheffler Bug report v1.19.51 conversion prg -> dbf, fields with .NULL. value are incorectly recreated +* 15/02/2021 LScheffler Bug report v1.19.52 processing directory, flush log file after loop instead of file +* 16/02/2021 LScheffler Bug report v1.19.52 conversion prg -> vcx, files per class could create one class multiple times +* 03/03/2021 LScheffler Bug report v1.19.53 DBF_Conversion_Condition, problem with macro expansion +* 04/03/2021 LScheffler Bug report v1.19.55 Inputfile in form classlib.class.vc2 AND RedirectClassType = 1 and Execute param tcRecompile = 1 * generates classlib.class.vcx and tries to recompile classlib.vcx * fails silent if classlib.vcx exists (compiles wrong lib), with message if not. -* 05/03/2021 Lutz Scheffler Bug report v1.19.56 For RedirectClassType = 2, Path was set wrong -* 09/03/2021 Lutz Scheffler Bug report v1.19.57 For RedirectClassType = 2, Path was set wrong -* 09/03/2021 Lutz Scheffler Bug report v1.19.57 RedirectClassType = 2, UseClassPerFile = 2 failed. -* 22/03/2021 Lutz Scheffler Bug report v1.19.59 DBF_Conversion_Condition was read, but never used -* 22/03/2021 Lutz Scheffler Bug report v1.19.59 DBF_Conversion_Order sets an index that later would be stored as structural index -* 22/03/2021 Lutz Scheffler Bug report v1.19.59 config options with text value fail, if line comment is set +* 05/03/2021 LScheffler Bug report v1.19.56 For RedirectClassType = 2, Path was set wrong +* 09/03/2021 LScheffler Bug report v1.19.57 For RedirectClassType = 2, Path was set wrong +* 09/03/2021 LScheffler Bug report v1.19.57 RedirectClassType = 2, UseClassPerFile = 2 failed. +* 22/03/2021 LScheffler Bug report v1.19.59 DBF_Conversion_Condition was read, but never used +* 22/03/2021 LScheffler Bug report v1.19.59 DBF_Conversion_Order sets an index that later would be stored as structural index +* 22/03/2021 LScheffler Bug report v1.19.59 config options with text value fail, if line comment is set * 16/03/2021 msueping BUG REPORT v1.19.57 Variable lnFileCount in get_filesfromdirectory * 30/03/2021 Sergej s-s-a BUG REPORT v1.19.61 Ignoring extention in foxbin2prg.cfg * 08/04/2021 jstagerGH BUG REPORT v1.19.62 Tables without indexes cause an error that the "Table ## is not marked as belonging to the ## database" @@ -470,6 +472,8 @@ * 08/06/2022 JoergSchneider Bug REPORT v1.19.74 Typo in German (JoergSchneider) * 08/06/2022 JoergSchneider Bug REPORT v1.19.74 Multiple text2bin and bin2text conversion on MNX causes space grow (JoergSchneider) * 10/06/2022 JoergSchneider Bug REPORT v1.19.75 On operation per folder, change of folder must change configuration (JoergSchneider) +* 16/03/2023 JoergSchneider Bug REPORT v1.19.76 Bin2Txt Operation on VCX loses leading spaces in Property Values #90 (JoergSchneider) +* 16/03/2023 LScheffler Bug REPORT v1.19.76 Txt2Bin Operation on VCX looses double ampersand in Property Values #91 (LScheffler) * * *--------------------------------------------------------------------------------------------------- @@ -551,6 +555,13 @@ Lparameters tc_InputFile, tcType, tcTextName, tlGenText, tcDontShowErrors, tcDeb #Define C_DEFINED_PAM_F '*' #Define C_LEN_DEFINED_PAM_I Len(C_DEFINED_PAM_I) #Define C_LEN_DEFINED_PAM_F Len(C_DEFINED_PAM_F) +*SF 16.03.2023 +*mark property value section in classes, objects and forms +#Define C_DEFINED_PROPVAL_I '*' +#Define C_DEFINED_PROPVAL_F '*' +#Define C_LEN_DEFINED_PROPVAL_I Len(C_DEFINED_PROPVAL_I) +#Define C_LEN_DEFINED_PROPVAL_F Len(C_DEFINED_PROPVAL_F) +*/SF 16.03.2023 #Define C_END_OBJECT_I '*< END OBJECT:' #Define C_END_OBJECT_F '/>' #Define C_LEN_END_OBJECT_I Len(C_END_OBJECT_I) @@ -671,7 +682,7 @@ Lparameters tc_InputFile, tcType, tcTextName, tlGenText, tcDontShowErrors, tcDeb #Define C_RECORDS_F '' #Define C_RECORD_I '' && *** FDBOZZO 2016/06/06: Quitado el REGNUM para evitar diferencias innecesarias #Define C_RECORD_F '' -#Define C_DEL_RECORD_I '' && *** Lutz Scheffler 2021/02/20: Deleted Record, just mark like this, no fuzz with field name +#Define C_DEL_RECORD_I '' && *** LScheffler 2021/02/20: Deleted Record, just mark like this, no fuzz with field name #Define C_DEL_RECORD_F '' #Define C_RECNO_I '' #Define C_RECNO_F '' @@ -754,7 +765,7 @@ Local lnResp, loEx As Exception tc_InputFile = Evl(tc_InputFile,'') tcType = Evl(tcType,'') -*!* Changed by: Lutz Scheffler 15.2.2021 +*!* Changed by: LScheffler 15.2.2021 *!* change date="{^2021-02-15,18:44:00}" * added option to create config files If Atc('-BIN2PRG','-'+tc_InputFile) > 0 Or Atc('-PRG2BIN','-'+tc_InputFile) > 0 ; @@ -783,7 +794,7 @@ Do Case tcType = "" Endcase -*!* /Changed by: Lutz Scheffler 15.2.2021 +*!* /Changed by: LScheffler 15.2.2021 Try loEx = Null @@ -985,7 +996,7 @@ Define Class c_foxbin2prg As Session Protected n_CFG_Actual, l_Main_CFG_Loaded, o_Configuration, l_CFG_CachedAccess *-- n_FB2PRG_Version = 1.19 - c_FB2PRG_Version_Real = '1.19.76' + c_FB2PRG_Version_Real = '1.19.77' *-- c_Language = '' && EN, FR, ES, DE c_Language_In = '(auto)' @@ -1030,7 +1041,7 @@ Define Class c_foxbin2prg As Session l_Recompile = .T. n_PRG_Compat_Level = 0 && 0=COMPATIBLE WITH FoxBin2Prg v1.19.49 and earlier, 1=Include HELPSTRING n_ExcludeDBFAutoincNextval = 0 -*!* Changed by: Lutz Scheffler 21.02.2021 +*!* Changed by: LScheffler 21.02.2021 *!* change date="{^2021-02-21,10:57:00}" * additional options controlling * - splitt of DBC separated from VCX/SCX @@ -1041,7 +1052,7 @@ Define Class c_foxbin2prg As Session l_ItemPerDBCCheck = .F. l_DBF_BinChar_Base64 = .T. l_DBF_IncludeDeleted = .F. -*!* /Changed by: Lutz Scheffler 21.02.2021 +*!* /Changed by: LScheffler 21.02.2021 n_UseClassPerFile = 0 n_PRG_Compat_Level = 0 && 0=COMPATIBLE WITH FoxBin2Prg v1.19.49 and earlier, 1=Include HELPSTRING n_ExcludeDBFAutoincNextval = 0 @@ -1162,9 +1173,9 @@ Define Class c_foxbin2prg As Session This.c_Foxbin2prg_ConfigFile = Evl( tcCFG_File, Forceext( This.c_Foxbin2prg_FullPath, 'CFG' ) ) This.c_BackgroundImage = This.get_AbsolutePath( Addbs(Justpath(This.c_Foxbin2prg_FullPath)) + 'foxbin2prg.jpg' ) lc_Foxbin2prg_EXE = Forceext( This.c_Foxbin2prg_FullPath, 'EXE' ) -*!* Changed by: Lutz Scheffler 30.8.2021 +*!* Changed by: LScheffler 30.8.2021 *!* -*!* Changed by: Lutz Scheffler
+*!* Changed by: LScheffler
*!* https://github.com/fdbozzo/foxbin2prg/issues/69 / Incorrect version showing for v1.19.65 *!* Set version number to This.c_FB2PRG_Version_Real and ignore Exe *!*
@@ -1173,7 +1184,7 @@ Define Class c_foxbin2prg As Session * This.c_FB2PRG_EXE_Version = 'v' + Iif( Agetfileversion( laValues, lc_Foxbin2prg_EXE ) = 0, Transform(This.c_FB2PRG_Version_Real), laValues(11) ) This.c_FB2PRG_EXE_Version = 'v' + Transform(This.c_FB2PRG_Version_Real) -*!* /Changed by Lutz Scheffler 30.8.2021 +*!* /Changed by LScheffler 30.8.2021 AddProperty(_Screen, 'c_FB2PRG_EXE_Version', This.c_FB2PRG_EXE_Version) AddProperty(_Screen, 'ExitCode', 0) @@ -1497,7 +1508,7 @@ Define Class c_foxbin2prg As Session Endproc -*!* Changed by: Lutz Scheffler 21.02.2021 +*!* Changed by: LScheffler 21.02.2021 *!* change date="{^2021-02-21,10:57:00}" * additional options controlling * - splitt of DBC separated from VCX/SCX @@ -1563,7 +1574,7 @@ Define Class c_foxbin2prg As Session Return Nvl( This.o_Configuration( This.n_CFG_Actual ).c_Language_In, This.c_Language_In ) Endif Endproc -*!* /Changed by: Lutz Scheffler 21.02.2021 +*!* /Changed by: LScheffler 21.02.2021 Procedure l_RedirectClassPerFileToMain_ACCESS @@ -2604,7 +2615,7 @@ Define Class c_foxbin2prg As Session *-------- setting for container files (not pjx) -------- *Classes and forms ( vcx / scx) -*!* Changed by: Lutz Scheffler 21.02.2021 +*!* Changed by: LScheffler 21.02.2021 *!* change date="{^2021-02-21,10:57:00}" * additional options controlling * - splitt of DBC separated from VCX/SCX @@ -2641,9 +2652,9 @@ Define Class c_foxbin2prg As Session .writeLog( C_TAB + Justfname(lcConfigFile) + ' => RedirectFilePerDBCToMain: ' + Transform(lcValue) ) Endif Endif -*!* /Changed by: Lutz Scheffler 21.02.2021 +*!* /Changed by: LScheffler 21.02.2021 -*!* Changed by: Lutz Scheffler 04.3.2021 +*!* Changed by: LScheffler 04.3.2021 *!* change date="{^2021-03-04,13:12:00}" * new value 2, just add one class Case Left( laConfig(m.I), 18 ) == Lower('RedirectClassType:') @@ -2652,7 +2663,7 @@ Define Class c_foxbin2prg As Session lo_CFG.n_RedirectClassType = Int( Val( lcValue ) ) .writeLog( C_TAB + Justfname(lcConfigFile) + ' > RedirectClassType: ' + Transform(lcValue) ) Endif -*!* /Changed by: Lutz Scheffler 04.3.2021 +*!* /Changed by: LScheffler 04.3.2021 *Databases Case Left( laConfig(m.I), 15 ) == Lower('OldFilesPerDBC:') @@ -2875,7 +2886,7 @@ Define Class c_foxbin2prg As Session Endcase .writeLog( C_TAB + 'Debug: ' + Transform(.n_Debug) ) -* SF, 2021/030/06: added DH HomeDir option +* LScheffler, 2021/030/06: added DH HomeDir option .writeLog( C_TAB + 'HomeDir: ' + Transform(.n_HomeDir) ) *Conversion operation by type @@ -2898,7 +2909,7 @@ Define Class c_foxbin2prg As Session .writeLog( C_TAB + 'RedirectClassType: ' + Transform(.n_RedirectClassType) ) *Databases -*!* Changed by: Lutz Scheffler 21.02.2021 +*!* Changed by: LScheffler 21.02.2021 *!* change date="{^2021-02-21,10:57:00}" * additional options controlling * - split of DBC separated from VCX/SCX @@ -2909,7 +2920,7 @@ Define Class c_foxbin2prg As Session .writeLog( C_TAB + 'ItemPerDBCCheck: ' + Transform(.l_ItemPerDBCCheck) ) .writeLog( C_TAB + 'DBF_BinChar_Base64: ' + Transform(.l_DBF_BinChar_Base64) ) .writeLog( C_TAB + 'DBF_IncludeDeleted: ' + Transform(.l_DBF_IncludeDeleted) ) -*!* /Changed by: Lutz Scheffler 21.02.2021 +*!* /Changed by: LScheffler 21.02.2021 *general files .writeLog( C_TAB + 'NoTimestamps: ' + Transform(.l_NoTimestamps) ) @@ -3122,7 +3133,7 @@ Define Class c_foxbin2prg As Session This.writeLog(' ' + Justfname(lcTableCFG) + ' > DBF_Conversion_Condition: ' + to_out_DBF_CFG.DBF_Conversion_Condition ) Endif -*!* Changed by: Lutz Scheffler 18.03.2021 +*!* Changed by: LScheffler 18.03.2021 *!* change date="{^2021-03-18,10:57:00}" * additional options controlling * - new operations of DBF, additional list of non structural index files @@ -3131,13 +3142,13 @@ Define Class c_foxbin2prg As Session If tlGenerateLog Then This.writeLog(' ' + Justfname(lcTableCFG) + ' >DBF_IndexList: ' + Transform(to_out_DBF_CFG.DBF_IndexList) ) Endif -*!* /Changed by: Lutz Scheffler 18.03.2021 +*!* /Changed by: LScheffler 18.03.2021 -*!* Changed by: Lutz Scheffler 21.02.2021 +*!* Changed by: LScheffler 21.02.2021 *!* change date="{^2021-02-21,10:57:00}" * additional options controlling * - new operations of DBF -*!* /Changed by: Lutz Scheffler 21.02.2021 +*!* /Changed by: LScheffler 21.02.2021 Case Left( lcConfigItem, 19 ) == Lower('DBF_BinChar_Base64:') lcValue = Alltrim( Substr( laConfig(m.I), 20 ) ) If Inlist( m.lcValue, '0', '1' ) Then @@ -3155,7 +3166,7 @@ Define Class c_foxbin2prg As Session This.writeLog(' ' + Justfname(lcTableCFG) + ' > DBF_IncludeDeleted: ' + Transform(to_out_DBF_CFG.l_DBF_IncludeDeleted) ) Endif Endif -*!* /Changed by: Lutz Scheffler 21.02.2021 +*!* /Changed by: LScheffler 21.02.2021 Endcase Endfor @@ -3217,9 +3228,9 @@ Define Class c_foxbin2prg As Session loDBF_CFG = Null lcExt = Upper(Justext('.' + tcFileName)) -*!* Changed by: Lutz Scheffler 13.6.2022 +*!* Changed by: LScheffler 13.6.2022 *!* -*!* Changed by: Lutz Scheffler
+*!* Changed by: LScheffler
*!* https://github.com/fdbozzo/foxbin2prg/issues/56 / Configfile is ignored if foldername has "." v1.19.74 *!* On operation per folder, change of folder must change configuration *!* this method does not recieve tcDir in such case @@ -3243,7 +3254,7 @@ Define Class c_foxbin2prg As Session lcDir = Justpath( tcFileName ) Endcase -*!* /Changed by: Lutz Scheffler 13.6.2022 +*!* /Changed by: LScheffler 13.6.2022 If Not Empty(lcDir) .evaluateConfiguration( '', '', '', '', '', '', '', '', lcDir, 'D' ) @@ -3280,9 +3291,9 @@ Define Class c_foxbin2prg As Session loDBF_CFG = Null lcExt = Upper(Justext('.' + tcFileName)) -*!* Changed by: Lutz Scheffler 13.6.2022 +*!* Changed by: LScheffler 13.6.2022 *!* -*!* Changed by: Lutz Scheffler
+*!* Changed by: LScheffler
*!* https://github.com/fdbozzo/foxbin2prg/issues/56 / Configfile is ignored if foldername has "." v1.19.74 *!* On operation per folder, change of folder must change configuration *!* this method does not recieve tcDir in such case @@ -3306,8 +3317,8 @@ Define Class c_foxbin2prg As Session lcDir = Justpath( tcFileName ) Endcase -*!* /Changed by: Lutz Scheffler 13.6.2022 - +*!* /Changed by: LScheffler 13.6.2022 + If Not Empty(lcDir) .evaluateConfiguration( '', '', '', '', '', '', '', '', lcDir, 'D' ) Endif @@ -3580,14 +3591,14 @@ Define Class c_foxbin2prg As Session *-- ARCHIVO DE CONFIGURACIÓN PRINCIPAL -*!* Changed by: Lutz Scheffler 09.3.2021 +*!* Changed by: LScheffler 09.3.2021 *!* change date="{^2021-03-09,08:06:00}" * log settings for tcCFG_File - cfg as object .evaluateConfiguration( @tcDontShowProgress, @tcDontShowErrors, @tcNoTimestamps, @tcDebug, @tcRecompile, @tcBackupLevels ; , @tcClearUniqueID, @tcOptimizeByFilestamp, @tc_InputFile, @lcInputFile_Type, , Vartype(tcCFG_File) = "O" ) -*!* /Changed by: Lutz Scheffler 09.3.2021 +*!* /Changed by: LScheffler 09.3.2021 -*!* Changed by: Lutz Scheffler 04.3.2021 +*!* Changed by: LScheffler 04.3.2021 *!* change date="{^2021-03-04,13:25:00}" * for Input file in the form file[.baseclass].class.vc2 (normaly sc2 too, but no support in old code) * allow to import only the class to file.VCX with n_RedirectClassType = 2 @@ -3622,7 +3633,7 @@ Define Class c_foxbin2prg As Session Otherwise * not handled Endcase -*!* /Changed by: Lutz Scheffler 04.3.2021 +*!* /Changed by: LScheffler 04.3.2021 * Redefinir nombre archivo de entrada según el tipo de conversión (IMPORT/EXPORT) If .c_ClassOperationType = 'I' @@ -3650,7 +3661,7 @@ Define Class c_foxbin2prg As Session Messagebox( loLang.C_FOXBIN2PRG_JUST_VFP_9_LOC, 0+64+4096, 'FoxBin2Prg ' + This.c_FB2PRG_EXE_Version + ': ' + loLang.C_FOXBIN2PRG_WARN_CAPTION_LOC + ' (' + .c_Language + ')', 60000 ) lnCodError = 1 -*!* Changed by: Lutz Scheffler 15.2.2021 +*!* Changed by: LScheffler 15.2.2021 *!* change date="{^2021-02-15,18:44:00}" * added option to create config files Case ( m.lcType=='-t' Or m.lcType=='t' ) And ( Vartype( m.tc_InputFile )='C' And !Empty( m.tc_InputFile ) ) @@ -3661,9 +3672,9 @@ Define Class c_foxbin2prg As Session tc_InputFile = Iif( Vartype( m.tc_InputFile )='C' And !Empty( m.tc_InputFile ), m.tc_InputFile, 'FoxBin2Prg._cfg' ) loLang = _Screen.o_FoxBin2Prg_Lang Strtofile( Strtran( '*' + Strtran( m.loLang.C_FOXBIN2PRG_SYNTAX_INFO_EXAMPLE_LOC_cfg, 0h0D0A, 0h0D0A + '*'), 0h0D0A + '*' + 0h0D0A, 0h0D0A0D0A), m.tc_InputFile ) -*!* /Changed by: Lutz Scheffler 15.2.2021 +*!* /Changed by: LScheffler 15.2.2021 -*!* Changed by: Lutz Scheffler 07.3.2021 +*!* Changed by: LScheffler 07.3.2021 *!* change date="{^2021-03-07,18:44:00}" * added option to create config files with values Case ( m.lcType=='-C' Or m.lcType=='C' ) @@ -3900,7 +3911,7 @@ Define Class c_foxbin2prg As Session Strtofile( m.lcText, m.tc_InputFile ) -*!* /Changed by: Lutz Scheffler 07.3.2021 +*!* /Changed by: LScheffler 07.3.2021 Case Empty(tc_InputFile) *-- (Ejemplo de sintaxis y uso) @@ -3914,7 +3925,7 @@ Define Class c_foxbin2prg As Session *-- EJECUCIÓN NORMAL - If (Atc('-INTERACTIVE', ('-' + tcType)) > 0 OR Atc('-?', ('-' + tcType)) > 0 ); + If (Atc('-INTERACTIVE', ('-' + tcType)) > 0 Or Atc('-?', ('-' + tcType)) > 0 ); AND Atc('-BIN2PRG', ('-' + tcType)) = 0 And Atc('-PRG2BIN', ('-' + tcType)) = 0 ; AND lcInputFile_Type == C_FILETYPE_DIRECTORY Then *-- Se seleccionó un directorio y se puede elegir: Bin2Txt, Txt2Bin y Nada @@ -3947,8 +3958,6 @@ Define Class c_foxbin2prg As Session Endcase Endif -*sf 2022 06 13 -*SET STEP ON *-- Evaluación de FileSpec de entrada Do Case Case Atc('-BIN2PRG', ('-' + tcType)) = 0 And Atc('-PRG2BIN', ('-' + tcType)) = 0 ; @@ -4108,7 +4117,7 @@ Define Class c_foxbin2prg As Session .updateProgressbar( loLang.C_PROCESSING_LOC + ' ' + lcFile + '...', m.I, lnFileCount, 0 ) lnCodError = .convert( lcFile, @toModulo, @toEx, .F., tcOriginalFileName ) -*!* Changed by: Lutz Scheffler 15.2.2021 +*!* Changed by: LScheffler 15.2.2021 *!* change date="{^2021-02-15,06:57:00}" * flushing the log after each file let us only see last file * why ever, it should be appended, but we simply move @@ -4125,7 +4134,7 @@ Define Class c_foxbin2prg As Session Endcase Endfor && I = 1 TO lnFileCount .writeLog_Flush() -*!* /Changed by: Lutz Scheffler 15.2.2021 +*!* /Changed by: LScheffler 15.2.2021 .updateProgressbar( loLang.C_END_OF_PROCESS_LOC, lnFileCount, lnFileCount, 0 ) Exit @@ -4178,7 +4187,7 @@ Define Class c_foxbin2prg As Session .updateProgressbar( loLang.C_PROCESSING_LOC + ' ' + lcFile + '...', m.I, lnFileCount, 0 ) lnCodError = .convert( lcFile, @toModulo, @toEx, .F., tcOriginalFileName ) -*!* Changed by: Lutz Scheffler 15.2.2021 +*!* Changed by: LScheffler 15.2.2021 *!* change date="{^2021-02-15,06:57:00}" * flushing the log after each file let us only see last file * why ever, it should be appended, but we simply move @@ -4195,7 +4204,7 @@ Define Class c_foxbin2prg As Session Endcase Endfor && I = 1 TO lnFileCount .writeLog_Flush() -*!* /Changed by: Lutz Scheffler 15.2.2021 +*!* /Changed by: LScheffler 15.2.2021 .updateProgressbar( loLang.C_END_OF_PROCESS_LOC, lnFileCount, lnFileCount, 0 ) Exit @@ -4748,7 +4757,7 @@ Define Class c_foxbin2prg As Session lcForceAttribs = lcForceAttribs + '-R' Endif -*!* Changed by: Lutz Scheffler 03.03.2021 +*!* Changed by: LScheffler 03.03.2021 *!* change date="{^2021-03-03,11:38:00}" * Added option for DBC split @@ -4777,7 +4786,7 @@ Define Class c_foxbin2prg As Session If '.' $ Juststem(.c_InputFile) .c_InputFile = lc_BaseFile Endif -** SF, Problem, Fehler: DC2 hier nicht, das muss anders mit UseFilesPerDBC +** LScheffler, Problem, Fehler: DC2 hier nicht, das muss anders mit UseFilesPerDBC Case .n_UseClassPerFile = 2 And Inlist(lcExtension,.c_VC2,.c_SC2) If Occurs('.', Juststem(.c_InputFile)) = 0 Then lc_BaseFile = .c_InputFile @@ -4813,7 +4822,7 @@ Define Class c_foxbin2prg As Session Endif -*!* /Changed by: Lutz Scheffler 03.03.2021 +*!* /Changed by: LScheffler 03.03.2021 Erase ( .c_InputFile + '.ERR' ) @@ -7125,7 +7134,7 @@ Define Class c_conversor_base As Custom Set Safety Off Set Multilocks On Set TablePrompt Off -*!* Changed by: Lutz Scheffler 21.02.2021 +*!* Changed by: LScheffler 21.02.2021 *!* change date="{^2021-02-21,10:57:00}" * Operation set to standard value * anywhere else it will respect this to, @@ -7133,7 +7142,7 @@ Define Class c_conversor_base As Custom * SET BLOCKSIZE TO 0 -*!* /Changed by: Lutz Scheffler 21.02.2021 +*!* /Changed by: LScheffler 21.02.2021 Set Exact On If Not Empty( On("ESCAPE") ) Then @@ -7916,7 +7925,21 @@ Define Class c_conversor_base As Custom If '=' $ tcAsignacion ln_AT_Cmt = At( '=', tcAsignacion) tcPropName = Alltrim( Left( tcAsignacion, ln_AT_Cmt - 2 ), 0, ' ', Chr(9) ) && Quito espacios y TABS - tcValue = Ltrim( Substr( tcAsignacion, ln_AT_Cmt + 2 ) ) +*!* Changed by: LScheffler 16.3.2023 +*!* +*!* Changed by: LScheffler
+*!* Problems with property values with leading and trailing spaces +*!* and with double ampersand in value +*!* we just do not LTRIM so we keep the leading space here +*!* and we start after the space after the equal sign.
+*!* see issues #90, #91 +*!*
+*!*
+ +* tcValue = Ltrim( Substr( tcAsignacion, ln_AT_Cmt + 2 ) ) + tcValue = Substr( tcAsignacion, ln_AT_Cmt + 2 ) + +*!* /Changed by: LScheffler 16.3.2023 If Pcount() > 3 *-- EVALUAR UNA ASIGNACIÓN QUE PUEDE SER MULTILÍNEA (memberdata, fb2p_value, etc) @@ -8199,7 +8222,7 @@ Define Class c_conversor_base As Custom *TEXT TO lcValue TEXTMERGE ADDITIVE NOSHOW FLAGS 1+2 PRETEXT 1+2 * <<>> <', m.I, 1+4 ), CR_LF, ' ' )>> *ENDTEXT - lcValue = lcValue + Chr(13) + Chr(10) + Chr(9) + Chr(9) + Chrtran( Strextract( tcValue, '', m.I, 1+4 ), CR_LF, ' ' ) + lcValue = lcValue + Chr(13) + Chr(10) + Chr(9) + Chr(9) + Chr(9) + Chrtran( Strextract( tcValue, '', m.I, 1+4 ), CR_LF, ' ' ) Endfor TEXT TO tcValue TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 @@ -10291,7 +10314,96 @@ Define Class c_conversor_prg_a_bin As c_conversor_base Return llBloqueEncontrado Endproc +*!* Changed by: LScheffler 16.3.2023 +*!* +*!* Changed by: LScheffler
+*!* get the newly introduced Class-property-value-block +*!*
+*!*
+ Procedure analyzeCodeBlock_DEFINED_PROPVAL + +*-------------------------------------------------------------------------------------------------------------- +* 16/03/2023 LutzScheffler old version (pre v1.19.77) stored the comment on the property value, so it was impossible to to keep && in value +* the method is basically a copy of analyzeCodeBlock_DEFINED_PAM +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (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 + +*-- Structur to store properties without comment +*(versions older then 1.19.77 are without this section, and values with trailing inline) +* +*Property = Property_Value +*Number: +*prop1 = 0 +*String: +*prop2 = Number +*String with leading and trailing space: +*prop3 = with spaces +*String with inline comment: +*prop4 = with && text +*Property = Property_Expression (in Property sheet as =....) +*prop5 = (Expression after =) +*_memberdata +*_memberdata = .. +* + + #If .F. + Local toClase As CL_CLASE Of 'FOXBIN2PRG.PRG' + #Endif + + Try + Local llBloqueEncontrado, lcPAM_Type + LOCAL lcProp, lcValue + + + If Left( tcLine, C_LEN_DEFINED_PROPVAL_I) == C_DEFINED_PROPVAL_I + llBloqueEncontrado = .T. + + With This As c_conversor_prg_a_bin Of foxbin2prg.prg + For I = m.I + 1 To tnCodeLines + .set_Line( @tcLine, @taCodeLines, m.I ) + + Do Case + Case Left( tcLine, C_LEN_DEFINED_PROPVAL_F ) == C_DEFINED_PROPVAL_F + I = m.I + 1 + Exit + + Otherwise + .get_SeparatedPropAndValue( tcLine, @lcProp, @lcValue, @toClase, @taCodeLines, tnCodeLines, @m.I ) + toClase.add_Property( @lcProp, @lcValue, "" ) + + Endcase + Endfor + Endwith && THIS + +*-- Junto propiedades y los métodos al final. + I = m.I - 1 + Endif + + Catch To loEx + lnCodError = loEx.ErrorNo + + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif + + Throw + + Finally + Release toClase, tcLine, taCodeLines, tnCodeLines, I + Endtry + + Return llBloqueEncontrado + Endproc + +*!* /Changed by: LScheffler 16.3.2023 Procedure analyzeCodeBlock_DEFINE_CLASS @@ -10322,6 +10434,7 @@ Define Class c_conversor_prg_a_bin As c_conversor_base Local llBloqueEncontrado +*toModulo If Upper(Left(tcLine + ' ', 13)) == C_DEFINE_CLASS + ' ' Try llBloqueEncontrado = .T. @@ -10407,6 +10520,9 @@ Define Class c_conversor_prg_a_bin As c_conversor_base Case Not llDEFINED_PAM_Completed And .analyzeCodeBlock_DEFINED_PAM( @toClase, @tcLine, @taCodeLines, tnCodeLines, @m.I ) llDEFINED_PAM_Completed = .T. + Case Not llCLASS_PROPERTY_Completed And .analyzeCodeBlock_DEFINED_PROPVAL( @toClase, @tcLine, @taCodeLines, tnCodeLines, @m.I ) + llCLASS_PROPERTY_Completed = .T. + Case .analyzeCodeBlock_ADD_OBJECT( @toModulo, @toClase, @tcLine, @m.I, @taCodeLines, @tnCodeLines, @toFoxBin2Prg ) Store .T. To llCLASSCOMMENTS_Completed ; @@ -10528,14 +10644,14 @@ Define Class c_conversor_prg_a_bin As c_conversor_base If Upper(Left(tcLine, 7)) == 'HIDDEN ' llBloqueEncontrado = .T. -* SF 20221201. reset to original state of #87 +* LScheffler 20221201. reset to original state of #87 *t-zuidema, 2022/11/25 -*old +*old toClase._HiddenProps = Lower( Alltrim( Substr( tcLine, 8 ) ) ) *new of t-zuidema * toClase._HiddenProps = Alltrim( Substr( tcLine, 8 ) ) */t-zuidema, 2022/11/25 -*/SF 20221201 +*/LScheffler 20221201 Endif Release toClase, tcLine @@ -11318,7 +11434,7 @@ Define Class c_conversor_prg_a_vcx As c_conversor_prg_a_bin lcInputFile = .c_InputFile Endif -*!* Changed by: Lutz Scheffler 15.2.2021 +*!* Changed by: LScheffler 15.2.2021 *!* change date="{^2021-02-15,16:09:00}" * problem with classes declared in multiple files, looks like merge problem of git * creates multiple classes in VCX @@ -11337,7 +11453,7 @@ Define Class c_conversor_prg_a_vcx As c_conversor_prg_a_bin Next Dimension; laFiles(Evl(lnFileCount,1),Alen(laFiles,2)) -*!* /Changed by: Lutz Scheffler 15.2.2021 +*!* /Changed by: LScheffler 15.2.2021 Asort( laFiles, 1, 0, 0, 1) Endif @@ -11430,7 +11546,7 @@ Define Class c_conversor_prg_a_vcx As c_conversor_prg_a_bin * - new operations of DBF If Empty(toFoxBin2Prg.c_ClassToConvert) -*!* Changed by: Lutz Scheffler 04.03.2021 +*!* Changed by: LScheffler 04.03.2021 *!* change date="{^2021-03-04,10:03:00}" * If inputfile in the form classlib.class.vc2 AND toFoxBin2Prg.n_RedirectClassType = 1 and Execute parameter tcRecompile = 1 * the change of outputfile might generate an error @@ -11441,7 +11557,7 @@ Define Class c_conversor_prg_a_vcx As c_conversor_prg_a_bin If toFoxBin2Prg.n_RedirectClassType = 0 toFoxBin2Prg.c_OutputFile = Fullpath( Forceext( lcBaseFilename, 'VCX' ), .c_InputFile) Endif -*!* /Changed by: Lutz Scheffler 04.03.2021 +*!* /Changed by: LScheffler 04.03.2021 Else loClase = toModulo._Clases(1) * Ajusto el nombre interno de la clase al indicado en el nombre del archivo @@ -11657,9 +11773,9 @@ Define Class c_conversor_prg_a_vcx As c_conversor_prg_a_bin loClase._UniqueID = toFoxBin2Prg.unique_ID() Endif -*!* Changed by: Lutz Scheffler 07.12.2021 +*!* Changed by: LScheffler 07.12.2021 *!* -*!* Changed by: Lutz Scheffler
+*!* Changed by: LScheffler
*!* https://github.com/fdbozzo/foxbin2prg/issues/72 / double classes in VCX *!* The old code will write a class whether or not the class is already in the classlib *!* Problem comes if a class is defined double by inconsistent UseClassPerFile, @@ -11668,9 +11784,9 @@ Define Class c_conversor_prg_a_vcx As c_conversor_prg_a_bin *!*
Select TABLABIN -*!* Changed by: Lutz Scheffler 23.02.2022 +*!* Changed by: LScheffler 23.02.2022 *!* -*!* Changed by: Lutz Scheffler
+*!* Changed by: LScheffler
*!* https://github.com/fdbozzo/foxbin2prg/issues/77 / If a classname is used as objectname too, an error is reported *!* A class is Objname with empty parent field, while an object has parent filled. *!*
@@ -11682,16 +11798,14 @@ Define Class c_conversor_prg_a_vcx As c_conversor_prg_a_bin FOR OBJNAME==loClase._ObjName; AND Empty(Parent) -*!* /Changed by Lutz Scheffler 07.12.2021 +*!* /Changed by LScheffler 07.12.2021 If Found() Then -*SF 20211207 -*SET STEP ON Error loLang.C_ClassTwice_Header_LOC + ; loLang.C_ClassTwice_Lib_LOC + Justfname( Dbf() ) + ; loLang.C_ClassTwice_Class_LOC + loClase._ObjName+0h0D0A Endif &&FOUND() -*!* /Changed by Lutz Scheffler 07.12.2021 +*!* /Changed by LScheffler 07.12.2021 *-- Inserto la clase Insert Into TABLABIN ; @@ -13680,14 +13794,14 @@ Define Class c_conversor_prg_a_dbf As c_conversor_prg_a_bin *-- Identifico los registros de la tabla y los agrego I = toTable._I - 1 -*!* Changed by: Lutz Scheffler 21.02.2021 +*!* Changed by: LScheffler 21.02.2021 *!* change date="{^2021-02-21,10:57:00}" * additional options controlling * - new operations of DBF toTable.analyzeCodeBlock( C_TABLE_I, @laCodeLines, @m.I, lnCodeLines, @toFoxBin2Prg,; IIF( m.lnFileCount = 1, Nvl( m.loDBF_CFG.l_DBF_BinChar_Base64, m.toFoxBin2Prg.l_DBF_BinChar_Base64 ), m.toFoxBin2Prg.l_DBF_BinChar_Base64 ),; IIF( m.lnFileCount = 1, Nvl( m.loDBF_CFG.l_DBF_IncludeDeleted, m.toFoxBin2Prg.l_DBF_IncludeDeleted ), m.toFoxBin2Prg.l_DBF_IncludeDeleted ) ) -*!* /Changed by: Lutz Scheffler 21.02.2021 +*!* /Changed by: LScheffler 21.02.2021 Endif @@ -13869,7 +13983,7 @@ Define Class c_conversor_prg_a_dbf As c_conversor_prg_a_bin Endproc -* SF +* LScheffler Procedure writeBinaryFile_INDEXES Lparameters toTable, toFoxBin2Prg *-- ----------------------------------------------------------------------------------------------------------- @@ -14064,7 +14178,7 @@ Define Class c_conversor_prg_a_dbf As c_conversor_prg_a_bin Enddefine && CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin -* SF, Analyse, just locate +* LScheffler, Analyse, just locate Define Class c_conversor_prg_a_dbc As c_conversor_prg_a_bin #If .F. Local This As c_conversor_prg_a_dbc Of 'FOXBIN2PRG.PRG' @@ -15153,7 +15267,6 @@ Define Class c_conversor_bin_a_prg As c_conversor_base Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' #Endif - Try Local laItems(1), I, X, lnLenAcum, lnPosEQ, lcPropName, lnLenVal, lcValue, lcMethods, lcLastIncompletePropName Store '' To tcSortedMemo, lcLastIncompletePropName @@ -15234,7 +15347,20 @@ Define Class c_conversor_bin_a_prg As c_conversor_base X = m.X + 1 Dimension taPropsAndValues(m.X,2) taPropsAndValues(m.X,1) = lcLastIncompletePropName + Left( laItems(m.I), lnPosEQ - 2 ) - taPropsAndValues(m.X,2) = .normalizePropertyValue( taPropsAndValues(m.X,1), Ltrim( Substr( laItems(m.I), lnPosEQ + 2 ) ), '' ) +*!* Changed by: LScheffler 16.3.2023 +*!* +*!* Changed by: LScheffler
+*!* Problems with property values with leading and trailing spaces +*!* and with double ampersand in value +*!* we just do not LTRIM so we keep the leading space here
+*!* see issues #90, #91 +*!*
+*!*
+ +* taPropsAndValues(m.X,2) = .normalizePropertyValue( taPropsAndValues(m.X,1), Ltrim( Substr( laItems(m.I), lnPosEQ + 2 ) ), '' ) + taPropsAndValues(m.X,2) = .normalizePropertyValue( taPropsAndValues(m.X,1), Substr( laItems(m.I), lnPosEQ + 2 ), '' ) + +*!* /Changed by: LScheffler 16.3.2023 Endif lcLastIncompletePropName = '' @@ -15332,9 +15458,9 @@ Define Class c_conversor_bin_a_prg As c_conversor_base lcSetDeleted = Set("Deleted") Set Deleted Off -*!* Changed by: Lutz Scheffler 25.2.2022 +*!* Changed by: LScheffler 25.2.2022 *!* -*!* Changed by: Lutz Scheffler
+*!* Changed by: LScheffler
*!* https://github.com/fdbozzo/foxbin2prg/issues/78 / After vc2 convert back to vcx class is corrupted no errors reported *!* Better named: Missing class when building text file from corrupted VCX *!* If the VCX is corrupted and holds empty records, the original coed will delete the next class. @@ -15360,7 +15486,7 @@ Define Class c_conversor_bin_a_prg As c_conversor_base Skip -1 Endif Endscan -*!* /Changed by: Lutz Scheffler 25.2.2022 +*!* /Changed by: LScheffler 25.2.2022 Set Deleted &lcSetDeleted. Return @@ -16089,17 +16215,39 @@ Define Class c_conversor_bin_a_prg As c_conversor_base .write_PROTECTED_Properties( @lcProtectedProp, @tcCodigo ) *-- Escribo las propiedades de la clase y sus comentarios (los comentarios aquí son redundantes) - For I = 1 To tnPropsAndValues_Count - tcCodigo = tcCodigo + Chr(13) + Chr(10) + Chr(9) + taPropsAndValues(m.I,1) + ' = ' + taPropsAndValues(m.I,2) - If tnPropsAndComments_Count > 0 Then - lnComment = Ascan( taPropsAndComments, taPropsAndValues(m.I,1), 1, 0, 1, 1+2+4+8) +*!* Changed by: LScheffler 16.3.2023 +*!* +*!* Changed by: LScheffler
+*!* Problems with property values with leading and trailing spaces +*!* and with double ampersand in value +*!* we just do not add the property comment, the comment will be recreated by the property definiton +*!* section DefinedPropArrayMethod
+*!* see issues #90, #91 +*!*
+*!*
+ If tnPropsAndValues_Count>0 +*LScheffler 16.3.2023 set delimiters around properties value, so we know it's without comment and we can keep "&&" in value + tcCodigo = tcCodigo + Chr(13) + Chr(10) + Chr(9) + C_DEFINED_PROPVAL_I - If lnComment > 0 And Not Empty(taPropsAndComments(lnComment,2)) - tcCodigo = tcCodigo + Chr(9) + Chr(9) + '&' + '& ' + taPropsAndComments(lnComment,2) - Endif - Endif - Endfor + For I = 1 To tnPropsAndValues_Count + tcCodigo = tcCodigo + Chr(13) + Chr(10) + Chr(9) + Chr(9) + taPropsAndValues(m.I,1) + ' = ' + taPropsAndValues(m.I,2) + +*LScheffler 16.3.2023 without comment +* If tnPropsAndComments_Count > 0 Then +* lnComment = Ascan( taPropsAndComments, taPropsAndValues(m.I,1), 1, 0, 1, 1+2+4+8) +* +* If lnComment > 0 And Not Empty(taPropsAndComments(lnComment,2)) +* tcCodigo = tcCodigo + Chr(9) + Chr(9) + '&' + '& ' + taPropsAndComments(lnComment,2) +* Endif +* Endif + + Endfor + +*LScheffler 16.3.2023 set delimiters around properties value, so we know it's without comment and we can keep "&&" in value + tcCodigo = tcCodigo + Chr(13) + Chr(10) + Chr(9) + C_DEFINED_PROPVAL_F + Endif &&tnPropsAndValues_Count>0 +*!* /Changed by: LScheffler 16.3.2023 TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<>> @@ -18572,7 +18720,7 @@ Define Class c_conversor_dbf_a_prg As c_conversor_bin_a_prg #Endif DoDefault( @toModulo, @toEx, @toFoxBin2Prg ) -*!* Changed by: Lutz Scheffler 11.2.2021 +*!* Changed by: LScheffler 11.2.2021 *!* change date="{^2021-02-11,08:50:00}" * If toFoxBin2Prg.l_ProcessFiles is not true * and the try block was exited @@ -18583,18 +18731,18 @@ Define Class c_conversor_dbf_a_prg As c_conversor_bin_a_prg If Not toFoxBin2Prg.l_ProcessFiles Then This.write_OutputFile( '', This.c_OutputFile, @toFoxBin2Prg ) Else &&NOT toFoxBin2Prg.l_ProcessFiles -*!* /Changed by: Lutz Scheffler 11.2.2021 +*!* /Changed by: LScheffler 11.2.2021 Try With This As c_conversor_dbf_a_prg Of 'FOXBIN2PRG.PRG' -*!* Changed by: Lutz Scheffler 11.2.2021 +*!* Changed by: LScheffler 11.2.2021 *!* change date="{^2021-02-11,08:50:00}" *moved up: * IF NOT toFoxBin2Prg.l_ProcessFiles THEN * .write_OutputFile( '', .c_OutputFile, @toFoxBin2Prg ) * EXIT && Si se indicó no procesar, se sale aquí. (Modo de simulación) * ENDIF -*!* /Changed by: Lutz Scheffler 11.2.2021 +*!* /Changed by: LScheffler 11.2.2021 Local lnCodError, laDatabases(1), lnDatabases_Count, laDatabases2(1) ; , lnLen, lc_FileTypeDesc, laLines(1), lcOutputFile ; @@ -18652,7 +18800,7 @@ Define Class c_conversor_dbf_a_prg As c_conversor_bin_a_prg Endif Endif Endif -* SF +* LScheffler Use (.c_InputFile) Shared Again Noupdate Alias TABLABIN lnDataSessionID = toFoxBin2Prg.DataSessionId .RestoreDBCEvents(loDBC, @llDBCEventsEnabled) @@ -18672,7 +18820,7 @@ Define Class c_conversor_dbf_a_prg As c_conversor_bin_a_prg Endif loTextStream.WriteLine( C_FB2PRG_CODE ) && Replace VFP low-level file funcs.because the 8-16KB limit. -* SF, Analyse, call table +* LScheffler, Analyse, call table loTable.toText( ln_HexFileType, ll_FileHasCDX, ll_FileHasMemo, ll_FileIsDBC, lc_DBC_Name, .c_InputFile, lc_FileTypeDesc, @toFoxBin2Prg ) loTextStream.Close() @@ -18763,7 +18911,7 @@ Define Class c_conversor_dbf_a_prg As c_conversor_bin_a_prg Endfor Store Null To loTable, loDBFUtils, loTextStream, toFoxBin2Prg.o_TextStream -*!* Changed by: Lutz Scheffler 11.2.2021 +*!* Changed by: LScheffler 11.2.2021 *!* change date="{^2021-02-11,08:50:00}" * Release different, parts moved outsidef IF .. ENDIF Release loTextStream ; @@ -18771,7 +18919,7 @@ Define Class c_conversor_dbf_a_prg As c_conversor_bin_a_prg , ln_HexFileType, ll_FileHasCDX, ll_FileHasMemo, ll_FileIsDBC, lc_DBC_Name, lnDataSessionID, lnSelect ; , loTable, loDBFUtils Endtry -*!* Changed by: Lutz Scheffler 11.2.2021 +*!* Changed by: LScheffler 11.2.2021 *!* change date="{^2021-02-11,08:50:00}" * so the whole try / catch block should not run if in simulation @@ -18779,7 +18927,7 @@ Define Class c_conversor_dbf_a_prg As c_conversor_bin_a_prg * Release from above Release toModulo, toEx, toFoxBin2Prg, loTextStream ; -*!* /Changed by: Lutz Scheffler 11.2.2021 +*!* /Changed by: LScheffler 11.2.2021 Return Endproc @@ -18799,7 +18947,7 @@ Define Class c_conversor_dbf_a_prg As c_conversor_bin_a_prg Enddefine -* SF, Analyse, just locate +* LScheffler, Analyse, just locate Define Class c_conversor_dbc_a_prg As c_conversor_bin_a_prg #If .F. Local This As c_conversor_dbc_a_prg Of 'FOXBIN2PRG.PRG' @@ -18821,8 +18969,7 @@ Define Class c_conversor_dbc_a_prg As c_conversor_bin_a_prg Local toDatabase As CL_DBC Of 'FOXBIN2PRG.PRG' Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' #Endif -*SF 20220613 -*SET STEP ON + Try With This As c_conversor_dbc_a_prg Of 'FOXBIN2PRG.PRG' Local lnCodError, laDatabases(1), lnDatabases_Count, lcEventsFile, lcExternalHeader, lcCodigo ; @@ -23427,7 +23574,7 @@ Define Class CL_DBC_INDEXES_DB As CL_DBC_COL_BASE Store Null To loIndex lcText = '' .read_BinDataToProperties(tcTable, @toFoxBin2Prg) -* SF tags + If .Count > 0 Then TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<>> <> @@ -23622,7 +23769,7 @@ Define Class CL_DBC_INDEX_DB As CL_DBC_BASE With This As CL_DBC_INDEX_DB Of 'FOXBIN2PRG.PRG' .read_BinDataToProperties(tcIndex) -* SF tags + TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<>> <> <<>> <<._Name>> @@ -23630,7 +23777,7 @@ Define Class CL_DBC_INDEX_DB As CL_DBC_BASE <<>> <<._IsUnique>> <<>> <> ENDTEXT -* /SF + ._ToText = lcText Endwith && THIS @@ -25247,13 +25394,13 @@ Define Class CL_DBF_TABLE As CL_CUS_BASE Endif loRecords = ._Records -*!* Changed by: Lutz Scheffler 21.02.2021 +*!* Changed by: LScheffler 21.02.2021 *!* change date="{^2021-02-21,10:57:00}" * additional options controlling * - new operations of DBF loRecords.analyzeCodeBlock( @tcLine, @taCodeLines, @m.I, tnCodeLines, ._Fields, @toFoxBin2Prg,; tl_DBF_BinChar_Base64, tl_DBF_IncludeDeleted ) -*!* /Changed by: Lutz Scheffler 21.02.2021 +*!* /Changed by: LScheffler 21.02.2021 Otherwise && Otro valor *-- Estructura a reconocer: * ID @@ -25362,7 +25509,7 @@ Define Class CL_DBF_TABLE As CL_CUS_BASE Endcase -* Lutz Scheffler 18.03.2021 added handling DBF_IndexList: +* LScheffler 18.03.2021 added handling DBF_IndexList: If lnFileCount = 1 lc_DBF_IndexList = loDBF_CFG.DBF_IndexList If Not Empty(lc_DBF_IndexList) @@ -25371,11 +25518,11 @@ Define Class CL_DBF_TABLE As CL_CUS_BASE Endif -* Lutz Scheffler 18.03.2021 moved index to get Settings per DBF +* LScheffler 18.03.2021 moved index to get Settings per DBF *-- Indexes loIndexes = This._Indexes lcText = lcText + loIndexes.toText( '', '', tc_InputFile, @toFoxBin2Prg, lc_DBF_IndexList) -* /Lutz Scheffler 18.03.2021 +* /LScheffler 18.03.2021 * setting temporary order If llExportData Then @@ -25387,12 +25534,12 @@ Define Class CL_DBF_TABLE As CL_CUS_BASE Index On &lc_DBF_Conversion_Order. To (lcIndexFile) Compact toFoxBin2Prg.writeLog(' > Using Index order key: ' + lc_DBF_Conversion_Order) Endif -* Lutz Scheffler 18.03.2021 added handling DBF_Conversion_Condition: +* LScheffler 18.03.2021 added handling DBF_Conversion_Condition: lc_DBF_Conversion_Condition = loDBF_CFG.DBF_Conversion_Condition If Not Empty(lc_DBF_Conversion_Condition) toFoxBin2Prg.writeLog(' > Using Conversion Condition: ' + lc_DBF_Conversion_Condition) Endif -* /Lutz Scheffler 18.03.2021 +* /LScheffler 18.03.2021 Endif Endif @@ -25403,14 +25550,14 @@ Define Class CL_DBF_TABLE As CL_CUS_BASE loRecords = This._Records *FWRITE( toFoxBin2Prg.n_FileHandle, lcText ) loTextStream.WriteLine( lcText ) && Replace VFP low-level file funcs.because the 8-16KB limit. -*!* Changed by: Lutz Scheffler 21.02.2021 +*!* Changed by: LScheffler 21.02.2021 *!* change date="{^2021-02-21,10:57:00}" * additional options controlling * - new operations of DBF loRecords.toText(@laFields, lnFieldCount, lc_DBF_Conversion_Condition, @toFoxBin2Prg,; IIF( m.lnFileCount = 1, Nvl( m.loDBF_CFG.l_DBF_BinChar_Base64, m.toFoxBin2Prg.l_DBF_BinChar_Base64 ), m.toFoxBin2Prg.l_DBF_BinChar_Base64 ),; IIF( m.lnFileCount = 1, Nvl( m.loDBF_CFG.l_DBF_IncludeDeleted, m.toFoxBin2Prg.l_DBF_IncludeDeleted ), m.toFoxBin2Prg.l_DBF_IncludeDeleted )) -*!* /Changed by: Lutz Scheffler 21.02.2021 +*!* /Changed by: LScheffler 21.02.2021 lcText = '' Endif @@ -25755,7 +25902,7 @@ Define Class CL_DBF_INDEXES As CL_COL_BASE Local This As CL_DBF_INDEXES Of 'FOXBIN2PRG.PRG' #Endif -* SF +* LScheffler Procedure analyzeIndexFilesBlock *--------------------------------------------------------------------------------------------------- * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) @@ -25863,7 +26010,7 @@ Define Class CL_DBF_INDEXES As CL_COL_BASE Return llBloqueEncontrado Endproc &&analyzeIndexFileBlock -* /SF +* /LScheffler Procedure analyzeCodeBlock *--------------------------------------------------------------------------------------------------- @@ -25924,7 +26071,7 @@ Define Class CL_DBF_INDEXES As CL_COL_BASE Endproc -* sf proc wrapping index +* LScheffler proc wrapping index Procedure toText *--------------------------------------------------------------------------------------------------- * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) @@ -25949,7 +26096,7 @@ Define Class CL_DBF_INDEXES As CL_COL_BASE Store Null To loIndex lcText = '' Dimension taTagInfo(1,6) -* SF tags + Local; lcText As String,; loIndex As "CL_DBF_INDEX" @@ -25965,9 +26112,9 @@ Define Class CL_DBF_INDEXES As CL_COL_BASE toFoxBin2Prg.writeLog( loLang.C_INDEX2TXT_PROCESSING_LOC ) -*!* Changed by: Lutz Scheffler 18.3.2021 +*!* Changed by: LScheffler 18.3.2021 *!* -*!* Changed by: Lutz Scheffler
+*!* Changed by: LScheffler
*!* Standalone index tc_InputFile.IDX will be included if DBF_Conversion_Order is activated *!* use only tags of structural compound index file *!*
@@ -25989,7 +26136,7 @@ Define Class CL_DBF_INDEXES As CL_COL_BASE * tnTagInfo_Count = Ataginfo( taTagInfo ) tnTagInfo_Count = Ataginfo( taTagInfo, m.lcIndexFile ) -*!* /Changed by: Lutz Scheffler 18.3.2021 +*!* /Changed by: LScheffler 18.3.2021 Asort( m.taTagInfo, 1, -1, 0, 1 ) loIndex = Createobject("CL_DBF_INDEX") @@ -26076,7 +26223,7 @@ Define Class CL_DBF_INDEXES As CL_COL_BASE Endif &&!EMPTY(m.lcText) toFoxBin2Prg.writeLog( Replicate('+', 100)+0h0D0A ) -* /SF +* /LScheffler Catch To loEx If This.n_Debug > 0 And _vfp.StartMode = 0 @@ -26205,7 +26352,7 @@ Define Class CL_DBF_INDEX As CL_CUS_BASE Exit Endif Endfor -* SF tags + TEXT TO lcText TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<>> <> <<>> <> @@ -26216,7 +26363,6 @@ Define Class CL_DBF_INDEX As CL_CUS_BASE <<>> <> <<>> <> ENDTEXT -* /SF Catch To loEx If This.n_Debug > 0 And _vfp.StartMode = 0 @@ -26299,11 +26445,11 @@ Define Class CL_DBF_RECORDS As CL_COL_BASE *FFLUSH( toFoxBin2Prg.n_FileHandle, .T. ) Endif -*!* Changed by: Lutz Scheffler 21.02.2021 +*!* Changed by: LScheffler 21.02.2021 *!* change date="{^2021-02-21,10:57:00}" * additional options controlling * - new operations of DBF, handle include of deleted records -*!* /Changed by: Lutz Scheffler 21.02.2021 +*!* /Changed by: LScheffler 21.02.2021 Case m.tl_DBF_IncludeDeleted And ' * for wharever reason, macro substitution failed * EVALUATE() should do * Scan For &tc_DBF_Conversion_Condition. Scan For Evaluate(m.tc_DBF_Conversion_Condition) -*!* /Changed by: Lutz Scheffler 01.03.2021 +*!* /Changed by: LScheffler 01.03.2021 I = m.I + 1 @@ -26493,7 +26639,7 @@ Define Class CL_DBF_RECORD As CL_CUS_BASE * tl_DBF_BinChar_Base64 out of settings (folder or per-file) Transform NocPTrans fields base64 *--------------------------------------------------------------------------------------------------- -*!* Changed by: Lutz Scheffler 21.02.2021 +*!* Changed by: LScheffler 21.02.2021 *!* change date="{^2021-02-21,10:57:00}" * general note: * - added code to handle NoCPTrans coding with or without basr64, just like the flag 4096 of CURSORTOXML @@ -26511,13 +26657,13 @@ Define Class CL_DBF_RECORD As CL_CUS_BASE , loField As CL_DBF_FIELD Of 'FOXBIN2PRG.PRG' Store '' To lcFieldName, lcValue -*!* Changed by: Lutz Scheffler 21.02.2021 +*!* Changed by: LScheffler 21.02.2021 *!* change date="{^2021-02-21,10:57:00}" * additional options controlling * - new operations of DBF, handle include of deleted records * Note, the inclusion of records deleted is done in the method calling, so here it will just be read If 'VALOR @@ -26550,7 +26696,7 @@ Define Class CL_DBF_RECORD As CL_CUS_BASE lcFieldType = loField._Type llNoCPTran = Cast( loField._NoCPTran As Logical) -*!* Changed by: Lutz Scheffler 14.2.2021 +*!* Changed by: LScheffler 14.2.2021 *!* change date="{^2021-02-14,20:35:00}" * Does not recreate .NULL. Field values * CAST(.. does not tronsform ".NULL." to .NULL. @@ -26562,7 +26708,7 @@ Define Class CL_DBF_RECORD As CL_CUS_BASE Case m.llNull And Upper(m.lcValue)=='.NULL.' && .NULL. luValue = .Null. -*!* /Changed by: Lutz Scheffler 14.2.2021 +*!* /Changed by: LScheffler 14.2.2021 Case lcFieldType == 'L' && Logical (Boolean) luValue = Cast(lcValue As Logical) @@ -26579,7 +26725,7 @@ Define Class CL_DBF_RECORD As CL_CUS_BASE Case lcFieldType == 'V' && Varchar If llNoCPTran And m.tl_DBF_BinChar_Base64 Then *-- If NoCPTran, then must encode in b64binary -*-- SF: might, not must, see XMLTOCURSOR, flag 4096 +*-- LScheffler: might, not must, see XMLTOCURSOR, flag 4096 luValue = Strconv(lcValue,14) Else luValue = .Decode(lcValue) @@ -26588,7 +26734,7 @@ Define Class CL_DBF_RECORD As CL_CUS_BASE Case lcFieldType == 'M' && Memo If llNoCPTran And m.tl_DBF_BinChar_Base64 Then *-- If NoCPTran, then must encode in b64binary -*-- SF: might, not must, see XMLTOCURSOR, flag 4096 +*--LScheffler: might, not must, see XMLTOCURSOR, flag 4096 luValue = Strconv(lcValue,14) Else If llOneLineOnly And Atc('> <> @@ -26740,7 +26886,7 @@ Define Class CL_DBF_RECORD As CL_CUS_BASE Case lcFieldType == 'V' && Varchar If llNoCPTran And m.tl_DBF_BinChar_Base64 Then *-- If NoCPTran, then must encode in b64binary -*-- SF: might, not must, see XMLTOCURSOR, flag 4096 +*-- LScheffler: might, not must, see XMLTOCURSOR, flag 4096 luValue = Strconv(luValue,13) Else luValue = .Encode(luValue) @@ -26749,7 +26895,7 @@ Define Class CL_DBF_RECORD As CL_CUS_BASE Case lcFieldType $ 'C' && Character If llNoCPTran And m.tl_DBF_BinChar_Base64 Then *-- If NoCPTran, then must encode in b64binary -*-- SF: might, not must, see XMLTOCURSOR, flag 4096 +*-- LScheffler: might, not must, see XMLTOCURSOR, flag 4096 luValue = Strconv(luValue,13) Else luValue = .Encode(Rtrim(luValue)) @@ -26758,12 +26904,12 @@ Define Class CL_DBF_RECORD As CL_CUS_BASE Case lcFieldType $ 'M' && Memo If llNoCPTran And m.tl_DBF_BinChar_Base64 Then *-- If NoCPTran, then must encode in b64binary -*-- SF: might, not must, see XMLTOCURSOR, flag 4096 +*-- LScheffler: might, not must, see XMLTOCURSOR, flag 4096 luValue = Strconv(luValue,13) Else -*!* Changed by: Lutz Scheffler 07.4.2022 +*!* Changed by: LScheffler 07.4.2022 *!* -*!* Changed by: Lutz Scheffler
+*!* Changed by: LScheffler
*!* https://github.com/fdbozzo/foxbin2prg/issues/81 / Trailing spaces are lost for memo fields converting dbf with including data. *!* RTRIM removed trsiling spaces from memo *!*
@@ -26773,17 +26919,17 @@ Define Class CL_DBF_RECORD As CL_CUS_BASE Endcase -*!* Changed by: Lutz Scheffler 07.4.2022 +*!* Changed by: LScheffler 07.4.2022 *!* TEXT .. ENDTEXT removes trailing spaces from lines inserted with TEXXTMERGE *!* Char etc are processed special If Vartype(luValue) = 'C' - lcText = lcText + 0H0D0A + ' <' + lcField + '>' + luValue + '' + lcText = lcText + 0h0D0A + ' <' + lcField + '>' + luValue + '' Else TEXT TO lcText TEXTMERGE NOSHOW flags 1+2 PRETEXT 1+2 additive <<>> <<'<' + lcField + '>'>><><<''>> ENDTEXT Endif -*!* /Changed by Lutz Scheffler 07.4.2022 +*!* /Changed by LScheffler 07.4.2022 Endif Next @@ -28622,73 +28768,73 @@ Define Class CL_MENU_OPTION As CL_MENU_COL_BASE *!* *!* Changd By: BH
*!* Issue #80, by bjornhoeksel -*!* Support ; sign in skip for expression between quotes +*!* Support ; sign in skip for expression between quotes *!*
*!*
- PROCEDURE remove_strings - *--------------------------------------------------------------------------------------------------- - * Remove all things between quotes - * PARÁMETROS: - * tcLine Contenido de la línea en análisis - *--------------------------------------------------------------------------------------------------- - Lparameters tcLine - * m.p_format_class = parameter object + Procedure remove_strings +*--------------------------------------------------------------------------------------------------- +* Remove all things between quotes +* PARÁMETROS: +* tcLine Contenido de la línea en análisis +*--------------------------------------------------------------------------------------------------- + Lparameters tcLine +* m.p_format_class = parameter object - LOCAL lnStringCount, lnStringNumber, lnStartPosition, lnEndPosition + Local lnStringCount, lnStringNumber, lnStartPosition, lnEndPosition - * Count the number of ' - lnStringCount = OCCURS("'", tcLine) / 2 +* Count the number of ' + lnStringCount = Occurs("'", tcLine) / 2 - FOR lnStringNumber = 1 TO lnStringCount - * Loop for the number of ' - - * Get start position of ' - lnStartPosition = ATC("'", tcLine, lnStringNumber) - * Get end position of ' - lnEndPosition = ATC("'", tcLine, lnStringNumber + 1) - lnStartPosition - - * Replace all that stand between ' with *** - tcLine = STUFF(tcLine, lnStartPosition, lnEndPosition, '********') - NEXT + For lnStringNumber = 1 To lnStringCount +* Loop for the number of ' - * Count the number of " - lnStringCount = OCCURS(["], tcLine) / 2 +* Get start position of ' + lnStartPosition = Atc("'", tcLine, lnStringNumber) +* Get end position of ' + lnEndPosition = Atc("'", tcLine, lnStringNumber + 1) - lnStartPosition - FOR lnStringNumber = 1 TO lnStringCount - * Loop for the number of " +* Replace all that stand between ' with *** + tcLine = Stuff(tcLine, lnStartPosition, lnEndPosition, '********') + Next - * Get start position of " - lnStartPosition = ATC(["], tcLine, lnStringNumber) - * Get end position of ' - lnEndPosition = ATC(["], tcLine, lnStringNumber + 1) - lnStartPosition - - * Replace all that stand between " with *** - tcLine = STUFF(tcLine, lnStartPosition, lnEndPosition, '********') - NEXT +* Count the number of " + lnStringCount = Occurs(["], tcLine) / 2 - * Count the number of [ - lnStringCount = OCCURS("[", tcLine) + For lnStringNumber = 1 To lnStringCount +* Loop for the number of " - FOR lnStringNumber = 1 TO lnStringCount - * Loop for the number of [ - - * Get start position of [ - lnStartPosition = AT("[", tcLine, lnStringNumber) + 1 - - * Get end position of ] - lnEndPosition = AT("]", tcLine, lnStringNumber) - lnStartPosition - - * Replace all that stand between [ with *** - tcLine = STUFF(tcLine, lnStartPosition, lnEndPosition, '********') - NEXT +* Get start position of " + lnStartPosition = Atc(["], tcLine, lnStringNumber) +* Get end position of ' + lnEndPosition = Atc(["], tcLine, lnStringNumber + 1) - lnStartPosition - * Return line without string content - RETURN tcLine - - ENDPROC - -*!* /Changd By: BH 30.3.2022 +* Replace all that stand between " with *** + tcLine = Stuff(tcLine, lnStartPosition, lnEndPosition, '********') + Next + +* Count the number of [ + lnStringCount = Occurs("[", tcLine) + + For lnStringNumber = 1 To lnStringCount +* Loop for the number of [ + +* Get start position of [ + lnStartPosition = At("[", tcLine, lnStringNumber) + 1 + +* Get end position of ] + lnEndPosition = At("]", tcLine, lnStringNumber) - lnStartPosition + +* Replace all that stand between [ with *** + tcLine = Stuff(tcLine, lnStartPosition, lnEndPosition, '********') + Next + +* Return line without string content + Return tcLine + + Endproc + +*!* /Changd By: BH 30.3.2022 Procedure analyzeCodeBlock_DefineBAR *--------------------------------------------------------------------------------------------------- @@ -28735,9 +28881,9 @@ Define Class CL_MENU_OPTION As CL_MENU_COL_BASE loReg = .oReg loReg.ObjType = C_OBJTYPE_MENUTYPE_OPTION lcBarName = Alltrim( Strextract( tcLine, 'BAR ' , ' OF' ) ) -*!* Changd By: SF 22.4.2021 +*!* Changd By: LScheffler 22.4.2021 *!* -*!* Changd By: SF
+*!* Changd By: LScheffler
*!* Old style determeines generic name from set name by testing as digit. It could be only digit. :( *!* New style wraps it in ", so anything in " is set name *!*
@@ -28759,19 +28905,19 @@ Define Class CL_MENU_OPTION As CL_MENU_COL_BASE * loReg.OBJCODE = C_OBJCODE_MENUOPTION_BARNUM Endcase -*!* Changd By: SF 16.3.2022 +*!* Changd By: LScheffler 16.3.2022 *!* -*!* Changd By: SF
+*!* Changd By: LScheffler
*!* Issue #79, by bjornhoeksel * loReg.OBJCODE = C_OBJCODE_MENUOPTION_BARNUM for OTHERWISE too, * just move it out of the case *!*
*!*
- loReg.OBJCODE = C_OBJCODE_MENUOPTION_BARNUM + loReg.OBJCODE = C_OBJCODE_MENUOPTION_BARNUM -*!* /Changd By: SF 16.3.2022 -*!* /Changd By: SF 22.4.2021 +*!* /Changd By: LScheffler 16.3.2022 +*!* /Changd By: LScheffler 22.4.2021 loReg.LevelName = Alltrim( Strextract( tcLine, ' OF ', ' PROMPT ' ) ) If Upper(loReg.LevelName) # Upper(.c_ParentName) @@ -28784,7 +28930,7 @@ Define Class CL_MENU_OPTION As CL_MENU_COL_BASE *-- ANALISIS DEL "DEFINE BAR" Do Case Case ';' $ tcLine - + For I = m.I + 1 To tnCodeLines .set_Line( @tcLine, @taCodeLines, m.I ) @@ -28799,16 +28945,16 @@ Define Class CL_MENU_OPTION As CL_MENU_COL_BASE *!* *!* Changd By: BH
*!* Issue #80, by bjornhoeksel -*!* Support ; sign in skip for expression between quotes +*!* Support ; sign in skip for expression between quotes *!*
*!*
- lcLineNoStrings = this.remove_strings(tcLine) - lnLineEnd = OCCURS(";", lcLineNoStrings) + lcLineNoStrings = This.remove_strings(tcLine) + lnLineEnd = Occurs(";", lcLineNoStrings) + + If lnLineEnd > 0 +* We have ; end line markers not between quotes +* Calc first ; not between quotes - IF lnLineEnd > 0 - * We have ; end line markers not between quotes - * Calc first ; not between quotes - *!* Changd By: BH 10.5.2022 *!* *!* Changd By: BH
@@ -28816,19 +28962,19 @@ Define Class CL_MENU_OPTION As CL_MENU_COL_BASE *!* Fix menu bars with shortcuts keys like KEY F6, "F6"; are lost. *!*
*!*
- lnLineEnd = OCCURS(";", tcLine) - lnLineEnd + 1 + lnLineEnd = Occurs(";", tcLine) - lnLineEnd + 1 *!* /Changd By: BH 10.5.2022 - ELSE - * No line markers not between quotes + Else +* No line markers not between quotes lnLineEnd = 0 Endif - -*!* Changed by: Lutz Scheffler 8.6.2022 + +*!* Changed by: LScheffler 8.6.2022 *!* -*!* Changed by: Lutz Scheffler
+*!* Changed by: LScheffler
*!* https://github.com/fdbozzo/foxbin2prg/issues/84 / Multiple text2bin and bin2text conversion on MNX causes space grow *!* Bin2Text is formated like "xxx ;", trailing space must be removed, TRIM() added for SKIP FOR and PICTRES -*!*
+*!*
*!*
Do Case Case Left( tcLine, 10 ) == 'NEGOTIATE ' @@ -28841,21 +28987,21 @@ Define Class CL_MENU_OPTION As CL_MENU_COL_BASE Case Left( tcLine, 4 ) == 'KEY ' lcExpr = Alltrim( Strextract( tcLine, 'KEY ') ) - IF lnLineEnd > 0 - lcExpr = SUBSTR(lcExpr, 1, ATC(';', lcExpr, lnLineEnd)-1) - ENDIF - + If lnLineEnd > 0 + lcExpr = Substr(lcExpr, 1, Atc(';', lcExpr, lnLineEnd)-1) + Endif + lnPos = At( ',', lcExpr ) loReg.KEYNAME = Alltrim( Left( lcExpr, lnPos-1 ) ) loReg.KeyLabel = Alltrim( Strextract( lcExpr, '"', '"' ) ) Case Left( tcLine, 9 ) == 'SKIP FOR ' loReg.SkipFor = Alltrim( Strextract( tcLine, 'SKIP FOR ') ) - IF lnLineEnd > 0 -*!* Changed by: Lutz Scheffler 8.6.2022 - loReg.SkipFor = Trim( Substr( loReg.SkipFor, 1, ATC(';', loReg.SkipFor, lnLineEnd)-1) ) - ENDIF - + If lnLineEnd > 0 +*!* Changed by: LScheffler 8.6.2022 + loReg.SkipFor = Trim( Substr( loReg.SkipFor, 1, Atc(';', loReg.SkipFor, lnLineEnd)-1) ) + Endif + Case Left( tcLine, 8 ) == 'MESSAGE ' loReg.Message = Alltrim( Substr( tcLine, 9 ) ) @@ -28865,21 +29011,21 @@ Define Class CL_MENU_OPTION As CL_MENU_COL_BASE Case Left( tcLine, 8 ) == 'PICTRES ' loReg.RESNAME = Alltrim( Strextract( tcLine, 'PICTRES ') ) - - IF lnLineEnd > 0 -*!* Changed by: Lutz Scheffler 8.6.2022 - loReg.RESNAME = Trim( Substr( loReg.RESNAME, 1, ATC(';', loReg.RESNAME, lnLineEnd)-1) ) - ELSE - - ENDIF + + If lnLineEnd > 0 +*!* Changed by: LScheffler 8.6.2022 + loReg.RESNAME = Trim( Substr( loReg.RESNAME, 1, Atc(';', loReg.RESNAME, lnLineEnd)-1) ) + Else + + Endif loReg.SYSRES = 1 Otherwise * Nada - ENDCASE -*!* /Changed by: Lutz Scheffler 8.6.2022 -*!* /Changd By: BH 30.3.2022 - + Endcase +*!* /Changed by: LScheffler 8.6.2022 +*!* /Changd By: BH 30.3.2022 + If Not ';' $ tcLine && Fin Exit @@ -28892,9 +29038,9 @@ Define Class CL_MENU_OPTION As CL_MENU_COL_BASE Endcase -*!* Changd By: SF 22.4.2021 +*!* Changd By: LScheffler 22.4.2021 *!* -*!* Changd By: SF
+*!* Changd By: LScheffler
*!* This is not valid here - "_" is never set in get_DefineBarText *!*
*!*
@@ -28906,7 +29052,7 @@ Define Class CL_MENU_OPTION As CL_MENU_COL_BASE *!* Exit *!* Endif -*!* /Changd By: SF 22.4.2021 +*!* /Changd By: LScheffler 22.4.2021 * Estructuras ejemplo a analizar: @@ -29032,9 +29178,9 @@ Define Class CL_MENU_OPTION As CL_MENU_COL_BASE loReg.ObjType = C_OBJTYPE_MENUTYPE_OPTION lcPadName = Alltrim( Strextract( tcLine, 'PAD ' , ' OF' ) ) -*!* Changd By: SF 22.4.2021 +*!* Changd By: LScheffler 22.4.2021 *!* -*!* Changd By: SF
+*!* Changd By: LScheffler
*!* Old style determines generic name from set name by testing as digit. It could be only digit. :( *!* New style wraps it in ", so anything in " is set name *!*
@@ -29045,20 +29191,20 @@ Define Class CL_MENU_OPTION As CL_MENU_COL_BASE lcPadName = Substr( m.lcPadName, 2, Len( m.lcPadName ) - 2 ) loReg.Name = m.lcPadName -*!* Changed By: Lutz Scheffler 18.1.2022 +*!* Changed by: LScheffler 18.1.2022 *!* -*!* Changed Bby SF
+*!* Changed by LScheffler
*!* Issue 74, by Jimrnelson *!* Does not work for padname without '"'. *!*
*!*
Else &&LEFT ( m.lcPadName, 1 ) = '"' loReg.Name = m.lcPadName -*!* /Changed Bby SF 18.1.2022 +*!* /Changed by LScheffler 18.1.2022 Endif &&LEFT ( m.lcPadName, 1 ) = '"' -*!* /Changd By: SF 22.4.2021 +*!* /Changd By: LScheffler 22.4.2021 loReg.LevelName = Alltrim( Strextract( tcLine, ' OF ', ' PROMPT ' ) ) If Upper(loReg.LevelName) # Upper(.c_ParentName) @@ -29320,9 +29466,9 @@ Define Class CL_MENU_OPTION As CL_MENU_COL_BASE Store Null To loBarPop lcTab = Replicate(Chr(9),tnNivel) lcText = '' -*!* Changed by Lutz Scheffler 22.4.2021 +*!* Changed by LScheffler 22.4.2021 *!* -*!* Changed by Lutz Scheffler
+*!* Changed by LScheffler
*!* If the BAR real name starts (legaly) with a digit it could not be recreated *!* added code to add additional information to recreate the name *!* name will wrap into " , so we got DEFINE BAR "Number" OF @@ -29337,9 +29483,9 @@ Define Class CL_MENU_OPTION As CL_MENU_COL_BASE lcName2 = m.lcName Endif &&!Empty(toReg.Name) And ISDIGIT( toReg.Name ) -* SF +* LScheffler * location of definition of MENU BAR Evl( toReg.Name, toReg.ItemNum ) -* /SF +* /LScheffler *-- DEFINE BAR *lcText = lcTab + '*----------------------------------' + CR_LF lcText = lcText + lcTab + 'DEFINE BAR ' + m.lcName2 + ' OF ' + Alltrim(toReg.LevelName) ; @@ -29407,7 +29553,7 @@ Define Class CL_MENU_OPTION As CL_MENU_COL_BASE Release lcTab, loBarPop Endtry -*!* /Changed by Lutz Scheffler 22.4.2021 +*!* /Changed by LScheffler 22.4.2021 Return lcText Endproc @@ -29422,9 +29568,9 @@ Define Class CL_MENU_OPTION As CL_MENU_COL_BASE * toHeader (v! IN ) Objeto Registro de cabecera del menu *--------------------------------------------------------------------------------------------------- Lparameters toReg, toBarPop, tnNivel, toHeader -*!* Changed by Lutz Scheffler 21.4.2021 +*!* Changed by LScheffler 21.4.2021 *!* -*!* Changed by Lutz Scheffler
+*!* Changed by LScheffler
*!* If the PAD real name starts (leagly) with "_" it could not be recreated *!* added code to add additional information to recreate the name *!* name will simple wrapped into ", so we got DEFINE PAD "_Name" OF @@ -29444,7 +29590,7 @@ Define Class CL_MENU_OPTION As CL_MENU_COL_BASE toReg.Name = Evl(toReg.Name, '_' + Transform( Int( Val( toReg.ItemNum ) ), '@L #########') ) lcName2 = Alltrim(toReg.Name) Endif &&!EMPTY(toReg.Name) AND toReg.Name = '_' -*!* /Changed by Lutz Scheffler 21.4.2021 +*!* /Changed by LScheffler 21.4.2021 lcText = '' @@ -30220,14 +30366,14 @@ Define Class CL_CFG As Custom + [] ; + [] ; + [] ; - ; && SF + ; && LScheffler + [] ; + [] ; + [] ; + [] ; + [] ; + [] ; - ; && /SF + ; && /LScheffler + [] ; + [] ; + [] ; @@ -30271,19 +30417,19 @@ Define Class CL_CFG As Custom l_RemoveNullCharsFromCode = Null l_RemoveZOrderSetFromProps = Null n_UseClassPerFile = Null -*!* Changed by: Lutz Scheffler 21.02.2021 +*!* Changed by: LScheffler 21.02.2021 *!* change date="{^2021-02-21,10:57:00}" * additional options controlling * - splitt of DBC separated from VCX/SCX * - new operations of DBF -*!* /Changed by: Lutz Scheffler 21.02.2021 +*!* /Changed by: LScheffler 21.02.2021 l_OldFilesPerDBC = Null n_UseFilesPerDBC = Null l_RedirectFilePerDBCToMain = Null l_ItemPerDBCCheck = Null l_DBF_BinChar_Base64 = Null l_DBF_IncludeDeleted = Null -*!* /Changed by: Lutz Scheffler 21.02.2021 +*!* /Changed by: LScheffler 21.02.2021 l_ClassPerFileCheck = Null n_ExtraBackupLevels = Null c_VC2 = Null @@ -30338,7 +30484,7 @@ Define Class CL_CFG As Custom .l_RemoveNullCharsFromCode = toParentCFG.l_RemoveNullCharsFromCode .l_RemoveZOrderSetFromProps = toParentCFG.l_RemoveZOrderSetFromProps .n_UseClassPerFile = toParentCFG.n_UseClassPerFile -*!* Changed by: Lutz Scheffler 21.02.2021 +*!* Changed by: LScheffler 21.02.2021 *!* change date="{^2021-02-21,10:57:00}" * additional options controlling * - splitt of DBC separated from VCX/SCX @@ -30349,7 +30495,7 @@ Define Class CL_CFG As Custom .l_ItemPerDBCCheck = toParentCFG.l_ItemPerDBCCheck .l_DBF_BinChar_Base64 = toParentCFG.l_DBF_BinChar_Base64 .l_DBF_IncludeDeleted = toParentCFG.l_DBF_IncludeDeleted -*!* /Changed by: Lutz Scheffler 21.02.2021 +*!* /Changed by: LScheffler 21.02.2021 .l_ClassPerFileCheck = toParentCFG.l_ClassPerFileCheck .n_ExtraBackupLevels = toParentCFG.n_ExtraBackupLevels .c_VC2 = toParentCFG.c_VC2