FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Ejemplo xbscript
Posts: 514
Joined: Sun Oct 16, 2005 03:32 AM
Ejemplo xbscript
Posted: Fri Sep 13, 2024 10:03 PM
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)
Code (fw): Select all Collapse
#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)
//-----------------------------------//
Archivo Script "_Script_Pruebas.scr"
Code (fw): Select all Collapse
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***

Posts: 1144
Joined: Mon Feb 05, 2007 07:15 PM
Re: Ejemplo xbscript
Posted: Fri Sep 13, 2024 10:26 PM

Carlos que interesante,

pregunto:

1) que tan dif铆cil es convertir una aplicaci贸n en este modelo? (una aplicaci贸n que ya est谩 en producci贸n en modelo tradicional)

2) pueden convivir c贸digo normal con script ?

gracias por compartir tus conocimientos

saludos C.C.C.

Cesar Cortes Cruz

SysCtrl Software

Mexico



' Sin +- FWH es mejor "
Posts: 514
Joined: Sun Oct 16, 2005 03:32 AM
Re: Ejemplo xbscript
Posted: Sat Sep 14, 2024 07:13 PM
Hola Cesar,

1.- Es muy f谩cil, pero puede ser tedioso, pues recuerda que dentro de los scripts (as铆 lo he usado durante a帽os sin problemas") no incorporo los archivos include necesarios. Esto significa que la programaci贸n via comandos no te va a funcionar, sino la sintaxis de ppo. La raz贸n por la que no agrego los include es que cada vez que llames el script va a cargar el include pero no lo descarga al salir. Entonces, si tienen un proceso que vas a ejecutar 100 veces en el trasncurso del d铆a, "Fivewin.ch" y cualquier otro "include" se va a ir agregando hasta que te revienta la memoria. Si alguien logra descubrir como descargar los includes cuando se salga del script, entonces ser铆a suuuuuuuper f谩cil, tan simple como copy de tu codigo normal y paste en tus archivos scripts. Caso contrario, hacer la tarea de convertir de comandos a preprocesado. Todos los controles, clases, etc., los encontrar谩s en la carpeta "INCLUDE" de FWH o revisando los m茅todos "new" de la clase que quieras usar. Lo primeros d铆as puede ser apabullante, pero luego te acostumbras. Si tengo un dise帽o conplicado, con muchos controles, que ya tengo funcionando en c贸digo normal (comandos), simplemente compilo con "-p" para que me genere el respectivo archivo_codigo.ppo, busco la funci贸n donde tengo el dise帽o, y copy y paste. De esta forma, he logrado convertir algunas aplicaciones medianamente complejas, con un poco de paciencia, con no m谩s de un 10% o 20% de c贸digo en archivos fuente incluidos en el ejecutable, y el otro 80 % 90% en archivos abiertos scripts que cualquiera puede modificar, sin requerir nada m谩s que de un simple editor como el Bloc de Notas de microsoft, y por supuesto, el conocimiento para hacerlo.

Me explico con un ejemplo:

Creamos un di谩logo o window, o lo que sea, el principio es el mismo, y lo compilamos con la opci贸n "-p" al genera el c贸digo xHarbour;
Code (fw): Select all Collapse
Function Main()
聽 LOCAL oDlg
聽 DEFINE DIALOG oDlg SIZE 300,200 PIXEL TRUEPIXEL TITLE "Prueba script"
聽 聽 聽@ 20,20 BTNBMP PROMPT "&Salir" OF oDlg PIXEL SIZE 100,30 ACTION oDlg:End() FLAT
聽 ACTIVATE DIALOG oDlg CENTERED
Return nil
Y este es su equivalente preprocesado, tomado del archivo "prueba.ppo" que se genere al momento de compilar con la opci贸n "-p" o "/p"
Code (fw): Select all Collapse
Function Main()
聽 LOCAL oDlg
聽 oDlg = TDialog():New(,,,, "Prueba script",,, .F.,,,,,, .T.,,,, 300, 200, .F.,, "oDlg",, .T., )
聽 聽 聽TBtnBmp():New( 20, 20, 100, 30,,,,, {|Self|oDlg:End()}, oDlg,,, .F., .F., "&Salir",,,, !.F.,, .F.,,, .F.,, !.F.,, .T., .F., .T.,,, .F.,, )
聽 oDlg:Activate( oDlg:bLClicked, oDlg:bMoved, oDlg:bPainted, .T.,,,, oDlg:bRClicked,,,,, @oDlg, )
Return nil
Espero que esto te haya medio aclarado tus dos pregunta: La conversi贸n es f谩cil, y si, desde tu c贸digo fuente puedes llamar a tus scripts o funciones de tus scripts, y desde 茅stos puedes llamar funciones de tu c贸digo fuente, pasar y recibir variables, etc. La 煤nica limitaci贸n es lo de los includes, que en resumen lo que hacen es incluir defines propios de cada clase y convertir, usando "command" o "xcommand", c贸digo preprocesado en c贸digo basado en comandos, para hacer m谩s amigable la escritura del c贸digo. Si llegas a necesitar alg煤n "define" en tu script, pues lo agregas y listo.

Saludos,



Carlos Gallego



*** FWH-25.12, xHarbour 1.3.1 Build 20241008, Borland C++7.70, PellesC, ADS 11.1***

Continue the discussion