Posible bug en TXBrowse:PageUp()

Post Reply
Carlos Mora
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Posible bug en TXBrowse:PageUp()

Post 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.
Carlos Mora
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Post by Carlos Mora »

Antonio,
has podido verificar el error?

Carlos
Carlos Mora
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Post 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.
Carlos Mora
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Post 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.
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post 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
Last edited by Antonio Linares on Mon Oct 15, 2007 9:57 am, edited 1 time in total.
regards, saludos

Antonio Linares
www.fivetechsoft.com
Carlos Mora
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Post 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
Carlos Mora
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Post 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.
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Carlos,

> ::EraseData( ::HeaderHeight() + ::nRowHeight * ::RowCount() )

Modificado. Gracias! :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
Post Reply