Obviamente que es cuesti贸n de gustos personales, pero, para mis preferencias, la regi贸n en blanco (figura izquierda) que queda en la parte inferior de un xbrowse cuando se muestra una array con menos elementos que los que pueden dibujarse, disminuye las elegantes caracter铆sticas visuales de este control.

Comparto con quienes coincidan conmigo las modificaciones necesarias que permiten dibujar xbrowse con full grid, como se muestra en la figura derecha.
1) En la clase txBrowse:
1.1) Variable que controla si se pinta el full grid: agregar: DATA lFullGrid INIT .T.
1.2) Pintado de celdas: En el m茅todo Paint, agregar variable Local nArrayAt e insertar el siguiente c贸digo justo antes de /* Paint lines */
1.3) Pintado de lineas: En el mismo m茅todo Paint(), un poco m谩s abajo, comentar nTemp2 y agregar la l铆ne indicada
2) En la clase txBrwColumn, m茅todo PaintData, cambiar
if ::bStrData != nil //.and. !::hChecked
por
if ::bStrData != nil .and. nPaintRow<=::nLen //.and. !::hChecked
ADVERTENCIA: PaintData() es llamado ahora con valores de ::nArrayAt superiores a la longitud del array, lo que puede producir errores de rango en el acceso al array en tiempo de ejecuci贸n. Analice y corrija los codeblocks que contengan ::nArrayAt o ::aRow (y quiz谩s otros).
Ejemplo:
oBrw:={|| {if(oBrw:aRow[1],CLR_HBLUE,CLR_HGRAY),CLR_WHITE}}
va a generar un error cuando se llame con un valor superior a la longitud del array y para evitarlo debe ser cambiado por:
oBrw:={|| {if(oBrw:nArrayAt<=oBrw:nLen .and. oBrw:aRow[1],CLR_HBLUE,CLR_HGRAY),CLR_WHITE}}
Cordiales saludos.

Comparto con quienes coincidan conmigo las modificaciones necesarias que permiten dibujar xbrowse con full grid, como se muestra en la figura derecha.
1) En la clase txBrowse:
1.1) Variable que controla si se pinta el full grid: agregar: DATA lFullGrid INIT .T.
1.2) Pintado de celdas: En el m茅todo Paint, agregar variable Local nArrayAt e insertar el siguiente c贸digo justo antes de /* Paint lines */
聽 IF ::lFullGrid
聽 聽 聽nArrayAt:=::nArrayAt 聽 聽//Save current value
聽 聽 聽do while nRow<=nBrwHeight
聽 聽 聽 聽::nArrayAt:=nRowPos 聽// Case it's reqired by ::bClrStd
聽 聽 聽 聽for nFor := 1 to nLast
聽 聽 聽 聽 聽if aCols[ nFor ] > nBrwWidth
聽 聽 聽 聽 聽 聽 exit
聽 聽 聽 聽 聽endif
聽 聽 聽 聽 聽oCol := ::ColAtPos( nFor )
聽 聽 聽 聽 聽oCol:PaintData( nRow, aCols[ nFor ], nHeight, .F., .f., nFor, nRowPos )
聽 聽 聽 聽next
聽 聽 聽 // We must also paint some times after the last visible column
聽 聽 聽 if aCols[ nLast + 1 ] < nBrwWidth
聽 聽 聽 聽 聽nTemp 聽 聽 := nRow + nHeight
聽 聽 聽 聽 聽nTemp2 聽 聽:= aCols[nLast + 1]
聽 聽 聽 聽 聽 if nColStyle < LINESTYLE_INSET
聽 聽 聽 聽 聽 聽 nTemp2--
聽 聽 聽 聽 聽 endif
聽 聽 聽 聽 聽 if ! ( ::lTransparent == .t. )
聽 聽 聽 聽 聽 聽 聽hBrush := CreateSolidBrush( Eval( ::bClrStd )[ 2 ] )
聽 聽 聽 聽 聽 聽 聽FillRect( hDC, {nRow, nTemp2, nTemp, nBrwWidth }, hBrush )
聽 聽 聽 聽 聽 聽 聽DeleteObject( hBrush )
聽 聽 聽 聽 聽 endif
聽 聽 聽 聽 endif
聽 聽 聽 聽 nRowPos++
聽 聽 聽 聽 nRow += nRowHeight
聽 聽 聽enddo
聽 聽 ::nArrayAt:=nArrayAt 聽 聽//restore value
聽 聽ENDIF
聽 聽/*
聽 聽 聽 Paint lines
聽 聽 */1.3) Pintado de lineas: En el mismo m茅todo Paint(), un poco m谩s abajo, comentar nTemp2 y agregar la l铆ne indicada
聽 聽 聽 聽 聽 聽 聽 if nRowStyle > 0
聽 聽 聽 聽 聽 聽 聽 聽 聽 nRow 聽 := ::HeaderHeight() - 1
聽 聽 聽 聽 聽 聽 聽 聽 聽 //nTemp2 := ::nDataRows
聽 聽 聽 聽 聽 聽 聽 聽 聽 nTemp2 := if(::lFullGrid,nMaxRows,::nDataRows) 聽// --> Need go until bottom2) En la clase txBrwColumn, m茅todo PaintData, cambiar
if ::bStrData != nil //.and. !::hChecked
por
if ::bStrData != nil .and. nPaintRow<=::nLen //.and. !::hChecked
ADVERTENCIA: PaintData() es llamado ahora con valores de ::nArrayAt superiores a la longitud del array, lo que puede producir errores de rango en el acceso al array en tiempo de ejecuci贸n. Analice y corrija los codeblocks que contengan ::nArrayAt o ::aRow (y quiz谩s otros).
Ejemplo:
oBrw:={|| {if(oBrw:aRow[1],CLR_HBLUE,CLR_HGRAY),CLR_WHITE}}
va a generar un error cuando se llame con un valor superior a la longitud del array y para evitarlo debe ser cambiado por:
oBrw:={|| {if(oBrw:nArrayAt<=oBrw:nLen .and. oBrw:aRow[1],CLR_HBLUE,CLR_HGRAY),CLR_WHITE}}
Cordiales saludos.
