Pasar bloque de codigo por variable

Post Reply
jpcavagnaro
Posts: 35
Joined: Tue Aug 12, 2025 12:29 pm

Pasar bloque de codigo por variable

Post by jpcavagnaro »

Hola gente, como puedo pasar un bloque?

tengo un xbrowse así:

@ 100, 5 XBROWSE oBrw ;
SIZE 385, 130 PIXEL;
OF oTabella ;
DATASOURCE cDbf COLUMNS aBrowse LINES NOBORDER FOOTERS autosort

WITH OBJECT oBrw
* if !empty(bBloque)
* &bBloque
* endif
WITH OBJECT oBrw:aCols[ 1 ]
:bFooter := { || Ltrim( Str( oBrw:KeyNo() ) ) + " / " + LTrim( Str( oBrw:KeyCount() ) ) +"-" + cTitle }
END
:CreateFromCode()
:nEditTypes := tEditTypes
END

Lo que quiero hacer es dependiendo de alguna característica pasar un bloque que se incorpore al WITH OBJECT obrw

SAludos
Jorge

Saludos
Jorge
User avatar
Antonio Linares
Site Admin
Posts: 44515
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Pasar bloque de codigo por variable

Post by Antonio Linares »

Estimado Jorge,

La forma correcta de pasar un bloque de código para configurar un XBrowse es usar Eval(), pasando el objeto oBrw como parámetro al bloque. No necesitas macro-sustitución (&).

Solución

Tu función debería recibir un parámetro bBloque y evaluarlo con Eval():

Code: Select all | Expand

FUNCTION MiBrowse( ..., bBloque )

   @ 100, 5 XBROWSE oBrw ;
      SIZE 385, 130 PIXEL;
      OF oTabella ;
      DATASOURCE cDbf COLUMNS aBrowse LINES NOBORDER FOOTERS AUTOSORT

   WITH OBJECT oBrw
      // Evaluar el bloque pasando oBrw como parámetro
      if bBloque != nil
         Eval( bBloque, oBrw )
      endif

      WITH OBJECT :aCols[ 1 ]
         :bFooter := { || Ltrim( Str( oBrw:KeyNo() ) ) + " / " + ;
                         LTrim( Str( oBrw:KeyCount() ) ) + "-" + cTitle }
      END
      :CreateFromCode()
      :nEditTypes := tEditTypes
   END
Cómo llamarlo

Code: Select all | Expand

// Ejemplo 1: con colores pijama
MiBrowse( ..., { |oBrw| oBrw:bClrStd := { || If( oBrw:KeyNo() % 2 == 0, ;
                  { CLR_BLACK, RGB(224,236,255) }, ;
                  { CLR_BLACK, RGB(189,211,253) } ) } } )

// Ejemplo 2: con varias configuraciones
MiBrowse( ..., { |oBrw| oBrw:lRecordSelector := .F., ;
                         oBrw:lHScroll := .F., ;
                         oBrw:nMarqueeStyle := 3 } )

// Ejemplo 3: sin bloque (comportamiento por defecto)
MiBrowse( ... )
Si necesitas algo más complejo

Para bloques con múltiples líneas, usa una función separada (como hace el propio FWH):

Code: Select all | Expand

// Llamada:
MiBrowse( ..., { |oBrw| SetupMiBrowse( oBrw ) } )

// Función de configuración:
STATIC FUNCTION SetupMiBrowse( oBrw )
   WITH OBJECT oBrw
      :lRecordSelector := .F.
      :nMarqueeStyle   := 5
      :bClrStd := { || { CLR_BLACK, RGB(232,255,232) } }
   END
RETURN nil

Este es exactamente el patrón que usa FWH internamente. Por ejemplo, el comando XBROWSER tiene una cláusula SETUP que hace lo mismo: 0-cite-0

Y en adofuncs.prg se evalúa el bloque bSetup pasando el browse: 0-cite-1

Otro ejemplo en sample01.prg con bInit: 0-cite-2

La clave es: nunca uses macro-sustitución (&) para esto. Usa Eval( bBloque, oBrw ) que es la forma correcta y segura en Harbour/FiveWin.

regards, saludos

Antonio Linares
www.fivetechsoft.com
jpcavagnaro
Posts: 35
Joined: Tue Aug 12, 2025 12:29 pm

Re: Pasar bloque de codigo por variable

Post by jpcavagnaro »

Gracias por responder Antonio, funciono, había probado y evidentemente algo mal estaba en el bloque

Saludos
Jorge

Saludos
Jorge
Post Reply