Page 1 of 1

xBrowse Button del GET

Posted: Mon Sep 29, 2008 3:00 am
by Daniel Garcia-Gil
recientemente me encontre con la necesidad de cambiar la imagen del boton del get en el xbrowse y me resulto un trabajo un poco complicado darme cuenta que tenia que primero generar el "DIALOG" o "WINDOW" para poder hacer el cambio de la imagen, que inicialmente es un boton muy pequeño con tres puntos "..."
Image

De esta forma hacia el cambio de imagen pero lo que me pasaba era que tenia el mismo ancho de la imagen al boton de tres puntos
activate dialog aWnd[ 2 ] nowait ;
on init ( aWnd[ 2 ]:move( 0,0 ) , ;
oBrw:aCols[ 3 ]:oBtnElip:cCaption:="",;
oBrw:aCols[ 3 ]:oBtnElip:LoadBitMaps("busca") ) ;
VALID ( !GETKEYSTATE( VK_ESCAPE ) )
Image

encontre pocas personas que tenian ese problema pero no se si lograron una solucion asi que me puse a trabajar y modificar la clase xbrowse a mi necesidad y esto fue lo que hice al final.
no se si sea la forma correcta pero me dio los resultados que quiero... hasta los momentos

1ro. cree una nueva DATA para las COLUMNS
DATA nBtnBmp AS NUMERIC INIT 0
con esta voy a indicar en que posicion de la matriz de oBrw:oCols:aBitmaps esta la imagen que quiero mostrar... para cargar la imagen a oBrw:oCols:aBitmaps se pueden usar los METODOS
METHOD AddResource( cRes ) // Adds a new bitmap to the ::aBitmaps array giving his resource name
METHOD AddBmpFile( cFile ) // Adds a new bitmap to the ::aBitmaps array giving his file name
METHOD AddBmpHandle( hBmp ) // Adds a new bitmap to the ::aBitmaps array giving his bitmap handle

2do. el problema era el tamaño, aqui hay varias cosas, cree una nueva variable local en el metodo METHOD PaintData
local nBtnWidth := 0, esta variable contiene el ancho de la imagen contenida en ::aBitmaps
agrege y cambie una lineas en el mismo metodo

if nType > 1
if ::nBtnBmp > 0 .and. len( ::aBitmaps ) >= ::nBtnBmp
nBtnWidth := ::aBitMaps[ ::nBtnBmp, BITMAP_WIDTH ]
else
nBtnWidth := 10
endif


nButtonRow := nRow
nButtonCol := nCol + nWidth - nBtnWidth
nWidth -= ( nBtnWidth + 5 )
.
.
.
.


if nType > 1
if lSelected
WndBoxRaised(hDC, nButtonRow -1 , nButtonCol - 1,;
nButtonRow + nHeight, nButtonCol + nBtnWidth + 1 )

if nType == EDIT_LISTBOX .or. nType == EDIT_GET_LISTBOX
::oBtnElip:Hide()
::oBtnList:Move( nButtonRow, nButtonCol, nBtnWidth + 1, nHeight, .f.)
::oBtnList:Show()
::oBtnList:GetDC()
FillRect( hDC, {nButtonRow, nButtonCol, nButtonRow + nHeight , nButtonCol + nBtnWidth + 1 },;
::oBtnList:oBrush:hBrush )
::oBtnList:Paint()
::oBtnList:ReleaseDC()
else
::oBtnList:Hide()
::oBtnElip:Move( nButtonRow, nButtonCol, nBtnWidth + 1, nHeight, .f.)
::oBtnElip:Show()
::oBtnElip:GetDC()
FillRect( hDC, {nButtonRow, nButtonCol, nButtonRow + nHeight , nButtonCol + nBtnWidth + 1 },;
::oBtnElip:oBrush:hBrush )
::oBtnElip:Paint()
::oBtnElip:ReleaseDC()
endif
endif

3ro. en el metodo.
METHOD CreateButtons() agrege una lineas mas después de la creacion de botones
if ::nBtnBmp > 0 .and. !empty( ::aBitMaps )
if ::nBtnBmp > len( ::aBitMaps )
::nBtnBmp := len( ::aBitMaps )
endif
::ChangeBitMap( )
endif

::oBtnList:Hide()
::oBtnElip:Hide()

4to. cree un nuevo metodo

METHOD ChangeBitmap( ) CLASS TXBrwColumn

if ::nBtnBmp > 0 .and. len( ::aBitmaps ) >= ::nBtnBmp
::oBtnElip:hBitmap1 := ::aBitMaps[::nBtnBmp, BITMAP_HANDLE ]
::oBtnList:hBitmap1 := ::aBitMaps[::nBtnBmp, BITMAP_HANDLE ]
::oBtnElip:cCaption := ""
else
::oBtnElip:hBitmap1 := 0
::oBtnList:hBitmap1 := 0
::oBtnElip:cCaption := "..."
endif

::oBrw:refresh()

return nil


y ahora puedo cambiar las imagenes de los botones dinamicamente
//********

#include "FiveWin.ch"
#include "xbrowse.ch"

function Test()

local oDlg, oBrw
local aArray := {}
local aList := {"1","2","3","4"}
local nI

for nI = 1 to 20
aadd( aArray, { "Fila:"+StrZero(nI,2)+" Col:01",;
"Fila:"+StrZero(nI,2)+" Col:02",;
"Fila:"+StrZero(nI,2)+" Col:03",;
"Fila:"+StrZero(nI,2)+" Col:04",;
"Fila:"+StrZero(nI,2)+" Col:05",;
"Fila:"+StrZero(nI,2)+" Col:06" } )
next

DEFINE DIALOG oDlg Title "Test de Botones en xBrowse " size 700,300

oBrw:= txbrowse():new( oDlg )
oBrw:nRowHeight := 25
oBrw:nColDividerStyle := LINESTYLE_BLACK
oBrw:nRowDividerStyle := LINESTYLE_BLACK
oBrw:SetArray( aArray )
oBrw:CreateFromCode()

oBrw:aCols[ 2 ]:AddBmpFile("C:\FWH\BITMAPS\16x16\closeall.bmp")
oBrw:aCols[ 2 ]:AddResource("find")
oBrw:aCols[ 2 ]:AddResource("cancel")
oBrw:aCols[ 2 ]:AddResource("exit")
oBrw:aCols[ 2 ]:nEditType( EDIT_GET_BUTTON )
oBrw:aCols[ 2 ]:nBtnBmp := 1
oBrw:aCols[ 2 ]:bEditBlock := {|| msginfo( "Imagen"+strzero( oBrw:aCols[ 2 ]:nBtnBmp, 2 ) ) }


oBrw:aCols[ 3 ]:nEditType( EDIT_GET_LISTBOX )
oBrw:aCols[ 3 ]:aEditListTxt := aList
oBrw:aCols[ 3 ]:bOnPostEdit := {|o,x,k| oBrw:aCols[ 2 ]:nBtnBmp := x , ;
oBrw:aCols[ 2 ]:ChangeBitMap() }

ACTIVATE DIALOG oDlg center;
ON INIT ( oDlg:oClient := oBrw, ;
oDlg:ReSize() )

return nil

PRUEBA 1
Image

PRUEBA 2
Image

PRUEBA 3
Image

igualmente se puede cambiar la flecha del los LISTBOX usando la misma forma.

si existe una forma mas facil por favor quiero saberla, igual esto me ayudo a entender un poco mas la xbrowse e igual espero que a alguien le sirva

Posted: Mon Sep 29, 2008 8:16 am
by Antonio Linares
Daniel,

Muchas gracias por esta aportación tan interesante! :-)

Posted: Mon Sep 29, 2008 6:21 pm
by Daniel Garcia-Gil
Antonio Linares wrote:Daniel,

Muchas gracias por esta aportación tan interesante! :-)
antonio gracias a ti por el interes... realmente no se si era la mejor forma de resolverlo, o si utilice de forma debida las variables y metodos de la clase, o si existe otra forma de hacerlo, o si crea un presendente para un aporte sustantivo, el proposito inical fue quitarme la piedra del zapato y aprender un poco mas de la clase.
Yo solo espero que este pequeño cambio no solo me sirva a mi sino a otras personas

Posted: Wed Oct 01, 2008 6:31 am
by Carles
Daniel,

Me gusta :lol:


Gracies.

Que bien

Posted: Sun Oct 19, 2008 4:09 am
by AIDA
Que bien eso lo queria hacer y no encontraba como :(

gracias por el dato :D


Saluditos

Aida :wink:

Posted: Mon Dec 01, 2008 9:42 am
by Silvio
can I have the class with these modifies at mio correo?

gracias

Posted: Mon Dec 01, 2008 1:06 pm
by Daniel Garcia-Gil
check you email... :D

Posted: Mon Dec 01, 2008 2:06 pm
by FranciscoA
Mcfox:
Puedes enviarme la classe modificada a mi corre f.alegria.p@Gmail.com?

Posted: Mon Dec 01, 2008 3:18 pm
by joseluisysturiz
FranciscoA wrote:Mcfox:
Puedes enviarme la classe modificada a mi corre f.alegria.p@Gmail.com?
Estoy usando la clase de MCFOX, imagino le ha hecho algunos _, te envie hasta donde estoy actualizado, incluyendo estos que publica.espero te sirva...saludos... :shock:

Posted: Mon Dec 01, 2008 3:19 pm
by Antonio Linares
Joe Luis, Francisco,

Le hemos enviado la version mas reciente de xbrowse a Daniel para que la modifique y la pruebe y asi usemos todos la version mas reciente :-)

Posted: Mon Dec 01, 2008 10:10 pm
by FranciscoA
José Luis, Antonio... Gracias.

Posted: Tue Dec 02, 2008 2:32 am
by joseluisysturiz
Antonio Linares wrote:Joe Luis, Francisco,

Le hemos enviado la version mas reciente de xbrowse a Daniel para que la modifique y la pruebe y asi usemos todos la version mas reciente :-)
Buena idea Antonio, de verdad que MCFOX ha hecho unos _ que todos podremos sacarle el mejor provecho a este poderoso xBrowse...saludos...

Posted: Tue Dec 02, 2008 2:43 pm
by Daniel Garcia-Gil
Listo antonio verifica el correo