Page 1 of 1

Fix para xbrowse + GoRight()

Posted: Tue Apr 17, 2007 4:26 pm
by Rossine
Olá,

Eu estava tendo alguns problemas com o xbrowse, quando se teclava a seta para direita, as colunas não eram mostradas na posição correta. Abaixo segue o fix (ou possível fix hehe) para isto. Pelo menos em todos os testes que fiz aqui funcionou 100%. Peço a quem usa o xbrowse fazer estas mudanças no arquivo XBROWSE.PRG e me digam se funciona para vocês também ok ? [:D]

Code: Select all

//---------------------------------------------------------------------------//

METHOD IsDisplayPosVisible( nPos, lComplete ) CLASS TXBrowse

   local nWidth, nFor

   DEFAULT lComplete := .f.

   if nPos < 1 .or. nPos > len( ::aDisplay )
      return .f.
   endif

   if ::lRecordSelector
      nWidth := RECORDSELECTOR_WIDTH
   else
      nWidth := 0
   endif

   for nFor := 1 to nPos - 1
      nWidth += ::ColAtPos( nFor ):nWidth + COL_SEPARATOR
   next

   if lcomplete
      nWidth += ::ColAtPos( nPos ):nWidth + COL_SEPARATOR

      if nWidth > ::BrwWidth()    && By 
Rossine - Reajusta a largura da coluna
         ::ColAtPos( nPos ):nWidth -= ( nWidth - ::BrwWidth() + COL_SEPARATOR )
      endif

   endif

return ( nWidth  < ::BrwWidth() )

//---------------------------------------------------------------------------//

Code: Select all

//---------------------------------------------------------------------------//

METHOD GoRight( lOffset, lRefresh ) CLASS TXBrowse

   local nLen, nVis

   ::CancelEdit()

   if ::nMarqueeStyle == MARQSTYLE_NOMARQUEE .or. ::nMarqueeStyle >= MARQSTYLE_HIGHLROW
      lOffset := .t.
   endif

   DEFAULT lOffset  := .f.,;
           lRefresh := .t.

   nLen := len( ::aDisplay )
   nVis := 0

   Aeval( ::aCols, {|v| iif(!v:lHide, nVis++,) } )

   if ::ColAtPos( ::nColSel ):nCreationOrder < LEN(::aCols)    && By Rossine
      if     ::ColAtPos( ::nColSel+1 ):nCreationOrder = LEN(::aCols)
             if LEN(::aCols) <= ::LastDisplayPos( .f. )
                ::nColSel++
                if lRefresh
                   ::DrawLine( .t. )
                endif
             else
                ::GoRightMost()
             endif

* Linha Original de xbrowse
*     if     ( !lOffset .and. ::nColSel <= ::LastDisplayPos( .t. ) .and. ::nColSel < nLen ) .or. ;
*            ( ::nColOffset == ( nLen - ::nFreeze + 1 ) .and. ::nColSel < nLen )

      elseif ( !lOffset .and. ::nColSel+1 <= ::LastDisplayPos( .t. ) .and. ::nColSel <= nLen ) .or. ;
             ( ::nColOffset == ( nLen - ::nFreeze + 1 ) .and. ::nColSel < nLen )
             ::nColSel++
             if lRefresh
                ::DrawLine( .t. )
             endif

&& Linha Original de xbrowse
*     elseif ::nColOffset < ( nVis - ::nFreeze )

      elseif ::nColOffset < ( nVis - ::nFreeze ) .and. ::ColAtPos( ::nColSel ):nCreationOrder <= LEN(::aCols)
      
             ::nColOffset := Min( ::nColOffset + 1, nVis - ::nFreeze )
             ::GetDisplayCols()
             if lRefresh
                ::Super:Refresh( .f. )
             endif

            ::IsDisplayPosVisible( ::nColSel, .t. )  && By Rossine
                                                     && Isto e' necessario para se ajustar a largura
                                                     && da ultima coluna visualizada a direita.
      endif

      if ::oHScroll != nil
         ::oHScroll:GoDown()
      endif
   endif

return nil

//----------------------------------------------------------------------------//

Obrigado,

Rossine.

Re: Fix para xbrowse + GoRight()

Posted: Tue Apr 17, 2007 5:18 pm
by Maurilio Viana
Olá, Rossine!

Uso somente xBrowse em meu programa e em muitas situações tenho esse problema de remontagem das colunas.
Tenho também problema da montagem das linhas na navegação pela vertical quando a altura do xBrowse não permite que a última linha seja visualizada por completo.
Vou testar suas correções!

Abraços!
Maurilio

Posted: Tue Apr 17, 2007 6:15 pm
by Rossine
Olá Maurilio,
Tenho também problema da montagem das linhas na navegação pela vertical quando a altura do xBrowse não permite que a última linha seja visualizada por completo.
Tente mudar o método abaixo para ver ser resolve este problema de apagar a ultima linha. Mudei somente a linha com "*"

Code: Select all

METHOD GoUp() CLASS TXBrowse

   local nHeight

   if ::nLen == 0 .or. Eval( ::bBof )
      return nil
   endif

   ::CancelEdit()
   ::DrawLine()
   ::Seek()

   if Eval( ::bSkip, -1 ) == -1
      if ::nRowSel > 1
         ::nRowSel--
      else
         XBrwScroll( ::hWnd, -1, ::nRowHeight, ::nHeaderHeight, ::nFooterHeight )
         nHeight := ::BrwHeight() - ::FooterHeight() - ::HeaderHeight()
         If nHeight % ::nRowHeight > 0
*           ::EraseData( ( Int(nHeight/::nRowHeight) + 1 ) * ::nRowHeight )
            ::EraseData( ( ( Int(nHeight/::nRowHeight) + 1 ) * ::nRowHeight ) + 10 )
         Endif
         If ::nDataRows < ::RowCount()
            ::nDataRows++
         Endif
      endif
   endif
Abraços,

Rossine.

Posted: Tue Apr 17, 2007 8:28 pm
by Maurilio Viana
Beleza, Rossine.
Estou de mudança esta semana, tá uma correria, mas vou tentar testar à noite.

Obrigado!
Maurilio

Rossini

Posted: Wed Apr 18, 2007 11:49 am
by AOKISANTOS
Rossini, uso o fwh 7.01, estes problemas reportados tambem estao nessa versão ?

Te agradeço...

Aokisantos :oops:

Posted: Wed Apr 18, 2007 12:39 pm
by Rossine
Olá Aoki,

> Rossini, uso o fwh 7.01, estes problemas reportados tambem estao nessa versão ?

Eu uso a versão de nov/05 mas acredito que devam sim funcionar para sua versão. Faça as mudanças que citei acima e veja se vai resolver ok ?

Abraços,

Rossine.

Posted: Thu Apr 19, 2007 5:04 pm
by Antonio Linares
Rossine,

Many thanks! :-)

Posted: Thu Apr 19, 2007 6:07 pm
by Maurilio Viana
Rossine, tenho um xBrowse cujos dados vem de um array montados dinamicamente. Neste caso, quando as colunas ultrapassam a largura do browse e navego pra direita, quando deveria rolar para as colunas não visíveis ele não rola...
Vou ver se monto um exemplinho pra te demonstrar, o problema é que essa semana estou meio corrido, hehehehe
E aquele problema da navegação pra baixo não sarou ainda :-(

[ ]'s
Maurilio