Sombrear linea cuando el mouse esta sobre ella

Sombrear linea cuando el mouse esta sobre ella

Postby FranciscoA » Sat Aug 03, 2013 8:53 pm

Amigos del foro,

Cual es la manera de sombrear una linea en XBrowse cuando el puntero del ratón está sobre ella?

Es decir, tenemos la linea actualmente seleccionada con sus colores respectivos, pero al mover el mouse queremos que la linea sobre la que pasa se pinte de un color diferente.

Alguien con un ejemplo?

Gracias.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Sombrear linea cuando el mouse esta sobre ella

Postby cnavarro » Sun Aug 04, 2013 2:53 pm

Francisco
Yo lo he intentado en varias ocasiones, sin exito
Debería ser tan sencillo como poner una funcion en la DATA OnMouseMove

Code: Select all  Expand view

    oBrw:OnMouseMove      := { | oB , nR, nC, nK | PintaOverLine( oB, nR, nC, nK ) }

    ... / ...
   oBrw:CreateFromCode()
Return oBrw

function PintaOverLine( oB, nR, nC, nK )
   local nOldRowPos := oB:nRowSel
   local nOldColPos := oB:nColSel
   local nMouseRow  := oB:MouseRowPos( nR )
   local nMouseCol  := oB:MouseColPos( nC )

//if !oB:lPressed .and. !oB:lCaptured
 //if nOldRowPos <> nMouseRow .and. nOldColPos <> nMouseCol   //No estoy en la misma posicion que la seleccionada
    oB:Descripcion:cFooter := Str(nMouseRow ,4 )+" / "+Str( nMouseCol, 4 )+" / "+;
                              Str( nOldRowPos , 4 )+" / "+Str( nOldColPos, 4 )
    oB:RefreshFooters()
 //endif
//endif

return .t.
 


Pero he podido comprobar que el MouseMove del Browse no ejecuta dicha DATA hasta que no pasas por el Header (cualquiera), lo que no deberia ser a mi modo de entender su comportamiento normal. Solo me actualiza cuando pasas por el Header. Por ese motivo no puedo saber la fila en la que se encuentra. SI actualiza el numero de columna al pasar por el header de las columnas.
Si actualizase la posicion correctamente al realizar el OVER del Browse no creo que costase mucho pintar la celda/linea por la que estuviera posicionado el mouse.
Lo he dejado pendiente, como otras cosas, hasta comprobar que cuando me actualice a la nueva version (uso actualmente FWH 12.03) sigue siendo el mismo comportamiento. De ser asi tendré que hacer una clase heredada de XBrowse y modificar el MouseMove para comprobarlo ya que yo tambien lo necesito.

Quizas otros compañeros o tu, tengan otras ideas que me hagan salir del error de esta apreciacion.
Saludos
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6527
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Sombrear linea cuando el mouse esta sobre ella

Postby FranciscoA » Mon Aug 05, 2013 12:51 am

Cristobal,

Yo también lo he intentado en algunas ocasiones, sin resultados. Hoy que tengo tiempo, he retomado el asunto, a ver que consigo. Te digo que solo había tratado de hacerlo utilizando unicamente las variables y/o funciones que tiene el xbrowse. Esta vez voy a intentar con una extension del method. Si lo logro, lo posteo.
Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Sombrear linea cuando el mouse esta sobre ella

Postby FranciscoA » Thu Aug 08, 2013 3:44 am

Cristobal y demas colegas en el foro.
Talvez algunos quieran probar, modificar y ayudar a terminar este codigo.

Code: Select all  Expand view
//TXBROWSE VERSION 1204

   DATA nOldRowMP  AS NUMERIC       // Old Row Mouse Pointer              //FranciscoA
   DATA bMMoved    INIT { || nil }  // Evaluate Block for Lines Colors    //FranciscoA


METHOD MouseMove( nRow, nCol, nKeyFlags ) CLASS TXBrowse

   local oCol
   local nLen, nFor, nPos
   local cTxt  // tooltip CELL
   local nVMove, nHMove, nOldRowPos,  nOldColPos
   local nMousePos := ::MouseRowPos( nRow )


   if ::bMMoved != nil                 //FranciscoA
     if nMousePos <> ::nOldRowMP       //FranciscoA
        Eval(::bMMoved, nRow, nCol)    //FranciscoA
        ::nOldRowMP := nMousePos       //FranciscoA
     endif                             //FranciscoA  
   endif                               //FranciscoA


   TrackMouseEvent( ::hWnd, TME_LEAVE )



METHOD New( oWnd ) CLASS TXBrowse

   ::nCaptured    := 0
   ::nLastEditCol := 0

   ::nOldRowMP    := 1       //FranciscoA
   ::bMMoved      := NIL     //FranciscoA

   ::nRowDividerStyle := LINESTYLE_NOLINES


//-------------------------
IN PRG

DEFINE DIALOG oDlg SIZE oVent:nWidth, oVent:nHeight TITLE "FapSoftScan" TRANSPARENT

@oDlg:nTop+10,200 SAY oSayPrueba VAR cSayPrueba OF oDlg PIXEL


@1,1 XBROWSE oBrw OF oDlg ;
     ARRAY {} CELL LINES FOOTERS AUTOSORT

     WITH OBJECT oBrw
     ...
     ...
     END

     oBrw:CreateFromCode()

     oBrw:bMMoved := {|nRow,nCol| ClrRowMouseOver(oBrw,nRow,nCol,oSayPrueba) }

ACTIVATE DIALOG oDlg
//-------------------------

//---------------------------------------
Function ClrRowMouseOver(oBrw,nRow,nCol,oSayPrueba)

local n, n1
local nRowMPos := oBrw:MouseRowPos(nRow)  //linea en que esta el mouse
local nDisplRows := oBrw:RowCount()       //lineas visibles en el xBrowse
local bClrStd := oBrw:bClrStd


for n := 1 to nDisplRows
   For n1 := 1 to len(oBrw:aCols)
     if n = nRowMPos
        oSayPrueba:SetText(Str(nRowMPos,4))
        oBrw:aCols[n1]:bClrStd := {|| { nRGB(0,0,0),nRGB(120,50,150)} }
     else
        oBrw:aCols[n1]:bClrStd := bClrStd
     endif
   Next
next
                                                                                             
Return nil
 

Saludos
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Sombrear linea cuando el mouse esta sobre ella

Postby FranciscoA » Mon Aug 19, 2013 10:07 pm

Cristobal,
Has intentado de nuevo?
Yo lo acabo de hacer funcionar... pero... solo en la primer pantalla del browse, basado en la primera columna que contiene el numero de linea. Es decir, si sobre-paso las lineas maximas del browse, al hacer bChange, ya no funciona.
Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Sombrear linea cuando el mouse esta sobre ella

Postby cnavarro » Mon Aug 19, 2013 10:17 pm

Francisco
Lo estoy intentando implementar en el ejemplo que he puesto en el otro post
A traves del metodo HandleEvent siguiendo el mismo proceso que usa la clase TButtonBmp cuando pasas el cursor encima de un boton
Has usado el bMMoved?
Saludos y gracias por tu mensaje en el otro post
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6527
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Sombrear linea cuando el mouse esta sobre ella

Postby FranciscoA » Mon Aug 19, 2013 10:26 pm

cnavarro wrote:Francisco
Has usado el bMMoved?


Sí, lo estoy usando en las pruebas, como lo puedes ver mas arriba. Es algo que he implementado en una copia del TXbrowse para probar.
Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Sombrear linea cuando el mouse esta sobre ella

Postby cnavarro » Mon Aug 19, 2013 10:32 pm

FranciscoA wrote:
cnavarro wrote:Francisco
Has usado el bMMoved?


Sí, lo estoy usando en las pruebas, como lo puedes ver mas arriba. Es algo que he implementado en una copia del TXbrowse para probar.
Saludos.


Estuve mirando y probando tu aporte pero no consegui que funcionase correctamente
Por eso mi pregunta, si habias seguido el mismo camino o habias probado otras vias.
Saludos
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6527
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Sombrear linea cuando el mouse esta sobre ella

Postby benjiben143 » Thu Aug 22, 2013 9:10 pm

hola wenas tardes

checando el código, le meti unas funciones
y ya se va cambiando de color dependiendo del renglón que se posiciona el mouse,, faltaría validar de que colores es el comienzo y que color va cambiando
ya para una matriz faltaría validar un poquito mas pero es un buen seguimiento del primer código que pusieron

saludos
Code: Select all  Expand view
static bXBrowse, pirrin, csayprueba, osayprueba, cwsayprueba, owsayprueba

function main()
local odlg
local obrw
//local osayprueba
//local csayprueba:=12
local aare:={"escuela","trabajo","salud","dinero","amor"}
csayprueba:="qqq"
cwsayprueba:="qddd"
pirrin:=0

DEFINE DIALOG oDlg SIZE 520,380 title "FapSoftScan"

@ 3,18 SAY oSayPrueba VAR cSayPrueba OF oDlg size 80,20
@ 4,18 SAY owSayPrueba VAR cwSayPrueba OF oDlg size 80,20


 @ 0,0 xBrowse oBrw OF odlg ARRAY aare
 

     oBrw:CreateFromCode()

     oBrw:bMMoved := {|nRow,nCol| ClrRowMouseOver(oBrw,nRow,nCol) }

ACTIVATE DIALOG oDlg
//-------------------------
Return nil
 



Code: Select all  Expand view
//---------------------------------------
Function ClrRowMouseOver(oBrw,nRow,nCol)

local n, n1
local nRowMPos := oBrw:MouseRowPos(nRow)  //linea en que esta el mouse
local nDisplRows := oBrw:RowCount()       //lineas visibles en el xBrowse
local bClrStd := oBrw:bClrStd, aa:=1

pirrin:=0  
if nrowmpos>0
    oBrw:aCols[1]:bClrStd :={|| { colorin1( nRowMPos),colorin2( nRowMPos)} }
endif

 obrw:refresh()                                                                                        
Return nil



function colorin1(xren)
pirrin++
if pirrin>=6
   pirrin:=1
endif
if pirrin=xren
 //  csayprueba:="cunplio"+str(xren)+"/"+str(pirrin)
 //  osayprueba:refresh()

   return  RGB(193,221,255)
endif
//csayprueba:="nolcump"+str(xren)+"/"+str(pirrin)
//osayprueba:refresh()


return RGB(193,150,170)


function colorin2(xren)

if pirrin=xren
  // cwsayprueba:="cumplio"+str(xren)+"/"+str(pirrin)
  // owsayprueba:refresh()

   if pirrin>=5  // aqui va cuantos renglones son en total
      pirrin:=0
   endif
   
   return  RGB(120,50,150)
endif

//cwsayprueba:="nelpaste"+str(xren)+"/"+str(pirrin)
//owsayprueba:refresh()

return RGB(183,120,125)

 
Benjamin Casarrubias Moreno
Cd. Obregon, Sonora, Mexico
chino72vale@hotmail.com
Fivewin 16.05, Harbour 3.2, xharbour 1.2.1, Fivelinux, visual estudio 2013
benjiben143
 
Posts: 116
Joined: Wed Mar 11, 2009 7:32 pm
Location: Obregon, Sonora, Mexico

Re: Sombrear linea cuando el mouse esta sobre ella

Postby FranciscoA » Fri Aug 23, 2013 2:52 am

benjiben,
Gracias por tu interés.
Aqui dejo un ejemplo funcional sobre el avance que he logrado hasta el momento.
Talvez el resto de colegas quiera colaborar en perfeccionarlo. Recuerden hacer las pequeñas modificaciones a Class TxBrowse expuestas mas arriba.
Code: Select all  Expand view
//PROBANDO
//-----------------------Pruebas Clr Row when mouse over
Function ClrRowMOver()
local oDlg, oBrw, oCbx, oBt2
local nWidthRes := GetSysMetrics(SM_CXSCREEN)  
local nHeightRes := GetSysMetrics(SM_CYSCREEN)
local aInfo:={}, aTitCols:={}, aWMIscan, bMonitoring
local cVar, nPos:=1, n, oSayPrueba,cSayPrueba:=" "

local nFONDO1 := RGB(215, 215, 215)
local nFONDO2 := RGB(235, 235, 235)
local nAZUL   := RGB( 0, 0, 128)

local oLoc, oWMI

TRY
   oLoc:= CreateObject( "wbemScripting.SwbemLocator" )
CATCH
   MsgStop("No se pudo crear objeto 'wbemScripting.SwbemLocator'","Alto")
   Quit
END

TRY
   oWMI := oLoc:ConnectServer()
CATCH
   MsgStop("No se pudo conectar a WMI","Alto")
   Quit
END

bMonitoring := {|| aWMIscan:=Monitoring(oWMI,18) ,;
                   aInfo:=aWMIscan[1], aTitCols:=aWMIscan[2],;
                   oBrw:SetArray(aInfo,.t.,1,.t.),;
                   oBrw:cHeaders := aTitCols, ;
                   oBrw:nHeadStrAligns := AL_CENTER, ;  
                   AEval(oBrw:aCols,{|o,n,oCol|  if(ValType(o:Value) =="N", o:nWidth := Max( 40, oBrw:aCols[n]:HeaderWidth() ), o:nWidth:=160) }),;
                   oBrw:nColSel := 1, oBrw:Refresh(.t.),;
                   oBrw:SetFocus() }


DEFINE DIALOG oDlg SIZE nWidthRes-100, nHeightRes-100 TITLE "FapSoftScan" TRANSPARENT

@oDlg:nTop+5,200 SAY oSayPrueba VAR cSayPrueba OF oDlg SIZE 100,20 PIXEL

@1,1 XBROWSE oBrw OF oDlg ;
     ARRAY {} CELL LINES FOOTERS AUTOSORT

   WITH OBJECT oBrw
      :l2007            := .f.
      :nRecSelColor     :=  nFONDO1
      :nStyle           := nAnd( :nStyle, nNot( WS_BORDER ) )
      :nMarqueeStyle    := MARQSTYLE_HIGHLROW   //ilumina toda la linea
      :bClrHeader       := {|| { nAZUL, nFONDO1, } }
      :bClrFooter       := :bClrHeader         // Colores texto de footers
      :bClrStd          := {|| IF( oBrw:nArrayAt() % 2 == 0, {nAZUL, nFONDO1}, {nAZUL, nFONDO2} ) }  
      :bClrSel          := {|| { nAZUL, CLR_WHITE } }  // para barra de linea selecc cuando el control no tiene el foco
      :bClrSelFocus     := { || { CLR_WHITE, nAZUL } }     // para barra de linea selecc cuando el control tiene el foco
      :lKinetic         := .f.
      :lContrastClr     := .f.  //para que no cambie color de texto automaticamente segun intensidad del fondo
      :nRowHeight       := 20
      :nHeaderHeight    := 34
      :nColDividerStyle := LINESTYLE_LIGHTGRAY
      :nRowDividerStyle := LINESTYLE_LIGHTGRAY
   END
 
   oBrw:CreateFromCode()

   Eval(bMonitoring)

   oBrw:bMMoved := {|nRow,nCol| ClrRowMouseOver(oBrw,nRow,nCol,oSayPrueba) }

 @ oDlg:nTop+245,380 BUTTONBMP oBt2 PROMPT "Salir/Cancelar" OF oDlg ;
                    SIZE 60, 12  PIXEL ;
                    BITMAP "SALIR16x16" TEXTRIGHT ;
                    ACTION oDlg:End()
 
 ACTIVATE DIALOG oDlg CENTERED ;
   ON INIT ( oBrw:nHeight:=oDlg:nHeight-118, oBrw:nWidth:=oDlg:nWidth-34, oBrw:nTop:=oDlg:nTop+50 ,;
             oBrw:SetFocus() )

Return nil

//-------------------------------------------------------------
Function Monitoring(oWMI)
local oPC, oQry
local aInfo:={}, aTitCols, n,nLen

   oQry := oWMI:ExecQuery( "Select * FROM Win32_LogicalProgramGroup" )
   aTitCols:= {"Caption","Description","GroupName","Name","UserName","InstallDate","Status"}
   for each oPC in oQry
      aadd(aInfo, {oPC:Caption, oPC:Description, oPC:GroupName, oPC:Name, oPc:UserName, oPc:InstallDate, oPc:Status} )
   next

   //Agregar columna para numerar consecutivo
   Aadd(aTitCols,nil)
   AIns(aTitCols,1)
   aTitCols[1]:="No. "
   For n := 1 to len(aInfo)
      Aadd(aInfo[n],nil)
      AIns(aInfo[n],1)
      aInfo[n,1] := n
   Next

RETURN {aInfo,aTitCols}

//---------------------------------------
Function ClrRowMouseOver(oBrw,nRow,nCol,oSayPrueba)
local n
local nRowMPos := oBrw:MouseRowPos(nRow)  //linea en que esta el mouse en display actual
local bClrStd := oBrw:bClrStd
local oCol

oSayPrueba:SetText("Lin: "+Str(nRowMPos,4))


if nRowMPos > 0
  For n := 1 to len(oBrw:aCols)
     oCol:= oBrw:aCols[n]
     oCol:bClrStd := CellClrMOver( oCol, nRowMPos, bClrStd, oBrw )
  Next
  oBrw:Refresh()
endif
Return nil

//------------------------------------
STATIC function CellClrMOver( oCol, nRowMPos, bClrStd, oBrw )
local nRow

RETURN { || nRow := oBrw:aCols[1]:Value ,;
            If( nRow == nRowMPos ,;
              { CLR_BLUE, CLR_YELLOW }, Eval(bClrStd) ) }

 

Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 24 guests