From f220ee75b61b0fdb7b3455ab998ab2968042fea7 Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Fri, 17 Feb 2017 17:29:53 +0100 Subject: [PATCH 01/19] Updated version --- FoxBin2PRGVersionFile.txt | 7 +++++-- foxbin2prg.pj2 | 4 +--- foxbin2prg.pjt | Bin 797396 -> 797421 bytes foxbin2prg.pjx | Bin 9903 -> 9903 bytes 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/FoxBin2PRGVersionFile.txt b/FoxBin2PRGVersionFile.txt index 5dc3b10..aaf1e21 100644 --- a/FoxBin2PRGVersionFile.txt +++ b/FoxBin2PRGVersionFile.txt @@ -2,8 +2,8 @@ Lparameters toUpdateInfo Local lcNote With toUpdateInfo - .VersionNumber = 'v1.19.48' - .VersionDate = Date(2016,07,11) + .VersionNumber = 'v1.19.49' + .VersionDate = Date(2017,02,17) .SourceFileUrl = 'http://vfpxrepository.com/dl/thorupdate/Projects/FoxBin2Prg/FoxBin2Prg.Zip' .Link = 'http://vfpx.codeplex.com/wikipage?title=FoxBin2PRG' @@ -21,6 +21,9 @@ Demo video using FoxBin2Prg with PlasticSCM: http://youtu.be/sE4wQ50Itqg Change History ------------------------------------------------------------- +2017/02/17 v1.19.49 + + 2016/07/11 v1.19.48 - Bug Fix: Error message 'variable tcOutputFile not found' (german version) (Andy Kasper) - Bug Fix: Menu location 'Before' always changed to 'after' when convert (Andy Kasper) diff --git a/foxbin2prg.pj2 b/foxbin2prg.pj2 index 41380e2..6adb37c 100644 --- a/foxbin2prg.pj2 +++ b/foxbin2prg.pj2 @@ -26,7 +26,7 @@ _LegalTrademark = "Creative Commons 4: Reconocimiento - CompartirIgual (by-sa): _ProductName = "FOXBIN2PRG" _MajorVer = "1" _MinorVer = "19" -_Revision = "48" +_Revision = "49" _LanguageID = "1034" _AutoIncrement = "0" * @@ -93,7 +93,6 @@ WITH loProject.FILES .ADD('props_xmladapter.txt') && *< FileMetadata: Type="T" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" /> .ADD('props_xmlfield.txt') && *< FileMetadata: Type="T" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" /> .ADD('props_xmltable.txt') && *< FileMetadata: Type="T" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" /> - .ADD('readme.txt') && *< FileMetadata: Type="T" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" /> * .ITEM('__newproject.f2b').Remove() @@ -104,7 +103,6 @@ WITH loProject.FILES * * - .ITEM(lcCurdir + 'readme.txt').Exclude = .T. * * diff --git a/foxbin2prg.pjt b/foxbin2prg.pjt index 228074ecf33c402e32df1c0bf799fefc28d9ef2b..30929f1be78ec66f291c0a03180b5eb2df31f20f 100644 GIT binary patch delta 113 zcmca|)!^+_0}cirt+xye42+u@U4AoeW@a*B=dc9w4GoMi( diff --git a/foxbin2prg.pjx b/foxbin2prg.pjx index 5c8ba18ac18413f6e2be1843d918ac7739e4b89d..0028e199e2a0a6f73d3611b4d66a24f70f28109a 100644 GIT binary patch delta 22 dcmZ4QyWW?@K#)mrA&U%)))g(D%^Whzxd2A=1=0Wj delta 22 dcmZ4QyWW?@K!8nRA&U%)LJudyW)7L Date: Sat, 18 Feb 2017 12:18:45 +0100 Subject: [PATCH 02/19] =?UTF-8?q?Nuevo=20test=20para=20la=20caracter=C3=AD?= =?UTF-8?q?stica=20ClassPerFile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...fb2p_classperfile_text.cl_commandgroup.vc2 | 34 +++++ .../fb2p_classperfile_text.cl_form.vc2 | 121 ++++++++++++++++++ .../fb2p_classperfile_text.cl_imagen.vc2 | 23 ++++ .../fb2p_classperfile_text.cl_olebound.vc2 | 14 ++ .../fb2p_classperfile_text.cl_olecontrol.vc2 | 14 ++ .../fb2p_classperfile_text.cl_optiongroup.vc2 | 51 ++++++++ .../fb2p_classperfile_text.proj_hook.vc2 | 14 ++ .../DATOS_READONLY/fb2p_classperfile_text.vc2 | 18 +++ .../DATOS_READONLY/fb2p_classperfile_text.vct | Bin 0 -> 86861 bytes .../DATOS_READONLY/fb2p_classperfile_text.vcx | Bin 0 -> 7028 bytes TESTS/ut__foxbin2prg.prg | 113 ++++++++++++++++ 11 files changed, 402 insertions(+) create mode 100644 TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_commandgroup.vc2 create mode 100644 TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_form.vc2 create mode 100644 TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_imagen.vc2 create mode 100644 TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_olebound.vc2 create mode 100644 TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_olecontrol.vc2 create mode 100644 TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_optiongroup.vc2 create mode 100644 TESTS/DATOS_READONLY/fb2p_classperfile_text.proj_hook.vc2 create mode 100644 TESTS/DATOS_READONLY/fb2p_classperfile_text.vc2 create mode 100644 TESTS/DATOS_READONLY/fb2p_classperfile_text.vct create mode 100644 TESTS/DATOS_READONLY/fb2p_classperfile_text.vcx diff --git a/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_commandgroup.vc2 b/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_commandgroup.vc2 new file mode 100644 index 0000000..5e083e2 --- /dev/null +++ b/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_commandgroup.vc2 @@ -0,0 +1,34 @@ +*-------------------------------------------------------------------------------------------------------------------------------------------------------- +* (ES) AUTOGENERADO - ¡¡ATENCIÓN!! - ¡¡NO PENSADO PARA EJECUTAR!! USAR SOLAMENTE PARA INTEGRAR CAMBIOS Y ALMACENAR CON HERRAMIENTAS SCM!! +* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!! +*-------------------------------------------------------------------------------------------------------------------------------------------------------- +*< FOXBIN2PRG: Version="1.19" SourceFile="fb2p_classperfile_text.vcx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) +* +DEFINE CLASS cl_commandgroup AS commandgroup && Descripción de cl_CommandGroup + *< CLASSDATA: Baseclass="commandgroup" Timestamp="" Scale="Pixels" Uniqueid="" /> + + #INCLUDE "..\..\include\principal.h" + * + *p: una_prop_cmgroup && Con comentario, pero sin valor + * + + ButtonCount = 2 + Height = 66 + Name = "cl_commandgroup" + una_prop_cmgroup = .F. && Con comentario, pero sin valor + Value = 1 + Width = 94 + Command1.Caption = "Command1" + Command1.Height = 27 + Command1.Left = 5 + Command1.Name = "Command1" + Command1.Top = 5 + Command1.Width = 84 + Command2.Caption = "Command2" + Command2.Height = 27 + Command2.Left = 5 + Command2.Name = "Command2" + Command2.Top = 34 + Command2.Width = 84 + +ENDDEFINE diff --git a/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_form.vc2 b/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_form.vc2 new file mode 100644 index 0000000..650a9f1 --- /dev/null +++ b/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_form.vc2 @@ -0,0 +1,121 @@ +*-------------------------------------------------------------------------------------------------------------------------------------------------------- +* (ES) AUTOGENERADO - ¡¡ATENCIÓN!! - ¡¡NO PENSADO PARA EJECUTAR!! USAR SOLAMENTE PARA INTEGRAR CAMBIOS Y ALMACENAR CON HERRAMIENTAS SCM!! +* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!! +*-------------------------------------------------------------------------------------------------------------------------------------------------------- +*< FOXBIN2PRG: Version="1.19" SourceFile="fb2p_classperfile_text.vcx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) +* +DEFINE CLASS cl_form AS form OLEPUBLIC && mi OLE server DLL + *< CLASSDATA: Baseclass="form" Timestamp="" Scale="Pixels" Uniqueid="" ProjectClassIcon="bmps\container.ico" ClassIcon="bmps\container.ico" /> + + *-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder + *< OBJECTDATA: ObjPath="Cl_optiongroup1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="Cl_commandgroup1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="Cl_imagen1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="Cl_imagen2" UniqueID="" Timestamp="" /> + + * + *p: chidden && Prop.Hidden + *p: cprotected && Prop.Protegida + *a: ahidden[1,0] && Array Oculto + *a: aprotected[1,0] && Array Protegido + *p: _memberdata && XML Metadata for customizable properties + * + + HIDDEN ahidden,chidden + PROTECTED aprotected,cprotected + Caption = "Form" + chidden = && Prop.Hidden + cprotected = && Prop.Protegida + DoCreate = .T. + Height = 345 + Left = 0 + Name = "cl_form" + Picture = bmps\scccheckout.bmp + Top = 0 + Width = 570 + _memberdata = + + + + + && XML Metadata for customizable properties + + ADD OBJECT 'Cl_commandgroup1' AS cl_commandgroup WITH ; + BackColor = 255,128,192, ; + Height = 66, ; + Left = 8, ; + Name = "Cl_commandgroup1", ; + Top = 88, ; + Width = 244, ; + Command1.Caption = "Abrir", ; + Command1.Height = 52, ; + Command1.Left = 8, ; + Command1.Name = "Command1", ; + Command1.Picture = bmps\carpetaabierta.bmp, ; + Command1.Top = 4, ; + Command1.Width = 104, ; + Command2.Caption = "Cerrar", ; + Command2.Height = 52, ; + Command2.Left = 124, ; + Command2.Name = "Command2", ; + Command2.Picture = bmps\carpetacerrada.bmp, ; + Command2.Top = 4, ; + Command2.Width = 104 + *< END OBJECT: ClassLib="fb2p_test.vcx" BaseClass="commandgroup" /> + + ADD OBJECT 'Cl_imagen1' AS cl_imagen WITH ; + Height = 34, ; + Left = 452, ; + Name = "Cl_imagen1", ; + Picture = bmps\sobrepostal.bmp, ; + Stretch = 1, ; + Top = 276, ; + Width = 38 + *< END OBJECT: ClassLib="fb2p_test.vcx" BaseClass="image" /> + + ADD OBJECT 'Cl_imagen2' AS cl_imagen WITH ; + Height = 34, ; + Left = 500, ; + Name = "Cl_imagen2", ; + Picture = bmps\treeview.bmp, ; + Stretch = 1, ; + Top = 276, ; + Width = 38 + *< END OBJECT: ClassLib="fb2p_test.vcx" BaseClass="image" /> + + ADD OBJECT 'Cl_optiongroup1' AS cl_optiongroup WITH ; + BackColor = 0,128,255, ; + Height = 68, ; + Left = 8, ; + Name = "Cl_optiongroup1", ; + Top = 12, ; + Width = 244, ; + Option1.Height = 52, ; + Option1.Left = 8, ; + Option1.Name = "Option1", ; + Option1.Picture = bmps\scccheckout.bmp, ; + Option1.Style = 1, ; + Option1.Top = 8, ; + Option1.Width = 104, ; + Option2.Height = 52, ; + Option2.Left = 124, ; + Option2.Name = "Option2", ; + Option2.Picture = bmps\scccheckout.bmp, ; + Option2.Style = 1, ; + Option2.Top = 8, ; + Option2.Width = 104 + *< END OBJECT: ClassLib="fb2p_test.vcx" BaseClass="optiongroup" /> + + PROCEDURE Cl_optiongroup1.Init + *-- Prueba para comprobar que respeta espacios y TABS del código + TEXT TO xx + * TAB a la izquierda del asterisco + * 2 TAB a la izquierda del asterisco + * 1 ESPACIO a la izquierda del asterisco + * 2 ESPACIOS a la izquierda del asterisco + 1 TAB a la derecha del asterisco * + 1 ESPACIO a la derecha del asterisco * + ENDTEXT && Esto termina sin ENTER + ENDPROC + +ENDDEFINE diff --git a/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_imagen.vc2 b/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_imagen.vc2 new file mode 100644 index 0000000..5947af3 --- /dev/null +++ b/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_imagen.vc2 @@ -0,0 +1,23 @@ +*-------------------------------------------------------------------------------------------------------------------------------------------------------- +* (ES) AUTOGENERADO - ¡¡ATENCIÓN!! - ¡¡NO PENSADO PARA EJECUTAR!! USAR SOLAMENTE PARA INTEGRAR CAMBIOS Y ALMACENAR CON HERRAMIENTAS SCM!! +* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!! +*-------------------------------------------------------------------------------------------------------------------------------------------------------- +*< FOXBIN2PRG: Version="1.19" SourceFile="fb2p_classperfile_text.vcx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) +* +DEFINE CLASS cl_imagen AS image OLEPUBLIC && otro ole + *< CLASSDATA: Baseclass="image" Timestamp="" Scale="Pixels" Uniqueid="" /> + + * + *m: un_metodo_de_clase && Para testear si el código se va a la clase cl_form + * + + Height = 16 + Name = "cl_imagen" + Picture = bmps\sobrepostal.bmp + Width = 17 + + PROCEDURE un_metodo_de_clase && Para testear si el código se va a la clase cl_form + * ESTE CODIGO ES DE "cl_imagen::un_metodo_de_clase" + ENDPROC + +ENDDEFINE diff --git a/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_olebound.vc2 b/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_olebound.vc2 new file mode 100644 index 0000000..3a4bd63 --- /dev/null +++ b/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_olebound.vc2 @@ -0,0 +1,14 @@ +*-------------------------------------------------------------------------------------------------------------------------------------------------------- +* (ES) AUTOGENERADO - ¡¡ATENCIÓN!! - ¡¡NO PENSADO PARA EJECUTAR!! USAR SOLAMENTE PARA INTEGRAR CAMBIOS Y ALMACENAR CON HERRAMIENTAS SCM!! +* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!! +*-------------------------------------------------------------------------------------------------------------------------------------------------------- +*< FOXBIN2PRG: Version="1.19" SourceFile="fb2p_classperfile_text.vcx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) +* +DEFINE CLASS cl_olebound AS oleboundcontrol + *< CLASSDATA: Baseclass="oleboundcontrol" Timestamp="" Scale="Pixels" Uniqueid="" /> + + Height = 100 + Name = "cl_olebound" + Width = 100 + +ENDDEFINE diff --git a/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_olecontrol.vc2 b/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_olecontrol.vc2 new file mode 100644 index 0000000..57fd5f8 --- /dev/null +++ b/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_olecontrol.vc2 @@ -0,0 +1,14 @@ +*-------------------------------------------------------------------------------------------------------------------------------------------------------- +* (ES) AUTOGENERADO - ¡¡ATENCIÓN!! - ¡¡NO PENSADO PARA EJECUTAR!! USAR SOLAMENTE PARA INTEGRAR CAMBIOS Y ALMACENAR CON HERRAMIENTAS SCM!! +* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!! +*-------------------------------------------------------------------------------------------------------------------------------------------------------- +*< FOXBIN2PRG: Version="1.19" SourceFile="fb2p_classperfile_text.vcx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) +* +DEFINE CLASS cl_olecontrol AS olecontrol + *< CLASSDATA: Baseclass="olecontrol" Timestamp="" Scale="Pixels" Uniqueid="" Nombre="cl_olecontrol" Parent="" ObjName="cl_olecontrol" OLEObject="C:\Windows\system32\richtx32.ocx" Value="0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAEAAAAgAAAAEAAAD+////AAAAAAAAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/////v////7////+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1IAbwBvAHQAIABFAG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAUA//////////8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCpJ18M8c8BAwAAAAACAAAAAAAAAwBPAGwAZQBPAGIAagBlAGMAdABEAGEAdABhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAgEDAAAAAgAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAAAAAAAADAEEAYwBjAGUAcwBzAE8AYgBqAFMAaQB0AGUARABhAHQAYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgACAP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAABPAAAAAAAAAAMAQwBoAGEAbgBnAGUAZABQAHIAbwBwAHMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAIA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAEoAAAAAAAAABAAAAAIAAAD+////BQAAAAYAAAD+////BwAAAP7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9giHw7j9cbELm1BAIcAJQCIUM0EggAAACKDQAA7QYAACFDNBIBAAYArAAAAAAA//8AAP//AQAAAAAAAAAAAAAATwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAABcAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgcWhqIFp0dVFoYTtqZGZuW2lhZXRyIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAACADAAAAFJpZ2h0TWFyZ2luABEAAABODQAAAAcAAAAAAAAAAAAAAAUAAABUZXh0ABQAAABIAAAAAAsAAABPAAAAAAUAAIAAAAAAAAABAAAAAQABAAIACAAAAHtccnRmMVxhbnNpXGFuc2ljcGcxMjUyXGRlZmYwe1xmb250dGxlY29udHJvbDEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABibHtcZjBcZm5pbFxmY2hhcnNldDAgQXJpYWw7fX0NClx2aWV3a2luZDRcdWMxXHBhcmRcbGFuZzMwODJcZnMxOCBPbGVjb250cm9sMQ0KXHBhciB9DQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" /> + + Height = 67 + Name = "cl_olecontrol" + Width = 131 + +ENDDEFINE diff --git a/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_optiongroup.vc2 b/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_optiongroup.vc2 new file mode 100644 index 0000000..f7b6562 --- /dev/null +++ b/TESTS/DATOS_READONLY/fb2p_classperfile_text.cl_optiongroup.vc2 @@ -0,0 +1,51 @@ +*-------------------------------------------------------------------------------------------------------------------------------------------------------- +* (ES) AUTOGENERADO - ¡¡ATENCIÓN!! - ¡¡NO PENSADO PARA EJECUTAR!! USAR SOLAMENTE PARA INTEGRAR CAMBIOS Y ALMACENAR CON HERRAMIENTAS SCM!! +* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!! +*-------------------------------------------------------------------------------------------------------------------------------------------------------- +*< FOXBIN2PRG: Version="1.19" SourceFile="fb2p_classperfile_text.vcx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) +* +DEFINE CLASS cl_optiongroup AS optiongroup && descripcion + *< CLASSDATA: Baseclass="optiongroup" Timestamp="" Scale="Pixels" Uniqueid="" /> + + * + *m: propiedad_de_clase_con_valor_access + *m: propiedad_de_clase_con_valor_assign + *p: propiedad_de_clase_con_valor && Tiene un valor por defecto + *p: propiedad_de_clase_sin_valor && Una propiedad sin valor para heredar + * + + ButtonCount = 2 + Height = 46 + Name = "cl_optiongroup" + propiedad_de_clase_con_valor = UN VALOR DE LA CLASE && Tiene un valor por defecto + propiedad_de_clase_sin_valor = .F. && Una propiedad sin valor para heredar + Value = 1 + Width = 71 + Option1.Caption = "Option1" + Option1.Height = 17 + Option1.Left = 5 + Option1.Name = "Option1" + Option1.Top = 5 + Option1.Value = 1 + Option1.Width = 61 + Option2.Caption = "Option2" + Option2.Height = 17 + Option2.Left = 5 + Option2.Name = "Option2" + Option2.Top = 24 + Option2.Width = 61 + + PROCEDURE propiedad_de_clase_con_valor_access + *To do: Modify this routine for the Access method + RETURN THIS.propiedad_de_clase_con_valor + + ENDPROC + + PROCEDURE propiedad_de_clase_con_valor_assign + LPARAMETERS vNewVal + *To do: Modify this routine for the Assign method + THIS.propiedad_de_clase_con_valor = m.vNewVal + + ENDPROC + +ENDDEFINE diff --git a/TESTS/DATOS_READONLY/fb2p_classperfile_text.proj_hook.vc2 b/TESTS/DATOS_READONLY/fb2p_classperfile_text.proj_hook.vc2 new file mode 100644 index 0000000..84d9a31 --- /dev/null +++ b/TESTS/DATOS_READONLY/fb2p_classperfile_text.proj_hook.vc2 @@ -0,0 +1,14 @@ +*-------------------------------------------------------------------------------------------------------------------------------------------------------- +* (ES) AUTOGENERADO - ¡¡ATENCIÓN!! - ¡¡NO PENSADO PARA EJECUTAR!! USAR SOLAMENTE PARA INTEGRAR CAMBIOS Y ALMACENAR CON HERRAMIENTAS SCM!! +* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!! +*-------------------------------------------------------------------------------------------------------------------------------------------------------- +*< FOXBIN2PRG: Version="1.19" SourceFile="fb2p_classperfile_text.vcx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) +* +DEFINE CLASS proj_hook AS projecthook + *< CLASSDATA: Baseclass="projecthook" Timestamp="" Scale="Pixels" Uniqueid="" /> + + Height = 22 + Name = "proj_hook" + Width = 23 + +ENDDEFINE diff --git a/TESTS/DATOS_READONLY/fb2p_classperfile_text.vc2 b/TESTS/DATOS_READONLY/fb2p_classperfile_text.vc2 new file mode 100644 index 0000000..a5f8752 --- /dev/null +++ b/TESTS/DATOS_READONLY/fb2p_classperfile_text.vc2 @@ -0,0 +1,18 @@ +*-------------------------------------------------------------------------------------------------------------------------------------------------------- +* (ES) AUTOGENERADO - ¡¡ATENCIÓN!! - ¡¡NO PENSADO PARA EJECUTAR!! USAR SOLAMENTE PARA INTEGRAR CAMBIOS Y ALMACENAR CON HERRAMIENTAS SCM!! +* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!! +*-------------------------------------------------------------------------------------------------------------------------------------------------------- +*< FOXBIN2PRG: Version="1.19" SourceFile="fb2p_classperfile_text.vcx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) +* +*-- EXTERNAL_CLASS identify external member Class names / EXTERNAL_CLASS identifica los nombres de las Clases externas +*< EXTERNAL_CLASS: Name="cl_commandgroup" Baseclass="commandgroup" /> +*< EXTERNAL_CLASS: Name="cl_form" Baseclass="form" /> +*< EXTERNAL_CLASS: Name="cl_imagen" Baseclass="image" /> +*< EXTERNAL_CLASS: Name="cl_olebound" Baseclass="oleboundcontrol" /> +*< EXTERNAL_CLASS: Name="cl_olecontrol" Baseclass="olecontrol" /> +*< EXTERNAL_CLASS: Name="cl_optiongroup" Baseclass="optiongroup" /> +*< EXTERNAL_CLASS: Name="proj_hook" Baseclass="projecthook" /> + +* +*< LIBCOMMENT: Comentario principal de "fb2p_test.vcx" /> +* \ No newline at end of file diff --git a/TESTS/DATOS_READONLY/fb2p_classperfile_text.vct b/TESTS/DATOS_READONLY/fb2p_classperfile_text.vct new file mode 100644 index 0000000000000000000000000000000000000000..30bcaa6664706e4bc04525ea3458de2fcecf1116 GIT binary patch literal 86861 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 Date: Sat, 18 Feb 2017 16:11:01 +0100 Subject: [PATCH 03/19] Replace Scripting.FileSystemObject MoveFile with Win32API equivalent --- FileName_Caps/Filename_caps.pj2 | 4 +-- FileName_Caps/Filename_caps.pjt | Bin 8399 -> 9001 bytes FileName_Caps/Filename_caps.pjx | Bin 1583 -> 1583 bytes FileName_Caps/filename_caps.prg | 56 ++++++++++++++++++++++++-------- Normalize_FileNames.vbs | 8 +++-- filename_caps.exe | Bin 30137 -> 30585 bytes 6 files changed, 51 insertions(+), 17 deletions(-) diff --git a/FileName_Caps/Filename_caps.pj2 b/FileName_Caps/Filename_caps.pj2 index 24e849d..083628f 100644 --- a/FileName_Caps/Filename_caps.pj2 +++ b/FileName_Caps/Filename_caps.pj2 @@ -25,7 +25,7 @@ _LegalCopyright = "Creative Commons 4: Reconocimiento - CompartirIgual (by-sa): _LegalTrademark = "Creative Commons 4: Reconocimiento - CompartirIgual (by-sa): http://creativecommons.org/licenses/by/4.0/" _ProductName = "FILENAME_CAPS" _MajorVer = "2" -_MinorVer = "3" +_MinorVer = "4" _Revision = "0" _LanguageID = "" _AutoIncrement = "0" @@ -33,7 +33,7 @@ _AutoIncrement = "0" * -*<.HomeDir = 'c:\desa\filename_caps' /> +*<.HomeDir = 'c:\desa\foxbin2prg\filename_caps' /> FOR EACH loProject IN _VFP.Projects FOXOBJECT loProject.Close() diff --git a/FileName_Caps/Filename_caps.pjt b/FileName_Caps/Filename_caps.pjt index 70611661327bbbc91aca8b7c5e36461fc7710ebd..59df1e2e38c0bad22fb15f2c8ba3a2fa6699c0cd 100644 GIT binary patch delta 1749 zcmah~Yitx%6h3!$c4lWEbi0r4i!NK1QXviW#iJXEOlN1?t=rvpIz=>1nx$QE4W-a7 zh!2A09~yt)4MzE8{e_sAH2cFuLo_1smm#G|BMA{3O^Ak|5YuI|-Kl402`^2&lRI-B z-#z!7bI-YRP5dmu0z|hIZwYIJnwahMiV!Gfm|Gm_qT7Ym{-*KR=tOQNJ9=>H=Z<72b7SM#qcebm;QU`8ofDdhH-%<%_gO3A*{iNmU_C>aHLM&IRBDM|(l+T3JM`uXsq9Qao}QkXeio*6 z>KF$krlu#eg@N46O!m;fY%TD$XUVSJm-4&&`U9C)rP_H}E+(rywg8?K}jfJolLa+w~l2r0SsR2gm z9@nmhuNln+&8sB_Dg+XB)w20E(G+?w=%aHkiTRSDeeTyuk$&rbmAz}y_81z;6KDP~ z(X*cK$s087Z70X+JKjy~F|(G?^~GgR!+*+XJDf!Zmwp=dPc(@jKxAaK#9y=4S@Cv-{;!5CLzpf$qP_TZ!kjHAXh0axKsb2xt_7vYRJ zHzN8mAPQVn^XNG!nPCj8tX;3NvvzuU{Rm@m&<%}259`pJ2Eq<=R@C0LYg=&h20GsO zJlRA)X}ohft;p)*u6nwSuoL$uRVfpfu@iYPuBvo~hliJx1ycIzl$=ItuxBKZkd
gJS6Ya5P!L%M9QzGEerg40De80Cqq-BQjm41=0!gggD42W5F;?N3`(7=O-b@9jG+w3PO?^c5Dy0LyTjBbs@+v>VBw+IDk^RnnC*uR>R$iSvah zCdTPv40|+YA6c>wd{_+h^FFxklZgTTfca%hjAEjDkPTzriFSHCNJI8rMkJx#at>ZcO zFuRGLyL;GLjT&h)bw8&OiH4`yy)ecfFZhSHLJPYDd@YjRM zL^^4N$>iC1V&Zh%0ORqDJaIa0fOsmEOid*XFd0v$<&$yT3Wfb2$0Kc{%3cm_RV4ZyoifIE@xy-g+3Cr(1?q!tcN~CL>+aI^mCju@x>ugvl@lS78LMgTss;MchZ- zW`J{HfEWe;grs4jr$*}`(&>N5tJ&N_S)I-0%Zu6Bi^>+(Hx-+&~IUO-w*yTKo(QZ9uF5G{w?n@*7rX0BHgpw*UYD diff --git a/FileName_Caps/filename_caps.prg b/FileName_Caps/filename_caps.prg index 7c07146..c592838 100644 --- a/FileName_Caps/filename_caps.prg +++ b/FileName_Caps/filename_caps.prg @@ -45,19 +45,34 @@ RETURN lcFileName DEFINE CLASS cl_FileName_Caps AS Custom + PROCEDURE INIT + DECLARE INTEGER MoveFile IN KERNEL32.DLL STRING lpExistingFileName, STRING lpNewFileName + DECLARE INTEGER GetLastError IN KERNEL32.DLL + + * DOCUMENTACIÓN: https://msdn.microsoft.com/en-us/library/windows/desktop/ms679351(v=vs.85).aspx + DECLARE INTEGER FormatMessage IN KERNEL32.DLL INTEGER dwFlags, INTEGER lpSource, INTEGER dwMessageId ; + , INTEGER dwLanguageId, STRING @lpBuffer, INTEGER nSize, INTEGER Arguments + _SCREEN.AddProperty("ExitCodeFNC",0) + ENDPROC + PROCEDURE Capitalize LPARAMETERS tcFileName, tcFileMask, tcFileMaskType, tcLog, tlRelanzarError, tcDontShowErrors TRY LOCAL loEx AS EXCEPTION, laMasks(1,4), lcDefinition, lcFileDef, lcMaskDef, laLines(1), lcMenErr ; - , I, X, lcName, lcExt, lcPath, lcFileName, laFile(1,5), lcLogFile, lcSys16, lnPosProg ; - , loFSO AS Scripting.FileSystemObject + , I, X, lcName, lcExt, lcPath, lcFileName, laFile(1,5), lcLogFile, lcSys16, lnPosProg, lnRet + lnRet = 0 loEx = NULL - loFSO = CREATEOBJECT('Scripting.FileSystemObject') tcFileMaskType = EVL(tcFileMaskType,'M') lcFileName = tcFileName - lcLogFile = FORCEEXT(SYS(16),'LOG') + lcSys16 = SYS(16) + IF LEFT(lcSys16,10) == 'PROCEDURE ' + lnPosProg = AT(" ", lcSys16, 2) + 1 + ELSE + lnPosProg = 1 + ENDIF + lcLogFile = FORCEEXT( SUBSTR( lcSys16, lnPosProg ), 'LOG' ) tcLog = '' tcDontShowErrors = EVL( tcDontShowErrors, '0' ) @@ -66,13 +81,6 @@ DEFINE CLASS cl_FileName_Caps AS Custom tcLog = tcLog + CR_LF + '- No hay máscara definida ni archivo de configuración' EXIT && No se indicó nada que hacer ELSE - lcSys16 = SYS(16) - IF LEFT(lcSys16,10) == 'PROCEDURE ' - lnPosProg = AT(" ", lcSys16, 2) + 1 - ELSE - lnPosProg = 1 - ENDIF - tcFileMask = FORCEEXT( SUBSTR( lcSys16, lnPosProg ), 'CFG' ) tcLog = tcLog + CR_LF + '- Se usará el archivo de configuración [' + tcFileMask + ']' IF NOT FILE(tcFileMask) @@ -163,9 +171,19 @@ DEFINE CLASS cl_FileName_Caps AS Custom EXIT ENDIF ENDFOR + + *MESSAGEBOX( 'lcLogFile = ' + TRANSFORM(lcLogFile),0+4096, 'Error' ) IF ADIR( laFile, lcFileName, '', 1 ) > 0 AND laFile(1,1) <> JUSTFNAME(lcFileName) - loFSO.MoveFile( FORCEPATH( laFile(1,1), JUSTPATH(lcFileName) ), lcFileName ) + lnRet = MoveFile( FORCEPATH( laFile(1,1), JUSTPATH(lcFileName) ), lcFileName ) + *MESSAGEBOX('(MoveFile) lnRet = ' + TRANSFORM(lnRet),0+4096, 'Error') + + IF lnRet = 0 && Failed + lnRet = GetLastError() + *MESSAGEBOX('(GetLastError) lnRet = ' + TRANSFORM(lnRet),0+4096, 'Error') + ERROR 'MoveFile' + ENDIF + tcLog = tcLog + CR_LF + ' => Se renombrará a [' + lcFileName + ']' ELSE tcLog = tcLog + CR_LF + ' => No se renombrará a [' + lcFileName + '] porque ya estaba correcto.' @@ -173,6 +191,19 @@ DEFINE CLASS cl_FileName_Caps AS Custom CATCH TO loEx + _SCREEN.ExitCodeFNC = loEx.ErrorNo + + IF loEx.ErrorNo = 1098 && User defined error + IF LOWER(loEx.Message) == 'movefile' + * SE OBTIENE EL MENSAJE DE ERROR DEL SISTEMA CORRESPONDIENTE A GetLastError() + * FORMAT_MESSAGE_FROM_SYSTEM 0x00001000 + LOCAL lnRetLen, lpBuffer + lpBuffer = REPLICATE(CHR(0),256) + lnRetLen = FormatMessage(0x00001000,0,lnRet,0,@lpBuffer,256,0) + loEx.Message = LEFT(lpBuffer, lnRetLen) + ENDIF + ENDIF + IF tlRelanzarError THEN THROW ELSE @@ -190,7 +221,6 @@ DEFINE CLASS cl_FileName_Caps AS Custom ENDIF FINALLY - loFSO = NULL tcFileName = lcFileName *-- Si existe FileName_Caps.LOG, lo actualiza diff --git a/Normalize_FileNames.vbs b/Normalize_FileNames.vbs index 7162027..2aab863 100644 --- a/Normalize_FileNames.vbs +++ b/Normalize_FileNames.vbs @@ -48,7 +48,11 @@ Else Next If GetBit(nDebug, 4) Then - MsgBox "End of Process!", 64, WScript.ScriptName + If nExitCode = 0 Then + MsgBox "End of Process!", 64, WScript.ScriptName + Else + MsgBox "End of Process!", 48, WScript.ScriptName + End If End If End If @@ -93,7 +97,7 @@ Private Sub evaluateFile( tcFile ) MsgBox cCMD, 0, "PARAMETERS" Else nRet = oVFP9.DoCmd( cCMD ) - 'nExitCode = oVFP9.Eval("_SCREEN.ExitCode") + nExitCode = oVFP9.Eval("_SCREEN.ExitCodeFNC") End If End Sub diff --git a/filename_caps.exe b/filename_caps.exe index 4ecf2fa9fa8facdeacbe549aa0ba47d3152e8808..93cf86cb8f9a2c8b71e61c80f7e1bd0f39965842 100644 GIT binary patch delta 1733 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 From ec7b47a336f2c7749cb4986733b7d2017ae5c0f5 Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Sun, 19 Feb 2017 12:25:37 +0100 Subject: [PATCH 04/19] =?UTF-8?q?filename=5Fcaps.exe:=20Agregado=20reinten?= =?UTF-8?q?to=20de=20renombrado=20para=20intentar=20prevenir=20el=20error?= =?UTF-8?q?=20espor=C3=A1dico=20de=20"Can=20not=20create=20a=20file=20that?= =?UTF-8?q?=20already=20exists"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FileName_Caps/filename_caps.prg | 44 ++++++++++++++++++++++++++++---- filename_caps.exe | Bin 30585 -> 31100 bytes 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/FileName_Caps/filename_caps.prg b/FileName_Caps/filename_caps.prg index c592838..f31e162 100644 --- a/FileName_Caps/filename_caps.prg +++ b/FileName_Caps/filename_caps.prg @@ -44,10 +44,23 @@ RETURN lcFileName DEFINE CLASS cl_FileName_Caps AS Custom + _memberdata = [] ; + + [] ; + + [] ; + + [] + PROCEDURE INIT - DECLARE INTEGER MoveFile IN KERNEL32.DLL STRING lpExistingFileName, STRING lpNewFileName + *DECLARE INTEGER MoveFile IN KERNEL32.DLL STRING lpExistingFileName, STRING lpNewFileName + + * DOCUMENTACIÓN: https://msdn.microsoft.com/es-es/library/windows/desktop/aa365240(v=vs.85).aspx + * dwFlags: + * 1 (0x1) MOVEFILE_REPLACE_EXISTING + * 8 (0x8) MOVEFILE_WRITE_THROUGH + DECLARE INTEGER MoveFileEx IN KERNEL32.DLL STRING lpExistingFileName, STRING lpNewFileName, INTEGER dwFlags + DECLARE INTEGER GetLastError IN KERNEL32.DLL + DECLARE Sleep IN KERNEL32.DLL INTEGER dwMilliseconds * DOCUMENTACIÓN: https://msdn.microsoft.com/en-us/library/windows/desktop/ms679351(v=vs.85).aspx DECLARE INTEGER FormatMessage IN KERNEL32.DLL INTEGER dwFlags, INTEGER lpSource, INTEGER dwMessageId ; @@ -55,9 +68,10 @@ DEFINE CLASS cl_FileName_Caps AS Custom _SCREEN.AddProperty("ExitCodeFNC",0) ENDPROC - PROCEDURE Capitalize - LPARAMETERS tcFileName, tcFileMask, tcFileMaskType, tcLog, tlRelanzarError, tcDontShowErrors - + PROCEDURE Capitalize(tcFileName, tcFileMask, tcFileMaskType, tcLog, tlRelanzarError, tcDontShowErrors) + #IF .F. + LOCAL THIS AS cl_FileName_Caps OF 'filename_caps\filename_caps.prg' + #ENDIF TRY LOCAL loEx AS EXCEPTION, laMasks(1,4), lcDefinition, lcFileDef, lcMaskDef, laLines(1), lcMenErr ; , I, X, lcName, lcExt, lcPath, lcFileName, laFile(1,5), lcLogFile, lcSys16, lnPosProg, lnRet @@ -175,7 +189,7 @@ DEFINE CLASS cl_FileName_Caps AS Custom *MESSAGEBOX( 'lcLogFile = ' + TRANSFORM(lcLogFile),0+4096, 'Error' ) IF ADIR( laFile, lcFileName, '', 1 ) > 0 AND laFile(1,1) <> JUSTFNAME(lcFileName) - lnRet = MoveFile( FORCEPATH( laFile(1,1), JUSTPATH(lcFileName) ), lcFileName ) + lnRet = THIS.RenameFile( FORCEPATH( laFile(1,1), JUSTPATH(lcFileName) ), lcFileName ) *MESSAGEBOX('(MoveFile) lnRet = ' + TRANSFORM(lnRet),0+4096, 'Error') IF lnRet = 0 && Failed @@ -237,4 +251,24 @@ DEFINE CLASS cl_FileName_Caps AS Custom RETURN lcFileName ENDPROC + + FUNCTION RenameFile(lpExistingFileName as String, lpNewFileName as String) as Integer + * RENAME con reintento. A veces el sistema operativo puede devolver un error en los primeros intentos de renombrado, + * por ejemplo con el error "Can not create a file that already exists" + * FUENTE: http://stackoverflow.com/questions/13025313/why-os-rename-is-raising-an-exception-in-python-2-7 + LOCAL lnRet + lnRet = 0 + *lnRet = MoveFile( FORCEPATH( laFile(1,1), JUSTPATH(lcFileName) ), lcFileName ) + + FOR I = 1 TO 10 + lnRet = MoveFileEx( lpExistingFileName, lpNewFileName, 0x1 + 0x8 ) + IF lnRet != 0 + EXIT + ENDIF + Sleep(10) + ENDFOR + RETURN lnRet + ENDFUNC + + ENDDEFINE && CLASS cl_FileName_Caps AS Custom diff --git a/filename_caps.exe b/filename_caps.exe index 93cf86cb8f9a2c8b71e61c80f7e1bd0f39965842..321f50f459e62df71629c2b45c9ebe01e236c8b6 100644 GIT binary patch delta 1374 zcmZuxOKcle6g_WjkL_`sA1-P0@sCE0L`hw0DpHcFjx#PUj-8GtA*BN2Hj@&`PTbf@ z3j{@#!UE`mWGYov#UgZxRH!0W2-qWmFjBK;g%DEJMpYbZ>=Ady4GD;mp5~tW?mhSO z?t9fothU9zIeO8t{^@Vbd1GsGBYg3pgC9HqJo2b5QwIlDuB4-qC?5X@%&auAla0E+bO~B~fq7s|QDdP3#wI;kF zN=Y$s;^qF4L}JsvX)mk4D81c1Ski1r=M<&zU!$_RrHl^nsOuJt+d+J(2{9H=h~lK< zA2th!t_f#FIT1&;33WDCZR`4BudJx-(h_(&A zwMqwe7+UL9+fPot88YG4T6DWpJyW<~%?bKjs_(rHwSG0AJ}mU-Z#C)dkbfVjbdl9l z9+hsQIY2ZGxoSOUHK+nE-Al@-q3yvL&4E0%Vwzgvq1_&r?!x_w7xsz|3=V^@>mH-#iVYc!;dl$t-&B8|pLogT*42~TZ2Qwr`A*pqBy#p&1iwRi0ueQS(p+13rh|)4_q98&L&5p&nO&x4Z24_r$QO0#p zI|Gd#zk@q9DqGmLk(m`A>rM>Uh{POH9_>hsiIefPOnDijN?D6;(j~<=ccBf5q$J7= z@%BbqlZ*l8cFX==FCt_nG*;4kj7RF#+$zM|D zrwIBDr=j5GY+Io{!lQwr#yC=|6jl5c{8dpuKOJKQVAN40tS!m zMyI0}@a3OoehrBVKtr+^65U@07c!&b=&&e_MC3>-F6T1F+mNJGGn7=3M|7cBn#%{; z1LT6o>;apwa@;DnhEur44Rd7{wv^ckJYXy8+QN_QhAJ(lmcw|$N+_eqR#_X1AVP8k zs|aJnc@M2@9R=4q{Oq_v`mfJU=m!C)xq(+mrXPf6;Ilp;M)GZ1cS(NjMXG@0d$j6K bAWpcSWTQW`>f^;L96g&Cu60|N=mq^7SLLxZ delta 811 zcmY*YQAkr^6#o9ZySwdf=GAO2=jN8qKqO`}Ng+t)HL|to-4x1bNp4`cT+U1(F?#bM z$bKjiddSBfA`yCv9(z?Iskfq+LXe1XuDMI+ZcudLzyCSk`ObIF;s5`GpRBOUUbT-} z_m{R<(DiUs+~Rq8$r?9}q=aaT9&@vx?<(KE6B{wi5hN7&g#GoTbq+G+LTQtD|UxUAN<9-UCbC3(8K= zM)ktfgRfu$8!G9?3G^6XL54y&DlPh5L^UV`?KPE4Cn`0FN};@mZ`^XWh3vYBH@X$> zg86|%_fRWE8%_sNAE6wvOIDq2!_U#O}$en>?NMJ6Y1 zrhHO)o@2!RM`(sr((8;_^JXNA3?0>^yTpG_k1#7A%DHRADqShZ9e6HNY?m+OhFJ^u zrsBMH=9#&Cj(lTgk+;t_TpbWVR|cqujMeXDQ!iVD!#H?A!S%_caZRFQnN%`7md!~B z-_FfUWr}pmfFEp)jfjG Date: Thu, 23 Mar 2017 20:29:46 +0100 Subject: [PATCH 05/19] Bug Fix: Fixed single-class generation with syntax "classlib.vcx::classname" --- foxbin2prg.prg | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/foxbin2prg.prg b/foxbin2prg.prg index 5f2280a..e2d2b1f 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -192,6 +192,7 @@ * 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 scx/vcx: No funciona la generación de una clase individual con "classlib.vcx::classname" (Lutz Scheffler) * * *--------------------------------------------------------------------------------------------------- @@ -300,6 +301,7 @@ * 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 scx/vcx v1.19.48: No funciona la generación de una clase individual con "classlib.vcx::classname" (Arreglado en v1.19.49) * * *--------------------------------------------------------------------------------------------------- @@ -2703,9 +2705,11 @@ DEFINE CLASS c_foxbin2prg AS Session *ENDIF *-- Reconocimiento de la clase indicada + *-- Ej: [c:\desa\test\library.vcx::classname] IF '::' $ tc_InputFile THEN - .c_ClassToConvert = LOWER( ALLTRIM( GETWORDNUM( tc_InputFile, 2, '::' ) ) ) - tc_InputFile = LOWER( ALLTRIM( GETWORDNUM( tc_InputFile, 1, '::' ) ) ) + tc_InputFile = STRTRAN(tc_InputFile, '::', '|') + .c_ClassToConvert = LOWER( ALLTRIM( GETWORDNUM( tc_InputFile, 2, '|' ) ) ) + tc_InputFile = LOWER( ALLTRIM( GETWORDNUM( tc_InputFile, 1, '|' ) ) ) ENDIF .c_Foxbin2prg_ConfigFile = EVL( tcCFG_File, .c_Foxbin2prg_ConfigFile ) From 4c5c5f5f850d61eb0b97202886e944c34d4bb344 Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Sat, 25 Mar 2017 14:03:59 +0100 Subject: [PATCH 06/19] =?UTF-8?q?Incompleto=20-=20por=20alg=C3=BAn=20motiv?= =?UTF-8?q?o=20no=20lo=20termina=20de=20poder=20usar=20el=20nuevo=20CFG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- foxbin2prg.prg | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/foxbin2prg.prg b/foxbin2prg.prg index e2d2b1f..fa833eb 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -1854,9 +1854,19 @@ DEFINE CLASS c_foxbin2prg AS Session IF .l_Main_CFG_Loaded AND NOT EMPTY(tc_InputFile) AND NOT tcInputFile_Type == C_FILETYPE_QUERYSUPPORT THEN IF tcInputFile_Type == C_FILETYPE_DIRECTORY THEN - lcConfigFile = FULLPATH( 'foxbin2prg.cfg', ADDBS(tc_InputFile) ) + IF NOT EMPTY(lcConfigFile) AND NOT EMPTY(JUSTPATH(lcConfigFile)) ; + AND ADDBS(JUSTPATH(lcConfigFile)) == ADDBS(tc_InputFile) + * Preservar el config indicado manualmente + ELSE + lcConfigFile = FULLPATH( 'foxbin2prg.cfg', ADDBS(tc_InputFile) ) + ENDIF ELSE - lcConfigFile = FULLPATH( 'foxbin2prg.cfg', tc_InputFile ) + IF NOT EMPTY(lcConfigFile) AND NOT EMPTY(JUSTPATH(lcConfigFile)) ; + AND ADDBS(JUSTPATH(lcConfigFile)) == ADDBS(JUSTPATH(tc_InputFile)) + * Preservar el config indicado manualmente + ELSE + lcConfigFile = FULLPATH( 'foxbin2prg.cfg', tc_InputFile ) + ENDIF ENDIF ENDIF From c60727b91b34bcb682ed92327a58836bcec41240 Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Sat, 25 Mar 2017 20:52:27 +0100 Subject: [PATCH 07/19] Permitir importar solo una clase desde un vc2 --- foxbin2prg.prg | 388 +++++++++++++++++++++++++++++++------------------ 1 file changed, 244 insertions(+), 144 deletions(-) diff --git a/foxbin2prg.prg b/foxbin2prg.prg index e2d2b1f..485437e 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -192,7 +192,8 @@ * 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 scx/vcx: No funciona la generación de una clase individual con "classlib.vcx::classname" (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" (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) * * *--------------------------------------------------------------------------------------------------- @@ -301,7 +302,8 @@ * 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 scx/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 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) * * *--------------------------------------------------------------------------------------------------- @@ -795,6 +797,7 @@ DEFINE CLASS c_foxbin2prg AS Session n_ExcludeDBFAutoincNextval = 0 l_ClassPerFileCheck = .F. l_RedirectClassPerFileToMain = .F. + n_RedirectClassType = 0 && 0=Redireccionar Todas las clases, 1=Redireccionar solo la clase indicada l_NoTimestamps = .T. c_BackgroundImage = '' l_ClearUniqueID = .T. @@ -1200,6 +1203,15 @@ DEFINE CLASS c_foxbin2prg AS Session ENDPROC + PROCEDURE n_RedirectClassType_ACCESS + IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) + RETURN THIS.n_RedirectClassType + ELSE + RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).n_RedirectClassType, THIS.n_RedirectClassType ) + ENDIF + ENDPROC + + PROCEDURE l_RemoveNullCharsFromCode_ACCESS IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) RETURN THIS.l_RemoveNullCharsFromCode @@ -2074,6 +2086,13 @@ DEFINE CLASS c_foxbin2prg AS Session .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > RedirectClassPerFileToMain: ' + TRANSFORM(lcValue) ) ENDIF + CASE LEFT( laConfig(I), 18 ) == LOWER('RedirectClassType:') + lcValue = ALLTRIM( SUBSTR( laConfig(I), 19 ) ) + IF INLIST( lcValue, '0', '1' ) THEN + lo_CFG.n_RedirectClassType = INT( VAL( lcValue ) ) + .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > RedirectClassType: ' + TRANSFORM(lcValue) ) + ENDIF + CASE LEFT( laConfig(I), 24 ) == LOWER('RemoveNullCharsFromCode:') lcValue = ALLTRIM( SUBSTR( laConfig(I), 25 ) ) IF INLIST( lcValue, '0', '1' ) THEN @@ -2234,6 +2253,7 @@ DEFINE CLASS c_foxbin2prg AS Session .writeLog( C_TAB + 'n_UseClassPerFile: ' + TRANSFORM(.n_UseClassPerFile) ) .writeLog( C_TAB + 'l_ClassPerFileCheck: ' + TRANSFORM(.l_ClassPerFileCheck) ) .writeLog( C_TAB + 'l_RedirectClassPerFileToMain: ' + TRANSFORM(.l_RedirectClassPerFileToMain) ) + .writeLog( C_TAB + 'n_RedirectClassType: ' + TRANSFORM(.n_RedirectClassType) ) .writeLog( C_TAB + 'n_Debug: ' + TRANSFORM(.n_Debug) ) .writeLog( C_TAB + 'n_ExtraBackupLevels: ' + TRANSFORM(.n_ExtraBackupLevels) ) .writeLog( C_TAB + 'c_BackgroundImage: ' + TRANSFORM(.c_BackgroundImage) ) @@ -2539,8 +2559,8 @@ DEFINE CLASS c_foxbin2prg AS Session , lcExt == .c_LB2, .LBX_Conversion_Support = 2 ; , lcExt == .c_MN2, .MNX_Conversion_Support = 2 ; , lcExt == .c_DB2, NOT ISNULL(loDBF_CFG) AND INLIST(loDBF_CFG.DBF_Conversion_Support, 2, 8) ; - OR (INLIST(.DBF_Conversion_Support, 2, 8) ; - AND (ISNULL(loDBF_CFG) OR NOT INLIST(loDBF_CFG.DBF_Conversion_Support, 1, 4))) ; + OR (INLIST(.DBF_Conversion_Support, 2, 8) ; + AND (ISNULL(loDBF_CFG) OR NOT INLIST(loDBF_CFG.DBF_Conversion_Support, 1, 4))) ; , lcExt == .c_DC2, .DBC_Conversion_Support = 2 ; , .F. ) ENDWITH && THIS @@ -3589,10 +3609,16 @@ DEFINE CLASS c_foxbin2prg AS Session lcForceAttribs = lcForceAttribs + '-R' ENDIF - *-- OPTIMIZACIÓN VC2/SC2/DC2: VERIFICO SI EL ARCHIVO BASE FUE PROCESADO PARA DESCARTAR REPROCESOS IF .n_UseClassPerFile > 0 AND .l_RedirectClassPerFileToMain THEN DO CASE + CASE .n_RedirectClassType = 1 && Redireccionar solo esta clase + IF OCCURS('.', JUSTSTEM(.c_InputFile)) = 0 THEN + lc_BaseFile = .c_InputFile + ELSE + lc_BaseFile = FORCEPATH( FORCEEXT( JUSTSTEM( JUSTSTEM(.c_InputFile) ), JUSTEXT(.c_InputFile)) , JUSTPATH(.c_InputFile) ) + ENDIF + CASE .n_UseClassPerFile = 1 AND INLIST(lcExtension,.c_VC2,.c_SC2) IF OCCURS('.', JUSTSTEM(.c_InputFile)) = 0 THEN lc_BaseFile = .c_InputFile @@ -9918,7 +9944,7 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin TRY LOCAL lnCodError, laCodeLines(1), lnCodeLines, lcInputFile, lcInputFile_Class, lnFileCount, laFiles(1,5) ; - , laLineasExclusion(1), lnBloquesExclusion, I, lcClassName, lnIDInputFile ; + , laLineasExclusion(1), lnBloquesExclusion, I, lcClassName, lnIDInputFile, llReplaceClass ; , loLang as CL_LANG OF 'FOXBIN2PRG.PRG' WITH THIS AS c_conversor_prg_a_vcx OF 'FOXBIN2PRG.PRG' @@ -9931,29 +9957,39 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin lnIDInputFile = toFoxBin2Prg.n_ProcessedFiles IF toFoxBin2Prg.n_UseClassPerFile > 0 AND toFoxBin2Prg.l_RedirectClassPerFileToMain - C_FB2PRG_CODE = FILETOSTR( .c_InputFile ) + IF toFoxBin2Prg.n_RedirectClassType = 0 && Redireccionar todas las clases + C_FB2PRG_CODE = FILETOSTR( .c_InputFile ) - lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) + lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) - .updateProgressbar( 'Identifying Header Blocks...', 1, lnCodeLines, 1 ) - .identifyHeaderBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toModulo, @toFoxBin2Prg ) + .updateProgressbar( 'Identifying Header Blocks...', 1, lnCodeLines, 1 ) + .identifyHeaderBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toModulo, @toFoxBin2Prg ) - .updateProgressbar( 'Loading Code...', 2, lnCodeLines, 1 ) + .updateProgressbar( 'Loading Code...', 2, lnCodeLines, 1 ) + ENDIF *-- MÁSCARA DE BÚSQUEDA IF toFoxBin2Prg.n_UseClassPerFile = 1 THEN *-- Esto crea la máscara de búsqueda "filename.*.ext" para encontrar las partes + *-- con la sintaxis "Classlib.Classname.ext" o "Database.MemberName.ext" lcBaseFilename = JUSTSTEM( JUSTSTEM(.c_InputFile) ) lcInputFile = ADDBS( JUSTPATH(.c_InputFile) ) + lcBaseFilename + '.*.' + JUSTEXT(.c_InputFile) ELSE && toFoxBin2Prg.n_UseClassPerFile = 2 - *-- Esto crea la máscara de búsqueda "Database.*.*.ext" para encontrar las partes - *-- con la sintaxis "Database.MemberType.MemberName.ext" + *-- Esto crea la máscara de búsqueda "filename.*.*.ext" para encontrar las partes + *-- con la sintaxis "Classlib.ClassType.Classname.ext" o "Database.MemberType.MemberName.ext" lcBaseFilename = JUSTSTEM( JUSTSTEM( JUSTSTEM(.c_InputFile) ) ) lcInputFile = ADDBS( JUSTPATH(.c_InputFile) ) + lcBaseFilename + '.*.*.' + JUSTEXT(.c_InputFile) ENDIF + IF toFoxBin2Prg.n_RedirectClassType = 1 && Redireccionar solo esta clase + lcInputFile = .c_InputFile + ENDIF + lnFileCount = ADIR( laFiles, lcInputFile, "", 1 ) - ASORT( laFiles, 1, 0, 0, 1) + + IF lnFileCount > 1 + ASORT( laFiles, 1, 0, 0, 1) + ENDIF FOR I = 1 TO lnFileCount IF toFoxBin2Prg.n_UseClassPerFile = 1 THEN @@ -9964,7 +10000,7 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin IF toFoxBin2Prg.l_ClassPerFileCheck AND ASCAN( toModulo._ExternalClasses , lcClassName, 1, 0, 1, 1+2+4 ) = 0 .writeLog( C_TAB + '- ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) .writeErrorLog( C_TAB + '- ' + loLang.C_WARNING_LOC + ' ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) - LOOP && Salteo esta clase + LOOP && Salteo esta clase porque se indicó chequear y no concuerda con las anotadas ENDIF ELSE && toFoxBin2Prg.n_UseClassPerFile = 2 lcInputFile_Class = FORCEPATH( JUSTSTEM( laFiles(I,1) ), JUSTPATH( .c_InputFile ) ) + '.' + JUSTEXT( .c_InputFile ) @@ -9974,7 +10010,7 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin IF toFoxBin2Prg.l_ClassPerFileCheck AND ASCAN( toModulo._ExternalClasses , lcClassName, 1, 0, 2, 1+2+4 ) = 0 .writeLog( C_TAB + '- ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) .writeErrorLog( C_TAB + '- ' + loLang.C_WARNING_LOC + ' ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) - LOOP && Salteo esta clase porque no concuerda con las anotadas + LOOP && Salteo esta clase porque se indicó chequear y no concuerda con las anotadas ENDIF ENDIF @@ -10034,9 +10070,23 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin toFoxBin2Prg.updateProcessedFile( lnIDInputFile ) .updateProgressbar( loLang.C_GENERATING_BINARY_LOC + '...', 0, lnCodeLines, 1 ) - toFoxBin2Prg.doBackup( .F., .T., '', '', '' ) - .createClasslib() - .writeBinaryFile( @toModulo, @toFoxBin2Prg ) + + IF toFoxBin2Prg.n_RedirectClassType = 1 && Redireccionar solo esta clase a main + llReplaceClass = .T. + toFoxBin2Prg.c_OutputFile = FORCEEXT( lcBaseFilename, 'VCX' ) + toFoxBin2Prg.doBackup( .F., .T., '', '', '' ) + + IF ADIR( laFiles, toFoxBin2Prg.c_OutputFile, "", 1 ) = 1 + USE (toFoxBin2Prg.c_OutputFile) ALIAS TABLABIN AGAIN SHARED + ELSE + .createClasslib() + ENDIF + ELSE + toFoxBin2Prg.doBackup( .F., .T., '', '', '' ) + .createClasslib() + ENDIF + + .writeBinaryFile( @toModulo, @toFoxBin2Prg, llReplaceClass ) ENDWITH && THIS @@ -10060,7 +10110,7 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin PROCEDURE writeBinaryFile - LPARAMETERS toModulo, toFoxBin2Prg + LPARAMETERS toModulo, toFoxBin2Prg, tlReplaceClass *-- Estructura del objeto toModulo generado: *-- ----------------------------------------------------------------------------------------------------------- *-- Version Versión usada para generar la versión PRG analizada @@ -10132,7 +10182,7 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin #ENDIF TRY - LOCAL lcObjName, lnCodError, I, X, loEx AS EXCEPTION ; + LOCAL lcObjName, lnCodError, I, X, llReplace, laUniqueID(1,1), loEx AS EXCEPTION ; , loClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' ; , loFSO AS Scripting.FileSystemObject @@ -10149,131 +10199,178 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin ERROR 'OutputFile Error Simulation' ENDCASE - *-- Creo el registro de cabecera - .createClasslib_RecordHeader( toModulo ) + IF tlReplaceClass + I = 1 + loClase = toModulo._Clases(I) + LOCATE FOR PLATFORM == PADR('WINDOWS', FSIZE('PLATFORM')) AND OBJNAME == PADR(loClase._ObjName, FSIZE('OBJNAME')) + llReplace = FOUND() + ENDIF + + IF llReplace + *-- Reemplazar los campos del registro actual + IF EMPTY(loClase._TimeStamp) + loClase._TimeStamp = .rowTimeStamp( {^2013/11/04 20:00:00} ) + ENDIF + IF EMPTY(loClase._UniqueID) + loClase._UniqueID = toFoxBin2Prg.unique_ID() + ENDIF + + REPLACE ; + PLATFORM WITH 'WINDOWS' ; + , TIMESTAMP WITH loClase._TimeStamp ; + , CLASS WITH loClase._Class ; + , CLASSLOC WITH loClase._ClassLoc ; + , BASECLASS WITH loClase._BaseClass ; + , OBJNAME WITH loClase._ObjName ; + , PARENT WITH loClase._Parent ; + , PROPERTIES WITH loClase._PROPERTIES ; + , PROTECTED WITH loClase._PROTECTED ; + , METHODS WITH loClase._METHODS ; + , OLE WITH loClase._Ole ; + , OLE2 WITH loClase._Ole2 ; + , RESERVED1 WITH loClase._RESERVED1 ; + , RESERVED2 WITH loClase._RESERVED2 ; + , RESERVED3 WITH loClase._RESERVED3 ; + , RESERVED4 WITH loClase._RESERVED4 ; + , RESERVED5 WITH loClase._RESERVED5 ; + , RESERVED6 WITH loClase._RESERVED6 ; + , RESERVED7 WITH loClase._RESERVED7 ; + , RESERVED8 WITH loClase._RESERVED8 ; + , USER WITH loClase._User + + .insert_AllObjects( @loClase, @toFoxBin2Prg ) + + ELSE + *-- Creo el registro de cabecera + IF tlReplaceClass AND RECCOUNT() > 0 + SELECT MAX(VAL(SUBSTR(UNIQUEID,2))) FROM TABLABIN INTO ARRAY laUniqueID + toFoxBin2Prg.n_ID = laUniqueID(1) + ELSE + .createClasslib_RecordHeader( toModulo ) + ENDIF + + *-- Recorro las CLASES + FOR X = 1 TO 2 + FOR I = 1 TO toModulo._Clases_Count + loClase = NULL + loClase = toModulo._Clases(I) + + *-- El dataenvironment debe estar primero, luego lo demás. + IF X = 1 AND NOT loClase._BaseClass == 'dataenvironment' ; + OR X = 2 AND loClase._BaseClass == 'dataenvironment' + LOOP + ENDIF + + IF EMPTY(loClase._TimeStamp) + loClase._TimeStamp = .rowTimeStamp( {^2013/11/04 20:00:00} ) + ENDIF + IF EMPTY(loClase._UniqueID) + loClase._UniqueID = toFoxBin2Prg.unique_ID() + ENDIF + + *-- Inserto la clase + INSERT INTO TABLABIN ; + ( PLATFORM ; + , UNIQUEID ; + , TIMESTAMP ; + , CLASS ; + , CLASSLOC ; + , BASECLASS ; + , OBJNAME ; + , PARENT ; + , PROPERTIES ; + , PROTECTED ; + , METHODS ; + , OLE ; + , OLE2 ; + , RESERVED1 ; + , RESERVED2 ; + , RESERVED3 ; + , RESERVED4 ; + , RESERVED5 ; + , RESERVED6 ; + , RESERVED7 ; + , RESERVED8 ; + , USER) ; + VALUES ; + ( 'WINDOWS' ; + , loClase._UniqueID ; + , loClase._TimeStamp ; + , loClase._Class ; + , loClase._ClassLoc ; + , loClase._BaseClass ; + , loClase._ObjName ; + , loClase._Parent ; + , loClase._PROPERTIES ; + , loClase._PROTECTED ; + , loClase._METHODS ; + , loClase._Ole ; + , loClase._Ole2 ; + , loClase._RESERVED1 ; + , loClase._RESERVED2 ; + , loClase._RESERVED3 ; + , loClase._ClassIcon ; + , loClase._ProjectClassIcon ; + , loClase._Scale ; + , loClase._Comentario ; + , loClase._includeFile ; + , loClase._User ) - *-- Recorro las CLASES - FOR X = 1 TO 2 - FOR I = 1 TO toModulo._Clases_Count - loClase = NULL - loClase = toModulo._Clases(I) - - *-- El dataenvironment debe estar primero, luego lo demás. - IF X = 1 AND NOT loClase._BaseClass == 'dataenvironment' ; - OR X = 2 AND loClase._BaseClass == 'dataenvironment' - LOOP - ENDIF - - IF EMPTY(loClase._TimeStamp) - loClase._TimeStamp = .rowTimeStamp( {^2013/11/04 20:00:00} ) - ENDIF - IF EMPTY(loClase._UniqueID) - loClase._UniqueID = toFoxBin2Prg.unique_ID() - ENDIF - - *-- Inserto la clase - INSERT INTO TABLABIN ; - ( PLATFORM ; - , UNIQUEID ; - , TIMESTAMP ; - , CLASS ; - , CLASSLOC ; - , BASECLASS ; - , OBJNAME ; - , PARENT ; - , PROPERTIES ; - , PROTECTED ; - , METHODS ; - , OLE ; - , OLE2 ; - , RESERVED1 ; - , RESERVED2 ; - , RESERVED3 ; - , RESERVED4 ; - , RESERVED5 ; - , RESERVED6 ; - , RESERVED7 ; - , RESERVED8 ; - , USER) ; - VALUES ; - ( 'WINDOWS' ; - , loClase._UniqueID ; - , loClase._TimeStamp ; - , loClase._Class ; - , loClase._ClassLoc ; - , loClase._BaseClass ; - , loClase._ObjName ; - , loClase._Parent ; - , loClase._PROPERTIES ; - , loClase._PROTECTED ; - , loClase._METHODS ; - , loClase._Ole ; - , loClase._Ole2 ; - , loClase._RESERVED1 ; - , loClase._RESERVED2 ; - , loClase._RESERVED3 ; - , loClase._ClassIcon ; - , loClase._ProjectClassIcon ; - , loClase._Scale ; - , loClase._Comentario ; - , loClase._includeFile ; - , loClase._User ) + .insert_AllObjects( @loClase, @toFoxBin2Prg ) - .insert_AllObjects( @loClase, @toFoxBin2Prg ) + *-- Inserto el COMMENT + INSERT INTO TABLABIN ; + ( PLATFORM ; + , UNIQUEID ; + , TIMESTAMP ; + , CLASS ; + , CLASSLOC ; + , BASECLASS ; + , OBJNAME ; + , PARENT ; + , PROPERTIES ; + , PROTECTED ; + , METHODS ; + , OLE ; + , OLE2 ; + , RESERVED1 ; + , RESERVED2 ; + , RESERVED3 ; + , RESERVED4 ; + , RESERVED5 ; + , RESERVED6 ; + , RESERVED7 ; + , RESERVED8 ; + , USER) ; + VALUES ; + ( 'COMMENT' ; + , 'RESERVED' ; + , 0 ; + , '' ; + , '' ; + , '' ; + , loClase._ObjName ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , IIF(loClase._OlePublic, 'OLEPublic', '') ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ) - - *-- Inserto el COMMENT - INSERT INTO TABLABIN ; - ( PLATFORM ; - , UNIQUEID ; - , TIMESTAMP ; - , CLASS ; - , CLASSLOC ; - , BASECLASS ; - , OBJNAME ; - , PARENT ; - , PROPERTIES ; - , PROTECTED ; - , METHODS ; - , OLE ; - , OLE2 ; - , RESERVED1 ; - , RESERVED2 ; - , RESERVED3 ; - , RESERVED4 ; - , RESERVED5 ; - , RESERVED6 ; - , RESERVED7 ; - , RESERVED8 ; - , USER) ; - VALUES ; - ( 'COMMENT' ; - , 'RESERVED' ; - , 0 ; - , '' ; - , '' ; - , '' ; - , loClase._ObjName ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , IIF(loClase._OlePublic, 'OLEPublic', '') ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ) - - ENDFOR && I = 1 TO toModulo._Clases_Count - ENDFOR && X = 1 TO 2 + ENDFOR && I = 1 TO toModulo._Clases_Count + ENDFOR && X = 1 TO 2 + ENDIF USE IN (SELECT("TABLABIN")) @@ -11909,7 +12006,7 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin lnLenPropName = LEN(laProps(X)) lnPos2 = AT( '"', SUBSTR( tcLine, lnPos + lnLenPropName + 2 ) ) lcValue = SUBSTR( tcLine, lnPos + lnLenPropName + 2, lnPos2 - 1 ) - + IF laProps(X) == ' NAME' AND NOT EMPTY(lcValue) lcValue = THIS.denormalizeXMLValue(lcValue) ENDIF @@ -12084,10 +12181,10 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin WITH toFoxBin2Prg ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) ENDWITH - + CASE lnFileCount = 1 AND loDBF_CFG.DBF_Conversion_Support > 0 && Implica 2 u 8 llImportData = (loDBF_CFG.DBF_Conversion_Support = 8) - + CASE toFoxBin2Prg.DBF_Conversion_Support = 8 && TXT2BIN (DATA IMPORT) llImportData = .T. @@ -27380,6 +27477,7 @@ DEFINE CLASS CL_CFG AS CUSTOM + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -27416,6 +27514,7 @@ DEFINE CLASS CL_CFG AS CUSTOM n_OptimizeByFilestamp = NULL n_ExcludeDBFAutoincNextval = NULL l_RedirectClassPerFileToMain = NULL + n_RedirectClassType = NULL l_RemoveNullCharsFromCode = NULL l_RemoveZOrderSetFromProps = NULL n_UseClassPerFile = NULL @@ -27460,6 +27559,7 @@ DEFINE CLASS CL_CFG AS CUSTOM .n_OptimizeByFilestamp = toParentCFG.n_OptimizeByFilestamp .n_ExcludeDBFAutoincNextval = toParentCFG.n_ExcludeDBFAutoincNextval .l_RedirectClassPerFileToMain = toParentCFG.l_RedirectClassPerFileToMain + .n_RedirectClassType = toParentCFG.n_RedirectClassType .l_RemoveNullCharsFromCode = toParentCFG.l_RemoveNullCharsFromCode .l_RemoveZOrderSetFromProps = toParentCFG.l_RemoveZOrderSetFromProps .n_UseClassPerFile = toParentCFG.n_UseClassPerFile From 29b5f30ce47081701dedb14f2ac7b66f138acc1f Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Sun, 26 Mar 2017 00:07:03 +0100 Subject: [PATCH 08/19] Arreglo para que funcione el reconocimiento del cfg particular --- foxbin2prg.prg | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/foxbin2prg.prg b/foxbin2prg.prg index fa833eb..88ab02d 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -1855,14 +1855,14 @@ DEFINE CLASS c_foxbin2prg AS Session IF .l_Main_CFG_Loaded AND NOT EMPTY(tc_InputFile) AND NOT tcInputFile_Type == C_FILETYPE_QUERYSUPPORT THEN IF tcInputFile_Type == C_FILETYPE_DIRECTORY THEN IF NOT EMPTY(lcConfigFile) AND NOT EMPTY(JUSTPATH(lcConfigFile)) ; - AND ADDBS(JUSTPATH(lcConfigFile)) == ADDBS(tc_InputFile) + AND UPPER(ADDBS(JUSTPATH(lcConfigFile))) == UPPER(ADDBS(tc_InputFile)) * Preservar el config indicado manualmente ELSE lcConfigFile = FULLPATH( 'foxbin2prg.cfg', ADDBS(tc_InputFile) ) ENDIF ELSE IF NOT EMPTY(lcConfigFile) AND NOT EMPTY(JUSTPATH(lcConfigFile)) ; - AND ADDBS(JUSTPATH(lcConfigFile)) == ADDBS(JUSTPATH(tc_InputFile)) + AND UPPER(ADDBS(JUSTPATH(lcConfigFile))) == UPPER(ADDBS(JUSTPATH(tc_InputFile))) * Preservar el config indicado manualmente ELSE lcConfigFile = FULLPATH( 'foxbin2prg.cfg', tc_InputFile ) @@ -2549,8 +2549,8 @@ DEFINE CLASS c_foxbin2prg AS Session , lcExt == .c_LB2, .LBX_Conversion_Support = 2 ; , lcExt == .c_MN2, .MNX_Conversion_Support = 2 ; , lcExt == .c_DB2, NOT ISNULL(loDBF_CFG) AND INLIST(loDBF_CFG.DBF_Conversion_Support, 2, 8) ; - OR (INLIST(.DBF_Conversion_Support, 2, 8) ; - AND (ISNULL(loDBF_CFG) OR NOT INLIST(loDBF_CFG.DBF_Conversion_Support, 1, 4))) ; + OR (INLIST(.DBF_Conversion_Support, 2, 8) ; + AND (ISNULL(loDBF_CFG) OR NOT INLIST(loDBF_CFG.DBF_Conversion_Support, 1, 4))) ; , lcExt == .c_DC2, .DBC_Conversion_Support = 2 ; , .F. ) ENDWITH && THIS @@ -11919,7 +11919,7 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin lnLenPropName = LEN(laProps(X)) lnPos2 = AT( '"', SUBSTR( tcLine, lnPos + lnLenPropName + 2 ) ) lcValue = SUBSTR( tcLine, lnPos + lnLenPropName + 2, lnPos2 - 1 ) - + IF laProps(X) == ' NAME' AND NOT EMPTY(lcValue) lcValue = THIS.denormalizeXMLValue(lcValue) ENDIF @@ -12094,10 +12094,10 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin WITH toFoxBin2Prg ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) ENDWITH - + CASE lnFileCount = 1 AND loDBF_CFG.DBF_Conversion_Support > 0 && Implica 2 u 8 llImportData = (loDBF_CFG.DBF_Conversion_Support = 8) - + CASE toFoxBin2Prg.DBF_Conversion_Support = 8 && TXT2BIN (DATA IMPORT) llImportData = .T. From 9ab39f0391d22c9b59a150b02b4b1a18bd900c0d Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Sun, 26 Mar 2017 20:59:32 +0200 Subject: [PATCH 09/19] =?UTF-8?q?Arreglo=20del=20reconocimiento=20de=20un?= =?UTF-8?q?=20CFG=20por=20par=C3=A1metro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- foxbin2prg.prg | 45 ++++++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/foxbin2prg.prg b/foxbin2prg.prg index 88ab02d..2a724cf 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -193,6 +193,7 @@ * 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 scx/vcx: No funciona la generación de una clase individual con "classlib.vcx::classname" (Lutz Scheffler) +* 26/03/2017 FDBOZZO v1.19.49 Mejora cfg: Se permite indicar un archivo CFG por parámetro de cualquier directorio para anular los CFG predeterminados de los subdirectorios, para casos especiales donde sea necesario * * *--------------------------------------------------------------------------------------------------- @@ -777,6 +778,7 @@ DEFINE CLASS c_foxbin2prg AS Session lFileMode = .F. n_ExisteCapitalizacion = -1 l_CFG_CachedAccess = .F. + n_CFG_EvaluateFromParam = 0 n_Debug = 0 l_Error = .F. && Indicador de errores del proceso actual l_Errors = .F. && Indicador de error de la sesión actual, acumulativo de todos los procesos @@ -1853,19 +1855,19 @@ DEFINE CLASS c_foxbin2prg AS Session ENDIF IF .l_Main_CFG_Loaded AND NOT EMPTY(tc_InputFile) AND NOT tcInputFile_Type == C_FILETYPE_QUERYSUPPORT THEN - IF tcInputFile_Type == C_FILETYPE_DIRECTORY THEN - IF NOT EMPTY(lcConfigFile) AND NOT EMPTY(JUSTPATH(lcConfigFile)) ; - AND UPPER(ADDBS(JUSTPATH(lcConfigFile))) == UPPER(ADDBS(tc_InputFile)) - * Preservar el config indicado manualmente - ELSE - lcConfigFile = FULLPATH( 'foxbin2prg.cfg', ADDBS(tc_InputFile) ) - ENDIF + IF .n_CFG_EvaluateFromParam = 1 + * Si se indicó por parámetro (modo objeto), usarlo como Maestro + * Se saltea solo esta evaluación, y luego se usa la variable para determinar el Nº de CFG a usar. + .n_CFG_EvaluateFromParam = -1 && Luego se cambia por el Nº de CFG que corresponda. ELSE - IF NOT EMPTY(lcConfigFile) AND NOT EMPTY(JUSTPATH(lcConfigFile)) ; - AND UPPER(ADDBS(JUSTPATH(lcConfigFile))) == UPPER(ADDBS(JUSTPATH(tc_InputFile))) - * Preservar el config indicado manualmente + IF tcInputFile_Type == C_FILETYPE_DIRECTORY THEN + * INDICÓ DIRECTORIO + *lcConfigFile = FULLPATH( 'foxbin2prg.cfg', ADDBS(tc_InputFile) ) + lcConfigFile = FULLPATH( JUSTFNAME(lcConfigFile), ADDBS(tc_InputFile) ) ELSE - lcConfigFile = FULLPATH( 'foxbin2prg.cfg', tc_InputFile ) + * INDICÓ ARCHIVO + *lcConfigFile = FULLPATH( 'foxbin2prg.cfg', tc_InputFile ) + lcConfigFile = FULLPATH( JUSTFNAME(lcConfigFile), tc_InputFile ) ENDIF ENDIF ENDIF @@ -1880,7 +1882,13 @@ DEFINE CLASS c_foxbin2prg AS Session IF .l_Main_CFG_Loaded IF lo_Configuration.Count > 0 THEN - .n_CFG_Actual = lo_Configuration.GetKey( lc_CFG_Path ) && 0 = No hay CFG cacheada, >0 = Hay CFG cacheada + IF .n_CFG_EvaluateFromParam > 1 + * Especial: Si hay una configuración de bloqueo (CFG Manual), se usa + .n_CFG_Actual = .n_CFG_EvaluateFromParam + ELSE + * Normalmente se buscará el CFG del directorio analizado + .n_CFG_Actual = lo_Configuration.GetKey( lc_CFG_Path ) && 0 = No hay CFG cacheada, >0 = Hay CFG cacheada + ENDIF IF .n_CFG_Actual > 0 THEN lo_CFG = lo_Configuration.Item(.n_CFG_Actual) @@ -2225,7 +2233,13 @@ DEFINE CLASS c_foxbin2prg AS Session .l_Main_CFG_Loaded = .T. - IF NOT llMasterEval + IF llMasterEval + * Si se inidicó un archivo CFG por parámetro (modo objeto), aqui se bloquea + * al Nº de configuración correspondiente. + IF .n_CFG_EvaluateFromParam = -1 + .n_CFG_EvaluateFromParam = .n_CFG_Actual + ENDIF + ELSE *-- Si no es llMasterEval, es porque esta llamada es cíclica desde este mismo método, *-- y no hay parámetros para evaluar, ya que se mandan todos vacíos desde el inicial. EXIT @@ -2723,6 +2737,7 @@ DEFINE CLASS c_foxbin2prg AS Session ENDIF .c_Foxbin2prg_ConfigFile = EVL( tcCFG_File, .c_Foxbin2prg_ConfigFile ) + .n_CFG_EvaluateFromParam = (IIF(EMPTY(tcCFG_File), 0, 1)) *-- Ajusto la ruta si no es absoluta tc_InputFile = .get_AbsolutePath( tc_InputFile, .c_CurDir ) @@ -27809,7 +27824,7 @@ DEFINE CLASS CL_LANG AS Custom .C_OPTION_LOC = "Opción" .C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC = "La clase externa no coincide con las clases internas" .C_OUTER_MEMBER_DOES_NOT_MATCH_INNER_MEMBERS_LOC = "El miembro externo no coincide con los miembros internos" - .C_OUTPUT_FILE_IS_NOT_OVERWRITEN_LOC = "Optimización: el archivo de salida [<>] no se sobreescribe por ser igual al generado." + .C_OUTPUT_FILE_IS_NOT_OVERWRITEN_LOC = "Optimización: el archivo de salida [<>] no se sobreescribe por ser igual al ya existente." .C_OUTPUTFILE_TIMESTAMP_EQUAL_THAN_INPUTFILE_TIMESTAMP_LOC = "Optimización: el archivo de salida [<>] no se regenera por tener el mismo timestamp que el de entrada." .C_OUTPUTFILE_TIMESTAMP_NEWER_THAN_INPUTFILE_TIMESTAMP_LOC = "Optimización: el archivo de salida [<>] no se regenera por tener un timestamp más nuevo que el de entrada." .C_PRESS_ESC_TO_CANCEL = "Pulse Esc para Cancelar" @@ -28021,7 +28036,7 @@ DEFINE CLASS CL_LANG AS Custom .C_OPTION_LOC = "Option" .C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC = "The outer class does not match the inner classes" .C_OUTER_MEMBER_DOES_NOT_MATCH_INNER_MEMBERS_LOC = "The outer member does not match the inner members" - .C_OUTPUT_FILE_IS_NOT_OVERWRITEN_LOC = "Optimization: output file [<>] was not overwritten because it is the same as was generated." + .C_OUTPUT_FILE_IS_NOT_OVERWRITEN_LOC = "Optimization: output file [<>] was not overwritten because it is the same as the existing one." .C_OUTPUTFILE_TIMESTAMP_EQUAL_THAN_INPUTFILE_TIMESTAMP_LOC = "Optimization: output file [<>] was not regenerated because it's filestamp is equal than the inputfile." .C_OUTPUTFILE_TIMESTAMP_NEWER_THAN_INPUTFILE_TIMESTAMP_LOC = "Optimization: output file [<>] was not regenerated because it's filestamp is newer than the inputfile." .C_PRESS_ESC_TO_CANCEL = "Press Esc to Cancel" From 4adcc2f77168d5268190ac53bb838904e8dd2e4b Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Mon, 27 Mar 2017 23:34:55 +0200 Subject: [PATCH 10/19] Arreglado lo del Outputfile y el Locate --- foxbin2prg.prg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/foxbin2prg.prg b/foxbin2prg.prg index e1cdb9d..f8fd11b 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -10098,7 +10098,7 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin IF toFoxBin2Prg.n_RedirectClassType = 1 && Redireccionar solo esta clase a main llReplaceClass = .T. - toFoxBin2Prg.c_OutputFile = FORCEEXT( lcBaseFilename, 'VCX' ) + toFoxBin2Prg.c_OutputFile = FULLPATH( FORCEEXT( lcBaseFilename, 'VCX' ), .c_InputFile) toFoxBin2Prg.doBackup( .F., .T., '', '', '' ) IF ADIR( laFiles, toFoxBin2Prg.c_OutputFile, "", 1 ) = 1 @@ -10227,7 +10227,7 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin IF tlReplaceClass I = 1 loClase = toModulo._Clases(I) - LOCATE FOR PLATFORM == PADR('WINDOWS', FSIZE('PLATFORM')) AND OBJNAME == PADR(loClase._ObjName, FSIZE('OBJNAME')) + LOCATE FOR PLATFORM == PADR('WINDOWS', FSIZE('PLATFORM')) AND OBJNAME == loClase._ObjName llReplace = FOUND() ENDIF From b68c870518e984ba405a81dc5a60dd475b5eeb63 Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Tue, 28 Mar 2017 00:44:01 +0200 Subject: [PATCH 11/19] =?UTF-8?q?Implementaci=C3=B3n=20de=20"classlibrary.?= =?UTF-8?q?vcx::classname::import"=20y=20"classlibrary.vcx::classname::exp?= =?UTF-8?q?ort"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- foxbin2prg.prg | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/foxbin2prg.prg b/foxbin2prg.prg index f8fd11b..de332da 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -195,6 +195,7 @@ * 23/03/2017 FDBOZZO v1.19.49 Bug Fix vcx: No funciona la generación de una clase individual con "classlib.vcx::classname" (Lutz Scheffler) * 25/03/2017 FDBOZZO v1.19.49 Mejora vcx: Poder importar una clase (VC2 generado con ClassPerFile) en un VCX existente (Lutz Scheffler) * 26/03/2017 FDBOZZO v1.19.49 Mejora cfg: Se permite indicar un archivo CFG por parámetro de cualquier directorio para anular los CFG predeterminados de los subdirectorios, para casos especiales donde sea necesario +* 28/03/2017 FDBOZZO v1.19.49 Mejora vcx: Implementada sintaxis para importar o exportar clases individuales usando "classlibrary.vcx::classname::import" y "classlibrary.vcx::classname::export" * * *--------------------------------------------------------------------------------------------------- @@ -768,6 +769,7 @@ DEFINE CLASS c_foxbin2prg AS Session c_CurDir = '' c_InputFile = '' c_ClassToConvert = '' && Guarda el nombre de la clase a convertir, indicada en tcInputFile como "archivo.vcx::clase" + c_ClassOperationType = '' && (I)mport o (E)xport. Se usa solo para manejar clases individuales. c_OriginalFileName = '' c_LogFile = ADDBS( SYS(2023) ) + 'FoxBin2Prg_Debug.LOG' c_ErrorLogFile = ADDBS( SYS(2023) ) + 'FoxBin2Prg_Error.LOG' @@ -2751,9 +2753,11 @@ DEFINE CLASS c_foxbin2prg AS Session *-- Reconocimiento de la clase indicada *-- Ej: [c:\desa\test\library.vcx::classname] IF '::' $ tc_InputFile THEN - tc_InputFile = STRTRAN(tc_InputFile, '::', '|') - .c_ClassToConvert = LOWER( ALLTRIM( GETWORDNUM( tc_InputFile, 2, '|' ) ) ) - tc_InputFile = LOWER( ALLTRIM( GETWORDNUM( tc_InputFile, 1, '|' ) ) ) + tc_InputFile = STRTRAN(tc_InputFile, '::', '|') + .c_ClassOperationType = EVL( UPPER( LEFT( ALLTRIM( GETWORDNUM( tc_InputFile, 3, '|' ) ), 1) ), 'E') + .c_ClassToConvert = LOWER( ALLTRIM( GETWORDNUM( tc_InputFile, 2, '|' ) ) ) + * CUIDADO!, evaluar esta última, que si no las anteriores no evalúan. + tc_InputFile = LOWER( ALLTRIM( GETWORDNUM( tc_InputFile, 1, '|' ) ) ) ENDIF .c_Foxbin2prg_ConfigFile = EVL( tcCFG_File, .c_Foxbin2prg_ConfigFile ) @@ -2813,6 +2817,23 @@ DEFINE CLASS c_foxbin2prg AS Session .evaluateConfiguration( @tcDontShowProgress, @tcDontShowErrors, @tcNoTimestamps, @tcDebug, @tcRecompile, @tcBackupLevels ; , @tcClearUniqueID, @tcOptimizeByFilestamp, @tc_InputFile, @lcInputFile_Type ) + * Redefinir nombre archivo de entrada según el tipo de conversión (IMPORT/EXPORT) + IF .c_ClassOperationType = 'I' + * En el caso de importar, debo cambiar la sintaxis de tc_InputFile para poder usar + * la conversión existente de clase vc2 + IF .n_UseClassPerFile = 2 + tc_InputFile = FORCEEXT(tc_InputFile, '') + '.*.' + .c_ClassToConvert + '.' + .c_VC2 + + IF ADIR(laFiles, tc_InputFile) = 1 + tc_InputFile = FULLPATH( laFiles(1,1), tc_InputFile ) + ENDIF + + ELSE && Asumo .n_UseClassPerFile = 1 + tc_InputFile = FORCEEXT(tc_InputFile, '') + '.' + .c_ClassToConvert + '.' + .c_VC2 + + ENDIF + ENDIF + loLang = _SCREEN.o_FoxBin2Prg_Lang DO CASE From 042cba9297fbdf1349b3ab95abd7ead853f92c0c Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Tue, 28 Mar 2017 00:58:36 +0200 Subject: [PATCH 12/19] =?UTF-8?q?Agregar=20anulaci=C3=B3n=20de=20ClassPerF?= =?UTF-8?q?ileCheck:1=20cuando=20se=20usa=20la=20sintaxis=20"classlibrary.?= =?UTF-8?q?vcx::classname::import"=20o=20"classlibrary.vcx::classname::exp?= =?UTF-8?q?ort"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- foxbin2prg.prg | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/foxbin2prg.prg b/foxbin2prg.prg index de332da..a3317dd 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -2758,6 +2758,8 @@ DEFINE CLASS c_foxbin2prg AS Session .c_ClassToConvert = LOWER( ALLTRIM( GETWORDNUM( tc_InputFile, 2, '|' ) ) ) * CUIDADO!, evaluar esta última, que si no las anteriores no evalúan. tc_InputFile = LOWER( ALLTRIM( GETWORDNUM( tc_InputFile, 1, '|' ) ) ) + ELSE + .c_ClassOperationType = '' ENDIF .c_Foxbin2prg_ConfigFile = EVL( tcCFG_File, .c_Foxbin2prg_ConfigFile ) @@ -9912,7 +9914,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base *-- Verificación de las Clases, si son Externas y se indicó chequearlas DO CASE - CASE toFoxBin2Prg.n_UseClassPerFile = 1 AND toFoxBin2Prg.l_ClassPerFileCheck + CASE toFoxBin2Prg.n_UseClassPerFile = 1 AND toFoxBin2Prg.l_ClassPerFileCheck AND EMPTY(toFoxBin2Prg.c_ClassOperationType) *-- El ClassPerFile original, con nomenclatura 'Libreria.NombreClase.vc2' FOR I = 1 TO toModulo._ExternalClasses_Count lnItem = 0 @@ -9933,7 +9935,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base toModulo._Clases(lnItem)._Checked = .T. ENDFOR - CASE toFoxBin2Prg.n_UseClassPerFile = 2 AND toFoxBin2Prg.l_ClassPerFileCheck + CASE toFoxBin2Prg.n_UseClassPerFile = 2 AND toFoxBin2Prg.l_ClassPerFileCheck AND EMPTY(toFoxBin2Prg.c_ClassOperationType) *-- El nuevo ClassPerFile, con nomenclatura 'Libreria.ClaseBase.NombreClase.vc2' FOR I = 1 TO toModulo._ExternalClasses_Count lnItem = 0 @@ -10043,7 +10045,8 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin lcClassName = LOWER( GETWORDNUM( JUSTFNAME( lcInputFile_Class ), 2, '.' ) ) *-- Verificación de las Clases, si son Externas y se indicó chequearlas - IF toFoxBin2Prg.l_ClassPerFileCheck AND ASCAN( toModulo._ExternalClasses , lcClassName, 1, 0, 1, 1+2+4 ) = 0 + IF toFoxBin2Prg.l_ClassPerFileCheck AND EMPTY(toFoxBin2Prg.c_ClassOperationType) ; + AND ASCAN( toModulo._ExternalClasses , lcClassName, 1, 0, 1, 1+2+4 ) = 0 .writeLog( C_TAB + '- ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) .writeErrorLog( C_TAB + '- ' + loLang.C_WARNING_LOC + ' ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) LOOP && Salteo esta clase porque se indicó chequear y no concuerda con las anotadas @@ -10053,7 +10056,8 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin lcClassName = LOWER( GETWORDNUM( JUSTFNAME( lcInputFile_Class ), 2, '.' ) + '.' + GETWORDNUM( JUSTFNAME( lcInputFile_Class ), 3, '.' ) ) *-- Verificación de las Clases, si son Externas y se indicó chequearlas - IF toFoxBin2Prg.l_ClassPerFileCheck AND ASCAN( toModulo._ExternalClasses , lcClassName, 1, 0, 2, 1+2+4 ) = 0 + IF toFoxBin2Prg.l_ClassPerFileCheck AND EMPTY(toFoxBin2Prg.c_ClassOperationType) ; + AND ASCAN( toModulo._ExternalClasses , lcClassName, 1, 0, 2, 1+2+4 ) = 0 .writeLog( C_TAB + '- ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) .writeErrorLog( C_TAB + '- ' + loLang.C_WARNING_LOC + ' ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) LOOP && Salteo esta clase porque se indicó chequear y no concuerda con las anotadas @@ -10522,7 +10526,8 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin lcClassName = LOWER( GETWORDNUM( JUSTFNAME( lcInputFile_Class ), 2, '.' ) ) *-- Verificación de las Clases, si son Externas y se indicó chequearlas - IF toFoxBin2Prg.l_ClassPerFileCheck AND ASCAN( toModulo._ExternalClasses , lcClassName, 1, 0, 1, 1+2+4 ) = 0 + IF toFoxBin2Prg.l_ClassPerFileCheck AND EMPTY(toFoxBin2Prg.c_ClassOperationType) ; + AND ASCAN( toModulo._ExternalClasses , lcClassName, 1, 0, 1, 1+2+4 ) = 0 .writeLog( C_TAB + '- ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) .writeErrorLog( C_TAB + '- ' + loLang.C_WARNING_LOC + ' ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) LOOP && Salteo esta clase @@ -10532,7 +10537,8 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin lcClassName = LOWER( GETWORDNUM( JUSTFNAME( lcInputFile_Class ), 2, '.' ) + '.' + GETWORDNUM( JUSTFNAME( lcInputFile_Class ), 3, '.' ) ) *-- Verificación de las Clases, si son Externas y se indicó chequearlas - IF toFoxBin2Prg.l_ClassPerFileCheck AND ASCAN( toModulo._ExternalClasses , lcClassName, 1, 0, 2, 1+2+4 ) = 0 + IF toFoxBin2Prg.l_ClassPerFileCheck AND EMPTY(toFoxBin2Prg.c_ClassOperationType) ; + AND ASCAN( toModulo._ExternalClasses , lcClassName, 1, 0, 2, 1+2+4 ) = 0 .writeLog( C_TAB + '- ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) .writeErrorLog( C_TAB + '- ' + loLang.C_WARNING_LOC + ' ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) LOOP && Salteo esta clase @@ -12736,7 +12742,8 @@ DEFINE CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin ENDIF *-- Verificación de los Miembros, si son Externos y se indicó chequearlos - IF toFoxBin2Prg.l_ClassPerFileCheck AND ASCAN( toDatabase._ExternalClasses, lcMemberType + '.' + lcMemberName, 1, 0, 1, 1+2+4 ) = 0 + IF toFoxBin2Prg.l_ClassPerFileCheck AND EMPTY(toFoxBin2Prg.c_ClassOperationType) ; + AND ASCAN( toDatabase._ExternalClasses, lcMemberType + '.' + lcMemberName, 1, 0, 1, 1+2+4 ) = 0 .writeLog( C_TAB + '- ' + loLang.C_OUTER_MEMBER_DOES_NOT_MATCH_INNER_MEMBERS_LOC + ' [' + lcInputFile_Class + ']' ) .writeErrorLog( C_TAB + '- ' + loLang.C_WARNING_LOC + ' ' + loLang.C_OUTER_MEMBER_DOES_NOT_MATCH_INNER_MEMBERS_LOC + ' [' + lcInputFile_Class + ']' ) LOOP && Salteo este miembro porque no concuerda con los anotados @@ -13089,7 +13096,7 @@ DEFINE CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin loLang = _SCREEN.o_FoxBin2Prg_Lang *-- Verificación de los Miembros, si son Externos y se indicó chequearlos - IF toFoxBin2Prg.n_UseClassPerFile > 0 AND toFoxBin2Prg.l_ClassPerFileCheck + IF toFoxBin2Prg.n_UseClassPerFile > 0 AND toFoxBin2Prg.l_ClassPerFileCheck AND EMPTY(toFoxBin2Prg.c_ClassOperationType) FOR I = 1 TO toDatabase._ExternalClasses_Count lnItem = 0 From 35d997733d6ad2a25a673698a40317297d31c376 Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Tue, 11 Apr 2017 20:19:21 +0200 Subject: [PATCH 13/19] Bug Fix frx: When using "&&" inside en expression field, the regenerated FRX field is corrupted --- foxbin2prg.prg | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/foxbin2prg.prg b/foxbin2prg.prg index a3317dd..ee34fe1 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -196,6 +196,7 @@ * 25/03/2017 FDBOZZO v1.19.49 Mejora vcx: Poder importar una clase (VC2 generado con ClassPerFile) en un VCX existente (Lutz Scheffler) * 26/03/2017 FDBOZZO v1.19.49 Mejora cfg: Se permite indicar un archivo CFG por parámetro de cualquier directorio para anular los CFG predeterminados de los subdirectorios, para casos especiales donde sea necesario * 28/03/2017 FDBOZZO v1.19.49 Mejora vcx: Implementada sintaxis para importar o exportar clases individuales usando "classlibrary.vcx::classname::import" y "classlibrary.vcx::classname::export" +* 11/04/2017 FDBOZZO v1.19.49 Bug Fix frx: Cuando dentro de una expresión se usa "&&", se corrompe el registro del FRX generado (Alejandro A Sosa) * * *--------------------------------------------------------------------------------------------------- @@ -306,6 +307,7 @@ * 11/07/2016 Nathan Brown Reporte bug frx v1.19.48-Preview5: Los ControlSource de objetos OLE que contienen comillas se generan mal (Arreglado en v1.19.48 Preview-6) * 23/03/2017 Lutz Scheffler Reporte bug vcx v1.19.48: No funciona la generación de una clase individual con "classlib.vcx::classname" (Arreglado en v1.19.49) * 23/03/2017 Lutz Scheffler Mejora vcx v1.19.48: Poder importar una clase (VC2 generado con ClassPerFile) en un VCX existente (Agragado en v1.19.49) +* 30/03/2017 Alejandro A Sosa Reporte bug frx v1.19.48: Cuando dentro de una expresión se usa "&&", se corrompe el registro del FRX generado (Arreglado en v1.19.49) * * *--------------------------------------------------------------------------------------------------- @@ -12117,9 +12119,6 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin I = I + 1 EXIT - CASE .lineIsOnlyCommentAndNoMetadata( @tcLine, @lcComment ) - LOOP && Saltear comentarios - CASE .analyzeCodeBlock_platform( toReport, @tcLine, @taCodeLines, @I, @tnCodeLines, @loReg ) CASE .analyzeCodeBlock_CDATA_inline( toReport, @tcLine, @taCodeLines, @I, tnCodeLines, @loReg, 'picture' ) From e70e8d7d13bda38d212c46a7c0cc108a22d25606 Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Tue, 11 Apr 2017 22:59:33 +0200 Subject: [PATCH 14/19] Feature: When in objet-mode, allow the use of a CFG-object for the tcCFG parameter (Lutz Scheffler) --- foxbin2prg.prg | 51 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 8 deletions(-) diff --git a/foxbin2prg.prg b/foxbin2prg.prg index ee34fe1..904062a 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -197,6 +197,7 @@ * 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) * * *--------------------------------------------------------------------------------------------------- @@ -308,6 +309,7 @@ * 23/03/2017 Lutz Scheffler Reporte bug vcx v1.19.48: No funciona la generación de una clase individual con "classlib.vcx::classname" (Arreglado en v1.19.49) * 23/03/2017 Lutz Scheffler Mejora vcx v1.19.48: Poder importar una clase (VC2 generado con ClassPerFile) en un VCX existente (Agragado en v1.19.49) * 30/03/2017 Alejandro A Sosa Reporte bug frx v1.19.48: Cuando dentro de una expresión se usa "&&", se corrompe el registro del FRX generado (Arreglado en v1.19.49) +* 28/03/2017 Lutz Scheffler Mejora cfg v1.19.48: En modo objeto permitir indicar un objeto CFG en lugar de un archivo CFG (Agragado en v1.19.49) * * *--------------------------------------------------------------------------------------------------- @@ -1834,6 +1836,7 @@ DEFINE CLASS c_foxbin2prg AS Session LOCAL lcConfigFile, llExiste_CFG_EnDisco, laConfig(1), I, lcConfData, lcExt, lcValue, lc_CFG_Path, lcConfigLine, laDirInfo(1,5) ; , lnDirs, laDirs(1), llMasterEval, lcProp ; , lo_CFG AS CL_CFG OF 'FOXBIN2PRG.PRG' ; + , loCFG_Manual AS CL_CFG OF 'FOXBIN2PRG.PRG' ; , lo_Configuration AS Collection ; , loLang as CL_LANG OF 'FOXBIN2PRG.PRG' ; , loEx as Exception @@ -1848,6 +1851,15 @@ DEFINE CLASS c_foxbin2prg AS Session tcInputFile_Type = EVL(tcInputFile_Type,'') lo_Configuration = .o_Configuration + IF VARTYPE(lcConfigFile) = "O" + loCFG_Manual = lcConfigFile && lcConfigFile is an object CFG generated by get_DirSettings() + toParentCFG = loCFG_Manual + lcConfigFile = FULLPATH('Personalized-CFG-Object', tc_InputFile) + loCFG_Manual.c_Foxbin2prg_ConfigFile = 'Personalized-CFG-Object' + ELSE + loCFG_Manual = NULL + ENDIF + IF VARTYPE(toParentCFG) <> 'O' THEN toParentCFG = NULL ENDIF @@ -1878,12 +1890,16 @@ DEFINE CLASS c_foxbin2prg AS Session ELSE IF tcInputFile_Type == C_FILETYPE_DIRECTORY THEN * INDICÓ DIRECTORIO - *lcConfigFile = FULLPATH( 'foxbin2prg.cfg', ADDBS(tc_InputFile) ) - lcConfigFile = FULLPATH( JUSTFNAME(lcConfigFile), ADDBS(tc_InputFile) ) + IF ISNULL(loCFG_Manual) + *lcConfigFile = FULLPATH( 'foxbin2prg.cfg', ADDBS(tc_InputFile) ) + lcConfigFile = FULLPATH( JUSTFNAME(lcConfigFile), ADDBS(tc_InputFile) ) + ENDIF ELSE * INDICÓ ARCHIVO - *lcConfigFile = FULLPATH( 'foxbin2prg.cfg', tc_InputFile ) - lcConfigFile = FULLPATH( JUSTFNAME(lcConfigFile), tc_InputFile ) + IF ISNULL(loCFG_Manual) + *lcConfigFile = FULLPATH( 'foxbin2prg.cfg', tc_InputFile ) + lcConfigFile = FULLPATH( JUSTFNAME(lcConfigFile), tc_InputFile ) + ENDIF ENDIF ENDIF ENDIF @@ -1909,6 +1925,11 @@ DEFINE CLASS c_foxbin2prg AS Session IF .n_CFG_Actual > 0 THEN lo_CFG = lo_Configuration.Item(.n_CFG_Actual) .l_CFG_CachedAccess = .T. + + IF NOT ISNULL(loCFG_Manual) + * Si le paso un objeto CFG, prevalece sobre el guardado + lo_CFG.CopyFrom(@loCFG_Manual) + ENDIF ENDIF ENDIF @@ -2687,6 +2708,7 @@ DEFINE CLASS c_foxbin2prg AS Session , lnFileCount, lcErrorInfo, lcErrorFile, lnPCount, laParams(1), lnConversionOption, lnErrorIcon, llError ; , lcOldSetEscape, lcOldOnEscape, llEscKeyRestored ; , loEx AS EXCEPTION ; + , loCFG AS CL_CFG OF 'FOXBIN2PRG.PRG' ; , loFSO AS Scripting.FileSystemObject ; , loLang AS CL_LANG OF 'FOXBIN2PRG.PRG' ; , loFrm_Interactive AS frm_interactive OF 'FOXBIN2PRG.PRG' ; @@ -2701,6 +2723,7 @@ DEFINE CLASS c_foxbin2prg AS Session loLang = _SCREEN.o_FoxBin2Prg_Lang loFSO = .o_FSO loWSH = .o_WSH + loCFG = NULL lnPCount = 0 lcInputFile_Type = '' .l_Error = .F. @@ -2764,8 +2787,20 @@ DEFINE CLASS c_foxbin2prg AS Session .c_ClassOperationType = '' ENDIF - .c_Foxbin2prg_ConfigFile = EVL( tcCFG_File, .c_Foxbin2prg_ConfigFile ) - .n_CFG_EvaluateFromParam = (IIF(EMPTY(tcCFG_File), 0, 1)) + IF VARTYPE(tcCFG_File) = "O" + * Validar el objeto + loCFG = tcCFG_File + IF NOT (loCFG.Class == PROPER('CL_CFG')) + ERROR 'CFG object: Invalid class. Please, generate it with get_DirSettings()' + ENDIF + + .c_Foxbin2prg_ConfigFile = loCFG + .n_CFG_EvaluateFromParam = 1 + + ELSE + .c_Foxbin2prg_ConfigFile = EVL( tcCFG_File, .c_Foxbin2prg_ConfigFile ) + .n_CFG_EvaluateFromParam = (IIF(EMPTY(tcCFG_File), 0, 1)) + ENDIF *-- Ajusto la ruta si no es absoluta tc_InputFile = .get_AbsolutePath( tc_InputFile, .c_CurDir ) @@ -4035,8 +4070,8 @@ DEFINE CLASS c_foxbin2prg AS Session ENDIF IF ISNULL(loCFG) THEN - lo_CFG = CREATEOBJECT('CL_CFG') - lo_CFG.CopyFrom(THIS) + loCFG = CREATEOBJECT('CL_CFG') + loCFG.CopyFrom(THIS) ENDIF RETURN loCFG From 5a42773abf82c71512890dfa9401086c41821e74 Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Wed, 12 Apr 2017 00:40:55 +0200 Subject: [PATCH 15/19] Bug Fix & Report pjx: No se estaba guardando el campo User en los archivos PJX (Doug Hennig) --- foxbin2prg.prg | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/foxbin2prg.prg b/foxbin2prg.prg index 904062a..22b4ba3 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -198,6 +198,7 @@ * 28/03/2017 FDBOZZO v1.19.49 Mejora vcx: Implementada sintaxis para importar o exportar clases individuales usando "classlibrary.vcx::classname::import" y "classlibrary.vcx::classname::export" * 11/04/2017 FDBOZZO v1.19.49 Bug Fix frx: Cuando dentro de una expresión se usa "&&", se corrompe el registro del FRX generado (Alejandro A Sosa) * 11/04/2017 FDBOZZO v1.19.49 Mejora cfg : En modo objeto permitir indicar un objeto CFG en lugar de un archivo CFG (Lutz Scheffler) +* 12/04/2017 DH&FDBOZZO v1.19.49 Bug Fix & Report pjx: No se estaba guardando el campo User en los archivos PJX (Doug Hennig) * * *--------------------------------------------------------------------------------------------------- @@ -310,6 +311,7 @@ * 23/03/2017 Lutz Scheffler Mejora vcx v1.19.48: Poder importar una clase (VC2 generado con ClassPerFile) en un VCX existente (Agragado en v1.19.49) * 30/03/2017 Alejandro A Sosa Reporte bug frx v1.19.48: Cuando dentro de una expresión se usa "&&", se corrompe el registro del FRX generado (Arreglado en v1.19.49) * 28/03/2017 Lutz Scheffler Mejora cfg v1.19.48: En modo objeto permitir indicar un objeto CFG en lugar de un archivo CFG (Agragado en v1.19.49) +* 06/04/2017 Doug Hennig Reporte Bug y arreglo parcial PJX v1.19.48: No se estaba guardando el campo User en los archivos PJX (Agregado en v1.19.49) * * *--------------------------------------------------------------------------------------------------- @@ -1925,7 +1927,7 @@ DEFINE CLASS c_foxbin2prg AS Session IF .n_CFG_Actual > 0 THEN lo_CFG = lo_Configuration.Item(.n_CFG_Actual) .l_CFG_CachedAccess = .T. - + IF NOT ISNULL(loCFG_Manual) * Si le paso un objeto CFG, prevalece sobre el guardado lo_CFG.CopyFrom(@loCFG_Manual) @@ -2793,10 +2795,10 @@ DEFINE CLASS c_foxbin2prg AS Session IF NOT (loCFG.Class == PROPER('CL_CFG')) ERROR 'CFG object: Invalid class. Please, generate it with get_DirSettings()' ENDIF - + .c_Foxbin2prg_ConfigFile = loCFG .n_CFG_EvaluateFromParam = 1 - + ELSE .c_Foxbin2prg_ConfigFile = EVL( tcCFG_File, .c_Foxbin2prg_ConfigFile ) .n_CFG_EvaluateFromParam = (IIF(EMPTY(tcCFG_File), 0, 1)) @@ -6428,10 +6430,10 @@ DEFINE CLASS c_conversor_base AS Custom PROCEDURE fileTypeCode - LPARAMETERS tcExtension + LPARAMETERS tcExtension, tcOriginalType tcExtension = UPPER(tcExtension) RETURN ICASE( tcExtension = 'DBC', 'd' ; - , tcExtension = 'DBF', 'D' ; + , tcExtension = 'DBF', EVL(tcOriginalType, 'D') ; , tcExtension = 'QPR', 'Q' ; , tcExtension = 'SCX', 'K' ; , tcExtension = 'FRX', 'R' ; @@ -7869,6 +7871,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , RESERVED2 ; , SCCDATA ; , LOCAL ; + , USER ; , KEY ) ; VALUES ; ( UPPER(EVL(THIS.c_OriginalFileName,THIS.c_OutputFile)) ; @@ -7888,6 +7891,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , toProject._ServerHead.getRowServerInfo() ; , toProject._SccData ; , .T. ; + , STRCONV(toProject._User,14) ; , UPPER( JUSTSTEM( THIS.c_OutputFile) ) ) ENDPROC @@ -8600,7 +8604,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , '' ; , '' ; , '' ; - , toObjeto._User ) + , STRCONV(toObjeto._User,14) ) ENDIF ENDWITH && THIS @@ -11097,10 +11101,11 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin , ID ; , TIMESTAMP ; , OBJREV ; + , USER ; , KEY ) ; VALUES ; ( loFile._Name + CHR(0) ; - , .fileTypeCode(JUSTEXT(loFile._Name)) ; + , .fileTypeCode(JUSTEXT(loFile._Name), loFile._Type) ; , loFile._Exclude ; , (loFile._Name == lcMainProg) ; , loFile._Comments ; @@ -11109,6 +11114,7 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin , loFile._ID ; , loFile._TimeStamp ; , loFile._ObjRev ; + , STRCONV(loFile._User,14) ; , UPPER(JUSTSTEM(loFile._Name)) ) ENDFOR @@ -11281,6 +11287,7 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin loFile._TimeStamp = .get_ValueByName_FromListNamesWithValues( 'Timestamp', 'I', @laPropsAndValues ) loFile._ID = .get_ValueByName_FromListNamesWithValues( 'ID', 'I', @laPropsAndValues ) loFile._ObjRev = .get_ValueByName_FromListNamesWithValues( 'ObjRev', 'I', @laPropsAndValues ) + loFile._User = .get_ValueByName_FromListNamesWithValues( 'User', 'C', @laPropsAndValues ) toProject.ADD( loFile, loFile._Name ) @@ -16059,8 +16066,10 @@ DEFINE CLASS c_conversor_pjx_a_prg AS c_conversor_bin_a_prg Timestamp="<>" ID="<>" ObjRev="<>" + User="<>" <> ENDTEXT + loReg = NULL ENDFOR @@ -16149,6 +16158,7 @@ DEFINE CLASS c_conversor_pjx_a_prg AS c_conversor_bin_a_prg <<>> *<.CmntStyle = <> /> <<>> *<.NoLogo = <> /> <<>> *<.SaveCode = <> /> + <<>> *<.User = '<>' /> <<>> .ProjectHookLibrary = '<>' <<>> .ProjectHookClass = '<>' <<>> <> @@ -16156,7 +16166,6 @@ DEFINE CLASS c_conversor_pjx_a_prg AS c_conversor_bin_a_prg <<>> ENDTEXT - *-- Build y cierre TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<>> @@ -16279,6 +16288,7 @@ DEFINE CLASS c_conversor_pjx_a_prg AS c_conversor_bin_a_prg loProject._ServerInfo = loReg.RESERVED2 loProject._Debug = loReg.DEBUG loProject._Encrypted = loReg.ENCRYPT + loProject._User = loReg.USER loProject.parseDeviceInfo( loReg.DEVINFO ) *-- Información de los Servidores definidos @@ -16316,7 +16326,7 @@ DEFINE CLASS c_conversor_pjx_a_prg AS c_conversor_bin_a_prg *-- Escaneo el proyecto SCAN ALL FOR NOT INLIST(TYPE, 'H','W','i' ) loReg = NULL - SCATTER FIELDS NAME,TYPE,EXCLUDE,COMMENTS,CPID,TIMESTAMP,ID,OBJREV MEMO NAME loReg + SCATTER FIELDS NAME,TYPE,EXCLUDE,COMMENTS,CPID,TIMESTAMP,ID,OBJREV,USER MEMO NAME loReg IF toFoxBin2Prg.l_NoTimestamps loReg.TIMESTAMP = 0 @@ -16689,6 +16699,7 @@ DEFINE CLASS c_conversor_pjm_a_prg AS c_conversor_bin_a_prg <<>> *<.CmntStyle = <> /> <<>> *<.NoLogo = <> /> <<>> *<.SaveCode = <> /> + <<>> *<.User = <> /> <<>> .ProjectHookLibrary = '<>' <<>> .ProjectHookClass = '<>' <<>> <> @@ -18291,6 +18302,7 @@ DEFINE CLASS CL_PROJECT AS CL_COL_BASE + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -18324,6 +18336,7 @@ DEFINE CLASS CL_PROJECT AS CL_COL_BASE _TimeStamp = 0 _Version = '' _SccData = '' + _User = '' *-- Dev.info _Author = '' @@ -24853,6 +24866,7 @@ DEFINE CLASS CL_PROJ_FILE AS CL_CUS_BASE + [] ; + [] ; + [] ; + + [] ; + [] _Name = '' @@ -24863,6 +24877,7 @@ DEFINE CLASS CL_PROJ_FILE AS CL_CUS_BASE _ID = 0 _ObjRev = 0 _TimeStamp = 0 + _User = '' ENDDEFINE From fb9bb50721e0af024214a1d4c158c0cfc918f862 Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Fri, 14 Apr 2017 01:06:24 +0200 Subject: [PATCH 16/19] Added the DevInfo conversion for file registers of the PJX --- foxbin2prg.prg | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/foxbin2prg.prg b/foxbin2prg.prg index 22b4ba3..b665383 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -8581,7 +8581,8 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , RESERVED6 ; , RESERVED7 ; , RESERVED8 ; - , USER) ; + , USER ; + , DEVINFO ) ; VALUES ; ( 'WINDOWS' ; , toObjeto._UniqueID ; @@ -8604,7 +8605,8 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , '' ; , '' ; , '' ; - , STRCONV(toObjeto._User,14) ) + , STRCONV(toObjeto._User,14) ; + , STRCONV(toObjeto._DevInfo,14) ) ENDIF ENDWITH && THIS @@ -11102,6 +11104,7 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin , TIMESTAMP ; , OBJREV ; , USER ; + , DEVINFO ; , KEY ) ; VALUES ; ( loFile._Name + CHR(0) ; @@ -11115,6 +11118,7 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin , loFile._TimeStamp ; , loFile._ObjRev ; , STRCONV(loFile._User,14) ; + , STRCONV(loFile._DevInfo,14) ; , UPPER(JUSTSTEM(loFile._Name)) ) ENDFOR @@ -11288,6 +11292,7 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin loFile._ID = .get_ValueByName_FromListNamesWithValues( 'ID', 'I', @laPropsAndValues ) loFile._ObjRev = .get_ValueByName_FromListNamesWithValues( 'ObjRev', 'I', @laPropsAndValues ) loFile._User = .get_ValueByName_FromListNamesWithValues( 'User', 'C', @laPropsAndValues ) + loFile._DevInfo = .get_ValueByName_FromListNamesWithValues( 'DevInfo', 'C', @laPropsAndValues ) toProject.ADD( loFile, loFile._Name ) @@ -16067,6 +16072,7 @@ DEFINE CLASS c_conversor_pjx_a_prg AS c_conversor_bin_a_prg ID="<>" ObjRev="<>" User="<>" + DevInfo="<>" <> ENDTEXT @@ -16326,7 +16332,7 @@ DEFINE CLASS c_conversor_pjx_a_prg AS c_conversor_bin_a_prg *-- Escaneo el proyecto SCAN ALL FOR NOT INLIST(TYPE, 'H','W','i' ) loReg = NULL - SCATTER FIELDS NAME,TYPE,EXCLUDE,COMMENTS,CPID,TIMESTAMP,ID,OBJREV,USER MEMO NAME loReg + SCATTER FIELDS NAME,TYPE,EXCLUDE,COMMENTS,CPID,TIMESTAMP,ID,OBJREV,USER,DEVINFO MEMO NAME loReg IF toFoxBin2Prg.l_NoTimestamps loReg.TIMESTAMP = 0 @@ -24867,6 +24873,7 @@ DEFINE CLASS CL_PROJ_FILE AS CL_CUS_BASE + [] ; + [] ; + [] ; + + [] ; + [] _Name = '' @@ -24878,6 +24885,7 @@ DEFINE CLASS CL_PROJ_FILE AS CL_CUS_BASE _ObjRev = 0 _TimeStamp = 0 _User = '' + _DevInfo = '' ENDDEFINE From 0f3da5fd7a35c94aaa61ca41108a53be5cfbf39e Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Sat, 15 Apr 2017 23:32:54 +0200 Subject: [PATCH 17/19] If sys(2023) points to "Progrma Files" (a read only dir), then point to getenv("temp") --- foxbin2prg.prg | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/foxbin2prg.prg b/foxbin2prg.prg index b665383..3637193 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -773,12 +773,13 @@ DEFINE CLASS c_foxbin2prg AS Session c_Foxbin2prg_FullPath = '' c_Foxbin2prg_ConfigFile = '' c_CurDir = '' + c_TempDir = SYS(2023) c_InputFile = '' c_ClassToConvert = '' && Guarda el nombre de la clase a convertir, indicada en tcInputFile como "archivo.vcx::clase" c_ClassOperationType = '' && (I)mport o (E)xport. Se usa solo para manejar clases individuales. c_OriginalFileName = '' - c_LogFile = ADDBS( SYS(2023) ) + 'FoxBin2Prg_Debug.LOG' - c_ErrorLogFile = ADDBS( SYS(2023) ) + 'FoxBin2Prg_Error.LOG' + c_LogFile = '' + c_ErrorLogFile = '' c_TextLog = '' c_OutputFile = '' c_Recompile = '1' @@ -880,6 +881,14 @@ DEFINE CLASS c_foxbin2prg AS Session THIS.declareDLL() + * Check if SYS(2023) point to "Program Files" + IF ATC("\PROGRAM FILES", THIS.c_TempDir) > 0 OR ATC("\ARCHIVOS DE PROGRAMA", THIS.c_TempDir) > 0 + THIS.c_TempDir = GETENV("TEMP") + ENDIF + + THIS.c_LogFile = ADDBS( THIS.c_TempDir ) + 'FoxBin2Prg_Debug.LOG' + THIS.c_ErrorLogFile = ADDBS( THIS.c_TempDir ) + 'FoxBin2Prg_Error.LOG' + IF ADIR(laDir, THIS.c_ErrorLogFile) > 0 THEN IF ADIR(laDir, THIS.c_ErrorLogFile + '.BAK') > 0 THEN THIS.changeFileAttribute( THIS.c_ErrorLogFile + '.BAK', '-R-S-H' ) @@ -8442,7 +8451,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base lnSelect = SELECT() SELECT 0 USE (THIS.c_InputFile) SHARED AGAIN ALIAS _TABLABIN - COPY STRUCTURE EXTENDED TO ( FORCEPATH( '_FRX_STRUC.DBF', ADDBS( SYS(2023) ) ) ) + COPY STRUCTURE EXTENDED TO ( FORCEPATH( '_FRX_STRUC.DBF', ADDBS( THIS.c_TempDir ) ) ) **** CONTINUAR SI ES NECESARIO - SIN USO POR AHORA /// DO NOT USE - NOT IMPLEMENTED! CATCH TO loEx From 1e5707983e643ae2dd46b98b624b83c35589d2ab Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Sun, 16 Apr 2017 00:04:03 +0200 Subject: [PATCH 18/19] Add more options to config.fpw to minimize interference from existent configs --- CONFIG/config.fpw | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/CONFIG/config.fpw b/CONFIG/config.fpw index ef3f93b..64df9af 100644 --- a/CONFIG/config.fpw +++ b/CONFIG/config.fpw @@ -1,2 +1,17 @@ +RESOURCE=OFF SCREEN=OFF -RESOURCE=OFF \ No newline at end of file +_STARTUP="" +HELP=OFF +_TRANSPORT="" +_GENXTAB="" +_FOXREF="" +TALK=OFF +_SPELLCHK="" +MVCOUNT=1024 +_BROWSER="" +_BUILDER="" +_CONVERTER="" +_TASKPANE="" +_TOOLBOX="" +_WIZARD="" +COMMAND="" From 59333ee06f05ba90b20fd839d4c1dacf10804ec9 Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Mon, 24 Apr 2017 23:34:57 +0200 Subject: [PATCH 19/19] v1.19.49 Preview-1 --- foxbin2prg.exe | Bin 619017 -> 623505 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/foxbin2prg.exe b/foxbin2prg.exe index 4adf091ede94ae45ee3371428a7bd316bb388de6..6db51b4729d4d3e27f3f0e88c684132a98ab52b4 100644 GIT binary patch delta 43102 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