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():
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
// 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):
// 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.