xBrowse Button del GET
- Daniel Garcia-Gil
- Posts: 2365
- Joined: Wed Nov 02, 2005 11:46 pm
- Location: Isla de Margarita
- Contact:
xBrowse Button del GET
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 "..."
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 ) )
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
PRUEBA 2
PRUEBA 3
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
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 ) )
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
PRUEBA 2
PRUEBA 3
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
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
- Daniel Garcia-Gil
- Posts: 2365
- Joined: Wed Nov 02, 2005 11:46 pm
- Location: Isla de Margarita
- Contact:
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.Antonio Linares wrote:Daniel,
Muchas gracias por esta aportación tan interesante!
Yo solo espero que este pequeño cambio no solo me sirva a mi sino a otras personas
Daniel,
Me gusta
Gracies.
Me gusta
Gracies.
Salutacions, saludos, regards
"...programar es fácil, hacer programas es difícil..."
https://modharbour.app
https://modharbour.app/compass
https://forum.modharbour.app
"...programar es fácil, hacer programas es difícil..."
https://modharbour.app
https://modharbour.app/compass
https://forum.modharbour.app
- Daniel Garcia-Gil
- Posts: 2365
- Joined: Wed Nov 02, 2005 11:46 pm
- Location: Isla de Margarita
- Contact:
check you email...
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
- FranciscoA
- Posts: 1964
- Joined: Fri Jul 18, 2008 1:24 am
- Location: Chinandega, Nicaragua, C.A.
Mcfox:
Puedes enviarme la classe modificada a mi corre f.alegria.p@Gmail.com?
Puedes enviarme la classe modificada a mi corre f.alegria.p@Gmail.com?
- joseluisysturiz
- Posts: 2024
- Joined: Fri Jan 06, 2006 9:28 pm
- Location: Guatire - Caracas - Venezuela
- Contact:
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...FranciscoA wrote:Mcfox:
Puedes enviarme la classe modificada a mi corre f.alegria.p@Gmail.com?
Dios no está muerto...
Gracias a mi Dios ante todo!
Gracias a mi Dios ante todo!
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
- FranciscoA
- Posts: 1964
- Joined: Fri Jul 18, 2008 1:24 am
- Location: Chinandega, Nicaragua, C.A.
- joseluisysturiz
- Posts: 2024
- Joined: Fri Jan 06, 2006 9:28 pm
- Location: Guatire - Caracas - Venezuela
- Contact:
Buena idea Antonio, de verdad que MCFOX ha hecho unos _ que todos podremos sacarle el mejor provecho a este poderoso xBrowse...saludos...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
Dios no está muerto...
Gracias a mi Dios ante todo!
Gracias a mi Dios ante todo!
- Daniel Garcia-Gil
- Posts: 2365
- Joined: Wed Nov 02, 2005 11:46 pm
- Location: Isla de Margarita
- Contact:
Listo antonio verifica el correo
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9