Desde hace tiempo vengo usando una reforma que hice a la clase xBrowse para mostrar diferentes cursores ya sea si está en los heads, como si está en los campos. Se puede usar cursores con movimiento y los cursores a utilizar los tengo en mi archivo .RES.
Puede verse un video con lo comentado en:
http://youtu.be/IUlOxRGfjsY
Para lograrlo agregué a la clase un par de datas:
- Code: Select all Expand view
- ...
DATA nBottomMargin
DATA oMyCursor // by R. Cerella
DATA oMyCursorHead // by R. Cerella
// Earlier Group Header related DATA. Now Obsolete
DATA aHeaderTop,; // Array of header string Top
nHeader
...
Estas datas afectan y hay que reformar a los siguientes methods:
- Code: Select all Expand view
- METHOD VScroll( nWParam, nLParam ) CLASS TXBrowse
...
Eval( ::bSkip, ::VGetThumbPos( nPos ) - ::VGetPos() )
::KeyNo( ::VGetThumbPos( nPos ) )
// CursorArrow()
if ::oMyCursor<>NIL //::lCursor //
Cursor(::oMyCursor) //CursorArrow //
else // by R. Cerella
CursorArrow() //
endif //
...
- Code: Select all Expand view
- METHOD MouseMove( nRow, nCol, nKeyFlags ) CLASS TXBrowse
...
// ToolTip CELL
if nFor > 0 .and. nFor <= nLen
oCol := ::ColAtPos( nFor )
// CursorArrow()
if ::oMyCursorHead<>NIL // by R. Cerella
Cursor(::oMyCursorHead) //
else //
CursorArrow() //
endif //
if Empty( oCol:cToolTip )
::DestroyToolTip()
else
if ::oColToolTip == nil .or. ::oColToolTip:nCreationOrder != oCol:nCreationOrder
::DestroyToolTip()
::ShowToolTip( nRow,nCol, oCol:cToolTip )
::oColToolTip := oCol
endif
endif
return 0
elseif ::bDragBegin == nil .and. ( nFor := If( nRow > ::HeaderHeight(), ::MouseColPos( nCol ), 0 ) ) > 0
if nFor > 0 .and. nFor <= nLen
oCol := ::ColAtPos( ::MouseColPos( nCol ) )
// CursorArrow()
if ::oMyCursor<>NIL //::lCursor //
Cursor(::oMyCursor) //CursorArrow //
else // by R. Cerella
CursorArrow() //
endif //
if ::MouseColPos( nCol ) > 0
...
- Code: Select all Expand view
- METHOD Select( nOperation ) CLASS TXBrowse
...
if uOldRow != uCurRow
::aSelected := { Atail( ::aSelected ) }
if uCurRow > uOldRow
cursorwait()
do while ( uTemp := Eval( ::bBookMark ) ) != uBook .and. ! ::Eof()
If Ascan( ::aSelected, uTemp ) == 0
Aadd( ::aSelected, uTemp )
Endif
::Skip( 1 )
enddo
// CursorArrow()
if ::oMyCursor<>NIL //::lCursor //
Cursor(::oMyCursor) //CursorArrow //
else // by R. Cerella
CursorArrow() //
endif //
else
cursorwait()
do while ( uTemp := Eval( ::bBookMark ) ) != uBook .and. ! ::Bof()
If Ascan( ::aSelected, uTemp ) == 0
Aadd( ::aSelected, uTemp )
endif
::Skip( -1 )
enddo
// CursorArrow()
if ::oMyCursor<>NIL //::lCursor //
Cursor(::oMyCursor) //CursorArrow //
else // by R. Cerella
CursorArrow() //
endif //
endif
Aadd( ::aSelected, uBook )
...
case nOperation == 4 // Select all
uBook := Eval( ::bBookMark )
::aSelected := Array( ::KeyCount() )
nAt := 1
nLen := ::nLen
aTemp := ::aSelected
cursorwait()
Eval( ::bGotop )
do while nAt <= nLen //.and. !Eval( ::bEof )
aTemp[ nAt++ ] := Eval( ::bBookMark )
::Skip( 1 )
enddo
Eval( ::bBookMark, uBook )
// CursorArrow()
if ::oMyCursor<>NIL //::lCursor //
Cursor(::oMyCursor) //CursorArrow //
else // by R. Cerella
CursorArrow() //
endif //
// ::lRefreshOnlyData := .t.
::GetDC()
::Paint()
::ReleaseDC()
...
Luego, para indicar los cursores a utilizar:
- Code: Select all Expand view
- WITH OBJECT oBrw
...
:oMyCursor:="LAPIZ"
:oMyCursorHead:="HAND"
END
Espero sea de utilidad para alguien más.
Saludos.
Rolando