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: Select all Expand view RUN
- #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: Select all Expand view RUN
- 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
//-----------------------------------//