Aqu铆 un ejemplo muy sencillo de lo que se puede hacer con xbscript. El l铆mite es la imaginaci贸n, con m铆minos cambios. El prinicipal, en mi caso, es que he decidido omitir el uso de los comandos, por lo que no se incorporan "includes", pues cada vez que se ejecute un script se van a cargar los includes con el consabido consumo . de memoria. Sin
los includes va puro c贸digo preprocesado. Cuando tengo una duda de c贸mo escribir el c贸digo preprocesado, sobre todo el lo relacionado con la parte dise帽o, Windows, Dialogs, los diferentes controles, etc, lo que hago es un prg nomal sencillo de c贸mo quiero que quede el control y lo copilo con la opci贸n "-p" o "/p" para que se genere el archivo "ppo". Lo abro y copio c贸digo y lo pego tal cual en el script, y ya est谩, r谩pido, sencillo y poderoso. Poco a poco se ir谩n convirtiendo en maestros.
Pueden pasar variables, recibir variables, etc. Algunos trucos: No se pueden pasar objetos, o por lo menos no he descubierto c贸mo, pero yo guardo el objeto en un hash universal y le paso al escript el hash, y todo funciona perfecto. De un script puedo pasar a otro, u otros. Es decir pueden construir una aplicaci贸n completa en la que el prg princiapal ( exe ) s贸lo necesitar铆a la instrucci贸n que invoque al primer script (Esto exagerando el minimalismo), pero lo he logrado con algunos desarrollo m谩s o menos importantes para algunos clientes. Una vez que se lo entrego, les doy una capacitaci贸n y a partir de ah铆 pueden defenderse s贸los. Si necesitan algo m谩s avenzado, me conecto via Skype, o Anydesk, o RDP de T茅rminal Server, etc., le modifico, agrego, cambio o quito c贸digo, sin necesidad de compilar, ni instalar herramientas, ni nada. Un simple editor de texto y hago maravillas.
Se necesita inclu铆r el archivo xHarbour\utils\sbscript\xbscript.prg. Creo que es mejor crear una librer铆a con el mismo y linkearla a su aplicaci贸n.
Archivo principal "PRUEBA1.PRG" (Ser谩 PRUEBA1.EXE)
Archivo Script "_Script_Pruebas.scr"
los includes va puro c贸digo preprocesado. Cuando tengo una duda de c贸mo escribir el c贸digo preprocesado, sobre todo el lo relacionado con la parte dise帽o, Windows, Dialogs, los diferentes controles, etc, lo que hago es un prg nomal sencillo de c贸mo quiero que quede el control y lo copilo con la opci贸n "-p" o "/p" para que se genere el archivo "ppo". Lo abro y copio c贸digo y lo pego tal cual en el script, y ya est谩, r谩pido, sencillo y poderoso. Poco a poco se ir谩n convirtiendo en maestros.
Pueden pasar variables, recibir variables, etc. Algunos trucos: No se pueden pasar objetos, o por lo menos no he descubierto c贸mo, pero yo guardo el objeto en un hash universal y le paso al escript el hash, y todo funciona perfecto. De un script puedo pasar a otro, u otros. Es decir pueden construir una aplicaci贸n completa en la que el prg princiapal ( exe ) s贸lo necesitar铆a la instrucci贸n que invoque al primer script (Esto exagerando el minimalismo), pero lo he logrado con algunos desarrollo m谩s o menos importantes para algunos clientes. Una vez que se lo entrego, les doy una capacitaci贸n y a partir de ah铆 pueden defenderse s贸los. Si necesitan algo m谩s avenzado, me conecto via Skype, o Anydesk, o RDP de T茅rminal Server, etc., le modifico, agrego, cambio o quito c贸digo, sin necesidad de compilar, ni instalar herramientas, ni nada. Un simple editor de texto y hago maravillas.
Se necesita inclu铆r el archivo xHarbour\utils\sbscript\xbscript.prg. Creo que es mejor crear una librer铆a con el mismo y linkearla a su aplicaci贸n.
Archivo principal "PRUEBA1.PRG" (Ser谩 PRUEBA1.EXE)
#include "fivewin.ch"
REQUEST FW_DemoDB
Function Inicio()
聽 聽LOCAL oDlg
聽 聽LOCAL FWH_VERSION := FWVERSION
聽 聽DEFINE DIALOG oDlg SIZE 290,220 PIXEL TRUEPIXEL TITLE "Gen茅rido para pruebas con script"
聽 聽 聽 聽@ 聽20,75 BUTTON "&Ejecutar Script Op. 1" OF oDlg PIXEL SIZE 140,35 ACTION Make_PP_Run("_Script_Pruebas.scr",{"OpenTable"}, {FWH_VERSION})
聽 聽 聽 聽@ 聽70,75 BUTTON "&Ejecutar Script Op. 2" OF oDlg PIXEL SIZE 140,35 ACTION Make_PP_Run("_Script_Pruebas.scr",{"MakeDialogo"})
聽 聽 聽 聽@ 150,75 BUTTON "&Salir" OF oDlg PIXEL SIZE 120,35 ACTION oDlg:End()
聽 聽ACTIVATE DIALOG oDlg CENTERED
Return(NIL)
//-----------------------------------//
Function Make_PP_Run(cElScript, mVar01, mVar02, mVar03, mVar04, mVar05)
聽 聽LOCAL oError
聽 聽hb_gcAll(.T.)
聽 聽TRY
聽 聽 聽 聽PP_RUN( cElScript , { mVar01 , mVar02 , mVar03 , mVar04 , mVar05 } )
聽 聽CATCH oError
聽 聽 聽 聽MSGSTOP( oError:description() + CRLF + CRLF + "Error Ejecuci贸n de Sentencia en ....", oDatos:cTitMsg )
聽 聽 聽 聽RETURN(NIL)
聽 聽END
聽 聽hb_gcAll(.T.)
Return(NIL)
//-----------------------------------//Function inicio(aVars1, aVars2)
聽 聽DO CASE
聽 聽 聽 CASE aVars1[1] == "OpenTable"
聽 聽 聽 聽 聽AbreTabla(aVars2)
聽 聽 聽 CASE aVars1[1] == "MakeDialogo"
聽 聽 聽 聽 聽MakeDialogo()
聽 聽 聽 CASE aVars1[1] == "Otrafuncion"
聽 聽聽 聽 聽// Otrafuncion().....
聽 聽 聽 OTHERWISE
聽 聽ENDCASE
Return(NIL)
//-----------------------------------//
Function AbreTabla(aVars2)
聽 聽local oCn
聽 聽local oRsState, oRsCity, oRsCust
聽 聽local oBrwState, oBrwCity, oBrwCust
聽 聽local oDlg, oFont
聽 聽MsgInfo( "Versi贸n FWH: 聽" + aVars2[1] )
聽 聽oCn 聽 := FW_DemoDB()
聽 聽bAccion := {|| oRsState := oCn:RowSet( "SELECT * FROM states ORDER BY name" ) ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 oRsCity 聽:= oCn:RowSet( "SELECT id, state, city FROM customer ORDER BY state, city" ) ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 oRsCust 聽:= oCn:RowSet( "SELECT id, state, CONCAT_WS( ', ', first, last ) AS Name FROM customer ORDER by state,Name" ) ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 oRsCity:SetFilter( "STATE = ?", { oRsState:code } ) ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 oRsCust:SetFilter( "STATE = ?", { oRsState:code } ) }
聽 聽MsgRun( "Reading tables", "Please Wait...", Eval(bAccion) )
聽 聽oFont := TFont():New( "Segoe UI", 0, -10,,,,,,,,,,,,,,, .T. )
聽 聽oDlg = TDialog():New(,,,, "MARIADB - PARENT WITH TWO CHILD TABLES - Time: " + TTOC(DateTime()),,, .F.,,,,,, .T.,, oFont,, 700, 600, .F.,, "oDlg",, .T., )
聽 聽IIF( HB_ISOBJECT( oFont ), oFont:End(), ) ; oFont := nil
聽 聽oBrwState := XbrowseNew( oDlg, 20, 20, 300, -20,,,,,,,,,,,, .F., oRsState,, .F.,, .T.,, .F., .F. ,, {"NAME","CODE"},,, .F., .F., .T., .T.,,,,, .F., .T., "oBrwState", )
聽 聽WITH OBJECT oBrwState
聽 聽 聽 :SetGroupHeader( "PARENT", 1, 2 )
聽 聽 聽 :nStretchCol 聽 := 1
聽 聽 聽 :lHScroll 聽 聽 聽:= .F.
聽 聽 聽 :bChange 聽 聽 聽 := {|| ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oRsCity:ReFilter( { oRsState:code } ) ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oRsCust:ReFilter( { oRsState:code } ) ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oBrwCity:Refresh() ,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oBrwCust:Refresh() }
聽 聽 聽 :CreateFromCode()
聽 聽END
聽 聽oBrwCity := XbrowseNew( oDlg, 20, 300, 400, 260,,,,,,,,,,,, .F., oRsCity,, .F.,, .T.,, .F., .F. ,, {"STATE","CITY"},,, .F., .F., .T., .T.,,,,, .F., .T., "oBrwCity", )
聽 聽WITH OBJECT oBrwCity
聽 聽 聽 :SetGroupHeader( "CHILD-1", 1, 2 )
聽 聽 聽 :nStretchCol 聽 := 2
聽 聽 聽 :lHScroll 聽 聽 聽:= .F.
聽 聽 聽 :CreateFromCode()
聽 聽END
聽 聽oBrwCust := XbrowseNew( oDlg, 280, 300, 400, -20,,,,,,,,,,,, .F., oRsCust,, .F.,, .T.,, .F., .F. ,, {"STATE","NAME"},,, .F., .F., .T., .T.,,,,, .F., .T., "oBrwCust", )
聽 聽WITH OBJECT oBrwCust
聽 聽 聽 :SetGroupHeader( "CHILD-2", 1, 2 )
聽 聽 聽 :nStretchCol 聽 := 2
聽 聽 聽 :lHScroll 聽 聽 聽:= .F.
聽 聽 聽 :CreateFromCode()
聽 聽END
聽 聽oDlg:Activate( oDlg:bLClicked, oDlg:bMoved, oDlg:bPainted, .T.,,,, oDlg:bRClicked,,,,, @oDlg, )
聽 聽oCn:Close()
return nil
//-----------------------------------//
Function MakeDialogo()
聽 聽LOCAL oDlg
聽 聽oDlg = TDialog():New(,,,, "Dialogo creado al vuelo",,, .F.,,,,,, .T.,,,, 490, 320, .F.,, "oDlg",, .T., )
聽 聽 聽 聽TButton():New( 150, (oDlg:nWidth/2) - 60 , "&Salir", oDlg, {|| oDlg:End()}, 120, 35,,, .F., .T., .F.,, .F.,,, .F.,, .F.,, )
聽 聽oDlg:Activate( oDlg:bLClicked, oDlg:bMoved, oDlg:bPainted, .T.,,,, oDlg:bRClicked,,,,, @oDlg, )
Return NIL
//-----------------------------------//Saludos,
Carlos Gallego
*** FWH-25.12, xHarbour 1.3.1 Build 20241008, Borland C++7.70, PellesC, ADS 11.1***