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 */
- Code: Select all Expand view
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
- Code: Select all Expand view
if nRowStyle > 0
nRow := ::HeaderHeight() - 1
//nTemp2 := ::nDataRows
nTemp2 := if(::lFullGrid,nMaxRows,::nDataRows) // --> Need go until bottom
2) En la clase txBrwColumn, método PaintData, cambiar
if ::bStrData != nil //.and. !::hChecked
por
if ::bStrData != nil .and. nPaintRow<=::oBrw: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:bClrStd:={|| {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:bClrStd:={|| {if(oBrw:nArrayAt<=oBrw:nLen .and. oBrw:aRow[1],CLR_HBLUE,CLR_HGRAY),CLR_WHITE}}
Cordiales saludos.