Page 2 of 2

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Wed Sep 03, 2014 11:58 am
by mastintin
Antonio Linares wrote:Manuel,
Dices que la barra de scroll no devuelve correctamente la posición, como lo has comprobado ?

Algo raro tenia en el codigo, ahora parece que lo devuelve bien
----------- editado -------------
en un posterior post indico cuando lo devuelve mal ....( al cambiar el tamaño del boton de scroll )
Code: Select all  Expand view

function SetScrollBar()

   local oVScroll
   local nPageZugabe :=0
   if ! Empty( oEr:oMainWnd:oWndClient:oVScroll )
      oEr:oMainWnd:oWndClient:oVScroll:SetRange( 0,100  )
      oEr:oMainWnd:oWndClient:oVScroll:bGoUp     =  {|| ScrollV( )   }
      oEr:oMainWnd:oWndClient:oVScroll:bPageUp   = {|| ScrollV()   }
      oEr:oMainWnd:oWndClient:oVScroll:bGoDown   = {||  ScrollV( )  }
      oEr:oMainWnd:oWndClient:oVScroll:bPageDown = {|| ScrollV( ) }
      oEr:oMainWnd:oWndClient:oVScroll:nPgStep   =  10

      oEr:oMainWnd:oWndClient:oVScroll:bPos      = {| nWert | .t.  }

      oEr:oMainWnd:oWndClient:oVScroll:SetPos( 0 )

    endif
    ........

   
 function ScrollV( lUp, lDown, lPageUp, lPageDown, lPos, nPosZugabe )
    LOCAL nDifPos

    msginfo(oEr:oMainWnd:oWndClient:oVScroll:GetPos() )

return .T.

 

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Wed Sep 03, 2014 12:37 pm
by mastintin
Mas sobre el asunto ....
Aqui aparece el problema ...
Si lanzamos esto , inicialmente el botón del scroll aparece pequeño y devuelve bien en que posición se encuentra el scroll si hago que nPixScroll := 0 ( no se mueven las ventanas ) el comportamiento del scroll es normal , si coloco nPixScroll := 1 ( movería las ventanas un pixel ) entonces el botón se vuelve grande y a partir de ese momento nPos siempre tiene valor 1 ( como si no avanzara )
Code: Select all  Expand view



 function ScrollV(  )
    LOCAL nDifPos := 0
    LOCAL nPos:= 0
    LOCAL nPixScroll

    nPos := oEr:oMainWnd:oWndClient:oVScroll:GetPos()
    msginfo(nPos)

    nPixScroll := 1

     for i := 1 to 100
      if aWnd[ i ] <> nil
         aWnd[ i ]:Move( aWnd[ i ]:nTop + nPixScroll, aWnd[ i ]:nLeft, 0, 0, .T. )
      endif
   next



return .T.
 


La idea de codigo era la siguiente :
Code: Select all  Expand view


 function ScrollV(  )
    LOCAL nDifPos := 0
    LOCAL nPos:= 0
    LOCAL nPixScroll


    nPos := oEr:oMainWnd:oWndClient:oVScroll:GetPos()
    nDifPos := nPosV - nPos
    nPosV:= nPos

    nPixScroll := nDifPos * (   nTotalHeight ) /100  // ojo con los decimales que hace que se solapen ventanas ....

     for i := 1 to 100
      if aWnd[ i ] <> nil

         aWnd[ i ]:Move( aWnd[ i ]:nTop + nPixScroll, aWnd[ i ]:nLeft, 0, 0, .T. )

      endif
   next



return .T.


 

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Thu Sep 04, 2014 2:30 pm
by mastintin
Por si a alguien le vale ... ntotalHeight no es un valor en pixeles tal cual pues su valor se multiplica segun el tipo de medida que usamos mm-> *3 ..
Esto `puede hacer que algunos de los calculos no funcionen como esperabamos .

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Thu Sep 04, 2014 6:06 pm
by mastintin
Este principio de codigo pare e que funciona mas o menos , falta pulirlo y hacer el desplazamiento arrastrando el scroll ....
Code: Select all  Expand view


  function ScrollV( lUp,lDown, lpageUP,lpageDown , lpos,nPos )
    local i, aFirstWndCoors, nAltWert
    LOCAL nPixScroll
    local aCliRect    := oEr:oMainWnd:GetCliRect()

  DEFAULT lDown     := .F.
  DEFAULT lUp       := .F.
  DEFAULT lPageUp   := .F.
  DEFAULT lPageDown := .F.
  DEFAULT lPos      := .F.

    UnSelectAll()

   for i := 1 to 100
      if aWnd[ i ] <> nil
         aFirstWndCoors := GetCoors( aWnd[ i ]:hWnd )
         EXIT
      endif
   next

     IF lup
        nPixScroll := 20
     ENDIF
     IF lPageUp
        nPixScroll := 200
     endif
     IF lup .OR. lPageup
         if aFirstWndCoors[ 1 ] = 0
           nPixScroll := 0
        elseif aFirstWndCoors[ 1 ] + nPixScroll >= 0
           nPixScroll     := -1 * aFirstWndCoors[ 1 ]
        endif

    ENDIF

    IF lDown
        nPixScroll := -20
    ENDIF
     IF lPageDown
        nPixScroll := -200
     endif

     if lDown = .T. .OR. lPageDown = .T.
          if  (-1*aFirstWndCoors[ 1 ] ) >=  ( nTotalHeight  )
              nPixScroll     := 0
          endif
   endif

   if lPos = .T.
      /*
      msginfo(  aFirstWndCoors[ 1 ] )
      nPixScroll := nPos * 10
        msginfo(Str(npixScroll)+"pix")
         IF nPixScroll > aFirstWndCoors[ 1 ]
               nPixScroll := 0
         ELSE
            IF nPixScroll < nTotalHeight - (-1*aFirstWndCoors[ 1 ] )
                nPixScroll := 0
             endif

          endif
      */

   endif


    ScrollWindow( oEr:oMainWnd:oWndClient:hWnd, 0, nPixScroll, 0, GetClientRect( oEr:oMainWnd:oWndClient:hWnd ) )
    oEr:oMainWnd:oWndClient:refresh()


return .T.

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Fri Sep 05, 2014 9:37 am
by mastintin
Parece que lo he conseguido .... :D :roll: :mrgreen: ( afalta de afinar un poco mas )
No subo los cambios al repositorio para probarlo bien antes, pero dejo aqui todo el código y espero vuestro feedback ...
1.- he creado una clase derivada de scrollbar ( colocada al final del archivo ereport.prg ) ....
Code: Select all  Expand view


#define SB_HORZ         0
#define SB_VERT         1
#define SB_CTL          2


CLASS ER_ScrollBar FROM  TScrollBar

   DATA   nPrevPos

   METHOD SetPos( nPos ) INLINE ;
                 ::nPrevPos:= ::GetPos() ,;
                 SetScrollPos( if( ::lIsChild, ::oWnd:hWnd, ::hWnd ),;
                 If( ::lIsChild, If( ::lVertical, SB_VERT, SB_HORZ ), SB_CTL ),;
                 nPos, ::lReDraw )

ENDCLASS

 


2.- cambio en ER_MouseWheel ..
Code: Select all  Expand view


function ER_MouseWheel( nKey, nDelta, nXPos, nYPos )

   local aPoint := { nYPos, nXPos }

   ScreenToClient( oEr:oMainWnd:oWndClient:hWnd, aPoint )
   lScrollVert  := .T.
   if IsOverWnd( oEr:oMainWnd:oWndClient:hWnd, aPoint[ 1 ], aPoint[ 2 ] )
 
      if lAnd( nKey, MK_MBUTTON )
         if nDelta > 0
            ScrollV(-4, .t.)
         else
            ScrollV(4,,.t.)
         endif
      else
         if nDelta > 0
            ScrollV( - WheelScroll() , .T.,, .T. )
         else
            ScrollV( WheelScroll() ,,.T.,.T. )
         endif
      endif

   endif

return .T.

 


3.- cambio en SetScrollBar()
Code: Select all  Expand view

 function SetScrollBar()

   //local oVScroll
   local nPageZugabe //:= 392/100
   local oWnd        := oEr:oMainWnd:oWndClient

   if !Empty( oWnd:oVScroll )
 
      oWnd:oVScroll := ER_ScrollBar():WinNew(0,100,10,.T., oWnd )

      oWnd:oVScroll:bGoUp     = { ||  ScrollV(-1 )  }
      oWnd:oVScroll:bGoDown   = { || ScrollV(1) }
      oWnd:oVScroll:bPageUp   = { ||  ScrollV(-4)  }
      oWnd:oVScroll:bPageDown = { || ScrollV(4 ) }
      oWnd:oVScroll:bPos      = { | nWert | ScrollV(nWert )  }
      oWnd:oVScroll:nPgStep   = 10

      oWnd:oVScroll:SetPos( 0 )

 ENDIF

   if ! Empty( oWnd:oHScroll )
      nPageZugabe := 602/100
      oWnd:oHScroll:SetRange( 0, nTotalWidth / 100 )

      oWnd:oHScroll:bGoUp     = {|| ScrollHorizont( .T. ) }
      oWnd:oHScroll:bGoDown   = {|| ScrollHorizont( , .T. ) }
      oWnd:oHScroll:bPageUp   = {|| ScrollHorizont( ,, .T. ) }
      oWnd:oHScroll:bPageDown = {|| ScrollHorizont( ,,, .T. ) }
      oWnd:oHScroll:bPos      = {| nWert | ScrollHorizont( ,,,, .T., nWert/100 ) }
      oWnd:oHScroll:nPgStep   = nPageZugabe  //602

      oWnd:oHScroll:SetPos( 0 )
   endif


return .T.
 


4.- añadida funcion ScrollV() que sustituye a scrollVertical() ( de momento comentada )
Code: Select all  Expand view


function ScrollV( nPosZugabe, lUp, lDown, lPos )
   local i, aFirstWndCoors, nAltWert
    local nZugabe     := 14
   local nPageZugabe := 392
   local aCliRect    := oEr:oMainWnd:GetCliRect()
   local lReticule
   LOCAL oVScroll := oEr:oMainWnd:oWndClient:oVScroll

   DEFAULT lUp       := .F.
   DEFAULT lDown     := .F.
   DEFAULT lPos      := .F.

   UnSelectAll()

    for i := 1 to 100
      if aWnd[ i ] <> nil
         aFirstWndCoors := GetCoors( aWnd[ i ]:hWnd )
         EXIT
      endif
   next

   if lUp
      if aFirstWndCoors[ 1 ] = 0
         nZugabe := 0
      elseif aFirstWndCoors[ 1 ] + IIF( lUp, nZugabe, nPageZugabe ) >= 0
         nZugabe     := -1 * aFirstWndCoors[ 1 ]
         nPageZugabe := -1 * aFirstWndCoors[ 1 ]
      endif
   endif

   if lDown
      if aFirstWndCoors[ 1 ] + (nTotalHeight) <= aCliRect[3] - 80
         nZugabe     := 0
         nPageZugabe := 0
      endif
   endif


   lReticule = oGenVar:lShowReticule
   oGenVar:lShowReticule = .F.
   SetReticule( 0, 0 ) // turn off the rulers lines


   nAltWert := IF ( lPos, oVScroll:GetPos(), oVScroll:nPrevPos )

   oVScroll:SetPos( nPosZugabe )
   nZugabe := nTotalHeight * ( oVScroll:GetPos() - nAltWert ) / ( (nTotalHeight) / 100 )

   for i := 1 to 100
      if aWnd[ i ] <> nil
         aWnd[ i ]:Move( aWnd[ i ]:nTop - Int(nZugabe/10), aWnd[ i ]:nLeft, 0, 0, .T. )
      endif
   next

   oGenVar:lShowReticule = lReticule

return .T.
 

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Fri Sep 05, 2014 12:14 pm
by Antonio Linares
Manuel,

Por favor súbelo directamente al repositorio y lo probamos facilmente :-)

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Fri Sep 05, 2014 4:15 pm
by mastintin
Subido al repositorio.

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Sat Sep 06, 2014 4:46 pm
by jcaro
Hola Manuel:

Primero gracias a ti y los demas colegas del foro, por el trabajo que estan haciendo, se ve excelente.

Me gustaria probarlo, donde bajo tu repositorio, me puedes poner aqui el ultimo link , con estos cambios, pues con el
monton de cambios que estan haciendo, es re-facil perderse :oops: .

Saludos,

Juan

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Sat Sep 06, 2014 5:50 pm
by cnavarro

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Sat Sep 06, 2014 6:02 pm
by cnavarro
Creo que es importante modificar en la creacion de las ventanas "hijas" lo siguiente:

Code: Select all  Expand view

aWnd[ nWnd ] = ER_MdiChild():New( nTop, 0, nTop + nHeight + nAreaZugabe,;
                            nWidth, cTitle, nOr( WS_BORDER ),, oEr:oMainWnd,, .T.,,,,;
                            oGenVar:oAreaBrush, .T. )
 


por

Code: Select all  Expand view

aWnd[ nWnd ] = ER_MdiChild():New( nTop, 0, nHeight + nAreaZugabe,;
                            nWidth, cTitle, nOr( WS_BORDER ),, oEr:oMainWnd,, .T.,,,,;
                            oGenVar:oAreaBrush, .T. )
 


Eso permite ajustar mejor la longitud total de las ventanas hijas

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Sat Sep 06, 2014 6:17 pm
by jcaro
Hola Cristobal , gracias por responder:

Lo que pasa es que al ver el repositorio, sale con una fecha del 2014-08-06 ( easyreport.zip )

Esto me confunde, pues no se supone que si actualizan algun prg, tambien deberia modificarse la fecha del archivo exterior ?

O los cambios quedan grabados en el ( Download repository ) y no se ven externamente las fechas de los ultimos cambios ?

Como puedo estar seguro que estoy usando la ultima actualizacion de los programas.

Por eso mi consulta y duda de cual archivo bajar.


Saludos,
Juan

PD: envie la misma respuesta, pero no se donde se fue, si aparece 2 veces, borren una porfis.

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Sat Sep 06, 2014 7:36 pm
by cnavarro
Juan, en Descargas, selecciona "Download repository"
Obtendrás en zip, los ficheros del repositorio
Aunque te aconsejo que instales Git para realizar actualizaciones de una forma sencilla

Re: La rueda del ratón debe mover todo el reporte arriba y abajo

PostPosted: Sun Sep 07, 2014 4:30 pm
by jcaro
Gracias Cristobal, lo voy a realizar de esa manera.

Saludos,