Page 1 of 1
Posible bug en TXBrowse:PageUp()
Posted: Mon Sep 24, 2007 11:29 am
by Carlos Mora
Antonio,
Usando TestxBrw del directorio samples, haz estas dos modificaciones:
1) Deja solo 30 registros en customer.dbf
2) Modifica HorzRow() como lo que sigue:
Code: Select all
STATIC FUNCTION HorzRow( oWnd )
local oChild, oBrw, oFont
DEFINE FONT oFont NAME "TAHOMA" SIZE 0, -12
DEFINE WINDOW oChild TITLE "Horizontal lines & Row selector browse" MDICHILD OF oWnd
oBrw := TXBrowse():New( oWnd )
oBrw:SetFont( oFont )
oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW
oBrW:nColDividerStyle := LINESTYLE_BLACK
oBrw:nRowDividerStyle := LINESTYLE_BLACK
oBrw:SetRDD()
oBrw:CreateFromCode()
oChild:oClient := oBrw
ACTIVATE WINDOW oChild ON INIT oBrw:SetFocus()
RETURN NIL
Es decir agregarle el FONT y cambiamos los separadores de filas y columnas.
Luego lo ejecutas y entras en esa opción. Bajas hasta llegar al último registro usando la tecla hacia abajo. Cuando llegue al último registro, le dás a RePag, es decir que haga un pageUp, con lo que me deja el browse "descolocado", desincronizado con la información de la DBF.
El error es reproducible. Aparentemente el ajuste no es correcto cuando al pintar hay que ajustar el valor de nRowSel
Un saludo,
Carlos.
Posted: Tue Sep 25, 2007 1:15 pm
by Carlos Mora
Antonio,
has podido verificar el error?
Carlos
Posted: Thu Sep 27, 2007 8:20 am
by Carlos Mora
Buenos días Antonio,
ya parezco el "malo de la peli" con el tema TXBrowse
Modifiqué el testxbrw.prg del directorio samples, la función multiline de la siguiente forma:
Code: Select all
STATIC FUNCTION MultiLine( oWnd )
local oChild, oBrw
local nFor, oFont
DEFINE FONT oFont NAME "TAHOMA" SIZE 0, -12
DEFINE WINDOW oChild TITLE "Horizontal and vertical lines and dotted Cell selector browse" MDICHILD OF oWnd
oBrw := TXBrowse():New( oWnd )
oBrw:SetFont( oFont )
oBrw:nMarqueeStyle := MARQSTYLE_HIGHLCELL
oBrw:nColDividerStyle := LINESTYLE_BLACK
oBrw:nRowDividerStyle := LINESTYLE_BLACK
oBrw:lColDividerComplete := .t.
oBrw:nHeaderLines := 2
oBrw:nDataLines := 2
oBrw:SetRDD()
for nFor := 1 to Fcount()
oBrw:aCols[ nFor ]:cHeader := "Field: " + ltrim( str( nFor ) ) + CRLF + FieldName( nFor )
oBrw:aCols[ nFor ]:nDataStrAlign := AL_RIGHT
oBrw:aCols[ nFor ]:nHeadStrAlign := AL_RIGHT
next
oBrw:CreateFromCode()
oChild:oClient := oBrw
ACTIVATE WINDOW oChild ON INIT oBrw:SetFocus()
RETURN NIL
Pero no me justifica a la derecha los datos. Los headers los hace bien.
Pudiste ver algo del ejemplo que te puse del otro tema?
Un saludo,
Carlos.
Posted: Mon Oct 15, 2007 8:28 am
by Carlos Mora
Otro tema para resolver, y para este no tengo el codigo fuente.
Modifica en testxbrw el código del ejemplo de uso de xBrowse en diálogo
Code: Select all
STATIC FUNCTION NewDialog( oWnd )
local oDlg, oBrw
DEFINE DIALOG oDlg RESOURCE "TEST" OF oWnd
oBrw := TXBrowse():New( oWnd )
//-----------8<----------- Añadido desde acá
oBrw:lRecordSelector := .F.
oBrw:nHeaderLines := 2
oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW
oBrw:nColDividerStyle := ;
oBrw:nRowDividerStyle := LINESTYLE_BLACK
//-----------8<----------- Añadido hasta acá
oBrw:CreateFromResource( 101 )
ACTIVATE DIALOG oDlg
RETURN NIL
cuando hagas el scroll vertical con la rueda del raton o bien con las teclas arriba y abajo, verás que se pintan mal las últimas líneas.
Es un problema que están en el XBrwScroll() , que estan en C y que no está el código fuente, por lo que no puedo buscarle una solución.
En general el fallo me aparece cuando tengo headers de más de 1 línea de alto.
Un saludo,
Carlos.
Posted: Mon Oct 15, 2007 8:41 am
by Antonio Linares
Carlos,
Aqui tienes el código:
Code: Select all
#ifdef __HARBOUR__
HB_FUNC( XBRWSCROLL ) // ( hWnd, nRows, nRowHeight, nHeaderHeight, nFooterHeight ) --> nil
#else
CLIPPER XBRWSCROLL( PARAMS ) // ( hWnd, nRows, nRowHeight, nHeaderHeight, nFooterHeight ) --> nil
#endif
{
HWND hWnd = ( HWND ) _parnl( 1 );
int wRows = _parni( 2 );
int wHeight = _parnl( 3 );
RECT rct;
GetClientRect( hWnd, &rct );
rct.top += ( _parnl( 4 ) );
rct.bottom -= ( _parnl( 5 ) );
rct.bottom -= ( ( rct.bottom - rct.top ) % _parnl( 3 ) ) + 1;
ScrollWindowEx( hWnd, 0, -( wHeight * wRows ), 0, &rct, 0, 0, 0 );
}
Como ves, el XBrowse fué un regalito que nos dejaron con bastantes "bichitos" dentro
Se me habían pasado estos mensajes tuyos, discúlpame, voy a echarles un vistazo cuanto antes
Posted: Mon Oct 15, 2007 9:33 am
by Carlos Mora
Antonio,
gracias por el código. Para más detalle respecto del problema del scroll, se pinta mal cuando hacemos el scroll hacia arriba, y luego ese pintado mal hecho afecta al scroll hacia arriba.
Ya te cuento si le doy en el fallo.
Carlos
Posted: Mon Oct 15, 2007 10:37 am
by Carlos Mora
Antonio,
para que no digan que solo doy problemas
en el método goup()
debe cambiarse la llamada a EraseData
Code: Select all
// ::EraseData( ( ( Int(nHeight/::nRowHeight) + 1 ) * ::nRowHeight ) + 10 ) lo quité por los problemas de pintado, con esto lo resuelve.
::EraseData( ::HeaderHeight() + ::nRowHeight * ::RowCount() )
Lo que se calculaba mal era la posición desde donde hay que borrar. Al menos en mis pruebas funciona correctamente, si alguien más me lo confirma...
Es cierto que el Xbrowse adolece de muchos bugs, pero de los que he probado es el mejor estructurado, y aunque eventualmente falla es el más sencillo de extender. Tal vez hay algunos detalles mejorables pero en lo personal es el que más me gusta. Añadirle prestaciones no es muy complicado, según sé hay algunos compañeros que le han añadido Headers con temas de Windows usando los THeaders de Windows y algunas otras extensiones.
Sigo en el tema XBrowse como habras notado, creo que al final lo vamos a dejar bien.
Un saludo,
Carlos.
Posted: Mon Oct 15, 2007 12:28 pm
by Antonio Linares
Carlos,
> ::EraseData( ::HeaderHeight() + ::nRowHeight * ::RowCount() )
Modificado. Gracias!