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.
Image
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.
Image
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 :D

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! :-)