FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Sombrear linea cuando el mouse esta sobre ella
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Sombrear linea cuando el mouse esta sobre ella
Posted: Sat Aug 03, 2013 08: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
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Sombrear linea cuando el mouse esta sobre ella
Posted: Sun Aug 04, 2013 02: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 (fw): Select all Collapse
    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
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: Sombrear linea cuando el mouse esta sobre ella
Posted: 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
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: Sombrear linea cuando el mouse esta sobre ella
Posted: Thu Aug 08, 2013 03:44 AM
Cristobal y demas colegas en el foro.
Talvez algunos quieran probar, modificar y ayudar a terminar este codigo.

Code (fw): Select all Collapse
//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
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: Sombrear linea cuando el mouse esta sobre ella
Posted: 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
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Sombrear linea cuando el mouse esta sobre ella
Posted: 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
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: Sombrear linea cuando el mouse esta sobre ella
Posted: 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
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Sombrear linea cuando el mouse esta sobre ella
Posted: 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
Posts: 120
Joined: Wed Mar 11, 2009 07:32 PM
Re: Sombrear linea cuando el mouse esta sobre ella
Posted: Thu Aug 22, 2013 09: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 (fw): Select all Collapse
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 (fw): Select all Collapse
//---------------------------------------
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. Obregón, Sonora, México
chino72vale@hotmail.com
Fivewin 24.04, Harbour 3.3, xharbour 1.2.1, Fivelinux, Visual Estudio 2022
Oracle Api Rest, SDK Contpaq, Facturación Electrónica, XML DIOT 2025
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: Sombrear linea cuando el mouse esta sobre ella
Posted: Fri Aug 23, 2013 02: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 (fw): Select all Collapse
//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

Continue the discussion