FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin for Harbour/xHarbour Pasar bloque de codigo por variable
Posts: 14
Joined: Tue Aug 12, 2025 12:29 PM
Pasar bloque de codigo por variable
Posted: Fri May 01, 2026 09:48 AM

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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Pasar bloque de codigo por variable
Posted: Fri May 01, 2026 10:00 AM

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 (harbour): Select all Collapse
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 (harbour): Select all Collapse
// 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 (harbour): Select all Collapse
// 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
Posts: 14
Joined: Tue Aug 12, 2025 12:29 PM
Re: Pasar bloque de codigo por variable
Posted: Fri May 01, 2026 11:02 AM

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

Saludos Jorge

Saludos

Jorge

Continue the discussion