Bitmap en Folder

Post Reply
User avatar
Pedro
Posts: 457
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Bitmap en Folder

Post by Pedro »

Hola a todos

Pregunta. ¿Hay alguna manera de usar solo dos bitmaps en las pestañas de un folder dinamicamente?

Me explico, poner un bitmaps cuando el folder está activo y otro si no lo está
en fwh\bitmaps estan Folder3.bmp y folder.bmp, representa una carpeta abierta y otra cerrada, cuando construimos el folder la primera pestaña (primer folder) tomaría el folder3.bmp y cuando pierda el foco por otro folder ponerle el folder.bmp

¿Es posible esto?

Feliz salida y entrada de año a todos

Pedro
Un saludo
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Bitmap en Folder

Post by Antonio Linares »

Pedro,

Si revisas FWH\samples\TestFold.prg verás que la función SetImages() se usa para crear un objeto ImageList y asociarlo al folder.

La idea es que tengas creados dos objetos ImageList y que cambies de uno a otro, cuando cambies el estado de las pestañas del folder (accesibles ó no). Es sencillo.

Inténtalo y si no te sale, te hacemos un ejemplo.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Pedro
Posts: 457
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Re: Bitmap en Folder

Post by Pedro »

Hola Antonio

Pues no me sale. He definido dos objetos oImageList (oImageList1,oImageList2) y no he tenido mas remedio que asignarle cuatro imagenes iguales, pues hay cuatro pestañas en el folder, (lo suyo sería definir una imagen sola por cada objeto oImageList para mi caso)

si pongo
REDEFINE FOLDER........
ON CHANGE oFld:SetImageList(oImageLis2)
Me cambia las imagenes, pero todas, no unicamente la del folder que se pincha, y mi pregunta era que cambiaran el folder que pierde el foco y el que adquiere el foco.
Un ejemplo de lo que digo
Un bitmap llamado abierto, para la pestaña que está seleccionada y un bitmap cerrado para el resto de las pestañas
Al iniciarse el Folder y segun hallamos colocado nOption, ese folder llevará el bmp abierto, el resto lo llevará cerrado
cuando cambiamos, ponermos el bmp cerrado al folder que pierde el foco y abierto al que lo toma.

Gracias por tu respuesta

Pedro
Un saludo
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

Re: Bitmap en Folder

Post by Daniel Garcia-Gil »

prueba esto a ver como te va....

Code: Select all

#include "FiveWin.ch"
#include "Folder.ch"

//----------------------------------------------------------------------------//

function Main()

   local oDlg, oFld, oCbx, oSay
   local nValue := 2, oChk, lChk := .t.
   local cItem, oImageList
 

   SET _3DLOOK ON

   DEFINE DIALOG oDlg RESOURCE "Test"

   
   REDEFINE FOLDER oFld ID 110 OF oDlg ;
      PROMPT "Cli&pper", "&and", "&Windows", "&Magic" ;
      DIALOGS "Sub1", "Sub2","Sub3", "Sub4"

	 REDEFINE BUTTON ID 120 OF oDlg ;
      ACTION oDlg:End()


   oFld:aEnable = { .t., .t., .t., .t. }
   
   oFld:bChange := {|| SetImages( oDlg, oFld ) }

   ACTIVATE DIALOG oDlg CENTERED ;
      VALID MsgYesNo( "Want to end ?" ) ;
      ON INIT SetImages( oDlg, oFld )

return nil

//----------------------------------------------------------------------------//

function DoBrowse()

   USE Customer
   Browse()
   USE

return nil

//----------------------------------------------------------------------------//

function SetImages( oDlg, oFld )

   local oImageList, n
   
   DEFINE IMAGELIST oImageList SIZE 16, 16
   
   for n = 1 to len( oFld:aPrompts )
   	if n == oFld:nOption
	   oImageList:AddMasked( TBitmap():Define( "open",,    oDlg ), nRGB( 192, 192, 192 ) )    
	  else
   	oImageList:AddMasked( TBitmap():Define( "close",,   oDlg ), nRGB( 192, 192, 192 ) )    
    endif
   next
   
   oFld:SetImageList( oImageList )
   
  
   
return nil   
archivo RC

Code: Select all

#define IDC_CHECKBOX1	92
#include ".\..\include\WinApi.ch"

#ifdef __FLAT__
  1 24 "winxp\WindowsXP.Manifest"
#endif

#ifdef __64__
   1 24 "WinXP/WindowsXP.Manifest64"
#endif 

open   BITMAP "../bitmaps/on.bmp"
close  BITMAP "../bitmaps/off.bmp"

Test DIALOG 19, 47, 233, 124
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "FiveWin Folders Demo"
{
 CONTROL "", 110, FOLDER32, 0 | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 4, 5, 225, 99
 PUSHBUTTON "&OK", 120, 98, 108, 37, 14
}


sub1 DIALOG 18, 18, 205, 80
STYLE WS_CHILD | 4
{
}


sub2 DIALOG 18, 18, 142, 67
STYLE WS_CHILD | 4
{
}

sub3 DIALOG 18, 18, 142, 67
STYLE WS_CHILD | 4
{
}

sub4 DIALOG 18, 18, 142, 67
STYLE WS_CHILD | 4
{
}
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
User avatar
Pedro
Posts: 457
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Re: Bitmap en Folder

Post by Pedro »

Gracias Daniel

Eso era justo lo que quería, y ya que estamos, una pegunta...para ti y para Antonio.
En la clase TxBrowse (últimas versiones) debo suponer que se ha corregido algo, pues siguiendo tu mismo ejemplo
con xBrwAppe, resulta que al crear la primera columna, en el bOnPosEdit, he puesto un If nKey == VK_Return .......
y un If nKey == VK_ESCAPE, pues bien si he pulsado return primero y luego escape, me da un error DBCMD/2001 al hacer un dbappend() (que no hago en la linea que da) y si solo pulso escape, se cierra el dialogo.
las lineas de creación son estas

Code: Select all

oBrw = TXBrowse():New( oDlgAlb ) 
   
   oBrw:nColDividerStyle    := LINESTYLE_BLACK
   oBrw:nRowDividerStyle    := LINESTYLE_BLACK
   oBrw:lRecordSelector     := .t.
   oBrw:nHeaderLines        := 1
   oBrw:nDataLines          := 1
	 oBrw:nRowSel             := 1
	 oBrw:nMarqueeStyle       := 3 //Highlight row //MARQSTYLE_HIGHLCELL
	 oBrw:bClrSelFocus        := {||{CLR_WHITE,RGB(176,196,222 )}}
   oBrw:cAlias := cAlias1
   oBrw:bClrStd := {|| { nRGB( 0, 0, 0), nRGB(255,248,220) } } // colores para lineas normales 
   oBrw:bClrSel := {|| { nRGB(0,0,0), nRGB(241,222,088) } } // para barra de linea selecc cuando el control no tiene el foco 
   oBrw:bClrSelFocus := {|| { nRGB( 0, 0, 0), nRGB(248,195, 34) } } // para barra de linea selecc cuando el control tiene el foco 

   oBrw:lFastEdit  := .T.
   oBrw:bPastEof = {|| (cAlias1)->(Dbappend()), oBrw:GoLeftMost(),oBrw:Refresh(),;
                                            oBrw:aCols[ 1 ]:Edit() } 
                                            //agrega registro y "oprime" enter
                        
   oCol = oBrw:AddCol()
   oCol:bStrData      := { ||TRANSFORM((cAlias1)->codigo,"99999") } 
   oCol:nEditType     := EDIT_GET
   oCol:cHEADER       := "CODIGO" 
   oCol:bEditValid   =   {|o| if ( VAL(o:value()) == 0 , .f., .t.) }
   oCol:bOnPostEdit   := { | oCol, xVal, nKey | If( RecCount() == 0,( DbAppend(), oBrw:Refresh() ),) ,; 
   If( nKey == VK_RETURN, If(Barticulo(oBrw,xVal),oBrw:Refresh(),oBrw:GoleftMost()),),;
   If( nKey == VK_ESCAPE .and. VAL((cAlias1)->codigo)=0,( (cAlias1)->(dbDelete()),;
               (cAlias1)->(__dbPack()),(cAlias1)->(dbGoBottom()),oBrw:Refresh() ), ) }
Las de tu código de ejemplo son estas

Code: Select all

@ 0, 0 XBROWSE oBrw OF oWndChild ALIAS "test"


   oBrw:nMarqueeStyle = 3
   oBrw:nColDividerStyle =  LINESTYLE_BLACK
   oBrw:nRowDividerStyle = LINESTYLE_BLACK
   oBrw:lHScroll  =  .T.
   oBrw:lColDividerComplete    =  .T.
   oBrw:lAutoAppend =  lAuto
   oBrw:lFastEdit  =  .T.
        oBrw:bPastEof = {|| Dbappend(), oBrw:refresh(), oBrw:aCols[ 1 ]:Edit() }
  oBrw:bKeyDown = {|nKey| if( nKey == VK_DELETE ,;
                            ( nLast:=recno(),test->( dbdelete() ), __Dbpack(), dbgoto(nLast) ),), oBrw:refresh() }

oCol = oBrw:AddCol()
   oCol:bStrData    = { || test->First }
   oCol:cHeader     = "First"
   oCol:nEditType   = EDIT_GET
   oCol:bOnPostEdit = ;
            { | oCol, xVal, nKey | if( xVal == space( 20 ) .and. nKey == VK_ESCAPE,;
                                                 ( nLast:=recno(),test->( dbdelete() ), __Dbpack(),dbgoto(nLast-1) ),;// Afirmacion
                                                ( If( RecCount() == 0, ( DbAppend(), oBrw:Refresh() ),), ;//Negativa
                                                  If( nKey == VK_RETURN, test->First := xVal,) )), oBrw:refresh() }
    oCol:bEditValid   =   {|o| if ( o:value() == space(20), .f., .t.) }
   
Al margen de que tu ejemplo es una Windows y el mío un dialog, ¿qué diferencia hay?
Yo no veo ninguna salvo lo que dije antes, que se haya corregido algo en la clase.

Un abrazo y feliz año nuevo

Pedro
Un saludo
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Bitmap en Folder

Post by Antonio Linares »

Daniel, Pedro,

Una pequeña observación respecto al código,

Antes de asignar el nuevo ImageList habria que destruir el anteriormente usado:

Code: Select all

function SetImages( oDlg, oFld )

   local oImageList, n

   oFld:oImageList:End() // aqui
   
   DEFINE IMAGELIST oImageList SIZE 16, 16

   ...
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Pedro
Posts: 457
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Re: Bitmap en Folder

Post by Pedro »

Antonio

Eso no me ha funcionado, me da un error,

Code: Select all

Application
===========
   Path and name: C:\Proyectos\Gfactu\GFACTU.Exe (32 bits)
   Size:   737,280 bytes
   Time from start: 0 hours 0 mins 8 secs 
   Error occurred at: 03-01-2009, 19:35:29
   Error description: Error BASE/1004  Class: 'NIL' has no exported method: END
   Args:
     [   1] = U   

Stack Calls
===========
   Called from:  => END(0)
   Called from: gesh0110.prg => SETIMAGES(287)
   Called from: gesh0110.prg => (b)CTRARTI(239)
   Called from: DIALOG.PRG => TDIALOG:INITIATE(0)
   Called from: DIALOG.PRG => TDIALOG:HANDLEEVENT(0)
   Called from:  => DIALOGBOX(0)
   Called from: DIALOG.PRG => TDIALOG:ACTIVATE(0)
   Called from: gesh0110.prg => CTRARTI(239)
   Called from: gesh0110.prg => (b)ARTICULOS(58)
   Called from: WINDOW.PRG => TCONTROL:LDBLCLICK(0)
   Called from: WBROWSE.PRG => TWBROWSE:LDBLCLICK(0)
   Called from:  => TWINDOW:HANDLEEVENT(0)
   Called from: CONTROL.PRG => TWBROWSE:HANDLEEVENT(0)
   Called from: WINDOW.PRG => _FWH(0)
   Called from:  => WINRUN(0)
   Called from: WINDOW.PRG => TMDIFRAME:ACTIVATE(0)
   Called from: geshinic.prg => MAIN(179)
Al parecer hay que verificar primero si el objeto oImageList es nil, antes de lo que tu has puesto

if oImageList <> Nil
destruirlo
EndIF
Y asi si funciona

Un abrazo
Pedro

PD. Mira mi pregunta sobre el txbrowse a ver si hay alguna solución
Un saludo
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Bitmap en Folder

Post by Antonio Linares »

Pedro,

Si, cierto, pues la primera vez es nil :-)

Vamos a revisar tu pregunta del xbrowse cuanto antes
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

Re: Bitmap en Folder

Post by Daniel Garcia-Gil »

pedro intenta poner un valid en la activacion del dialogo.. algo como esto...

Activate dialog oDlg VALID ( !GETKEYSTATE( VK_ESCAPE ) )
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
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

Re: Bitmap en Folder

Post by Daniel Garcia-Gil »

uso dialog y no da ningun inconveniente
te dejo el codigo

Code: Select all

procedure dbfs()   
local oBrw, oWndChild, oBar, oCol
local nLast
local lAuto := .t.
      
    set delete on

   USE test
   

   DEFINE DIALOG oWndChild SIZE 300,300
   
   //define buttonbar oBar of oWndChild
   
   @ 1,1    btnBMP of oWndChild prompt "ON" action( oBrw:lAutoappend := lAuto:= .t. ) top when !lAuto
   @ 1, 100 btnBMP of oWndChild prompt "OFF" action( oBrw:lAutoappend := lAuto:= .f.) top	when lAuto
   @ 1, 200 btnBMP of oWndChild prompt "Exit" action( oWndChild:end()	)			 top
   
   
   @ 2, 0 XBROWSE oBrw OF oWndChild ALIAS "test" SIZE 130,130


   oBrw:nMarqueeStyle = 3
   oBrw:nColDividerStyle =  LINESTYLE_BLACK
   oBrw:nRowDividerStyle = LINESTYLE_BLACK
   oBrw:lHScroll  =  .T.
   oBrw:lColDividerComplete    =  .T.
   oBrw:lAutoAppend =  lAuto
   oBrw:lFastEdit  =  .T.
        oBrw:bPastEof = {|| Dbappend(), oBrw:refresh(), oBrw:aCols[ 1 ]:Edit() }
  oBrw:bKeyDown = {|nKey| if( nKey == VK_DELETE ,;
                            ( nLast:=recno(),test->( dbdelete() ), __Dbpack(), dbgoto(nLast) ),), oBrw:refresh() }
   
   oCol = oBrw:AddCol()
   oCol:bStrData    = { || test->First }
   oCol:cHeader     = "First"
   oCol:nEditType   = EDIT_GET
   oCol:bOnPostEdit = ;
            { | oCol, xVal, nKey | if( xVal == space( 20 ) .and. nKey == VK_ESCAPE,;
                                                 ( nLast:=recno(),test->( dbdelete() ), __Dbpack(),dbgoto(nLast-1) ),;// Afirmacion
                                                ( If( RecCount() == 0, ( DbAppend(), oBrw:Refresh() ),), ;//Negativa
                                                  If( nKey == VK_RETURN, test->First := xVal,) )), oBrw:refresh() }
    oCol:bEditValid   =   {|o| if ( o:value() == space(20), .f., .t.) }
   
   oCol = oBrw:AddCol()
   oCol:bStrData    = { || test->Last }
   oCol:cHeader     = "Last"
   oCol:nEditType   = EDIT_GET
   oCol:bOnPostEdit = { | oCol, xVal, nKey | If( RecCount() == 0, DbAppend(),), If( nKey == VK_RETURN, ( test->Last := xVal, oBrw:Refresh() ),) }
   
   oBrw:CreateFromCode()
   
 //  oWndChild:oClient := oBrw

   ACTIVATE DIALOG oWndChild 

return
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
User avatar
Pedro
Posts: 457
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Re: Bitmap en Folder

Post by Pedro »

Hola Daniel

Veamos,
1º el verficar la tecla Escape en el Valid del dialogo no funciona, no hace nada.
2º El problema de la tecla Escape sólo está en el dialogo, no en la window, y creo que eso se ha debido retocar, pues si tu dices que a ti te funciona, obvio que tienes una versión mucho más moderna que la mía. En el ejemplo del que he partido para verficarlo, (ejemplo de Francisco J. Alegría) si pongo el Xbrowse en un dialogo y pulso Escape, se cierra el dialogo, en cambio si lo pongo en una window, :twisted: no se cierra al pulsar Escape.

El tema es, que por eso hice la pregunta, que el módulo es un diálogo para introducir albaranes, primero van los gets con los datos de la cabecera del albarán y luego el browse de las líneas, funciona todo Ok menos la dichosa tecla Escape.

3º Un dato curioso, segun el xbrowse.ch que tengo de la version 8.04, al poner en el módulo @ 2.0 (o las coordenadas que sean) me debe convertir a <oBrw> := XbrowseNew( <oWnd>, <nRow>, <nCol>, <nWidth>, <nHeigth>,;....etc
Pues bien, eso da un error de compilación C:\PROYEC~1\Xbrowse\xbrowse.prg(44) Error E0030 Syntax error: "syntax error at , en cambio si pongo oBrw := TXBrowse():New( oWndChild ) no da error de compilación.
Curioso, verdad.

Un abrazo y seguiré investigando
Pedro
Un saludo
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

Re: Bitmap en Folder

Post by Daniel Garcia-Gil »

publica el codigo desde el punto donde defines el dialogo hasta el lugar donde lo activas o puedes enviarmelo al correo o hablamos por mensajeria , despues podemos publicar la solucion
email:danielgarciagil@gmail.com
messenger:danielgarciagil@cantv.net
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
User avatar
Pedro
Posts: 457
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Re: Bitmap en Folder

Post by Pedro »

Hola Daniel

Despues de escribir el anterior post, me dije, ¿por qué no revisar los FTDN?, y así lo hice.
Y la verdad, todo lo que pensaba era cierto, la clase TxBrowse se ha tocado muchísimo, el problema es mío, es decir de mi versión de FWH, no me queda más remedio que actualizarme.
Por ejemplo, se ha tocado lo de la tecla Escape, antes se evaluaba dos veces y ya no, eso y otras muchas cosas más, como por ejemplo que me de un error de compilación cuando uso @ nRow, nCol Xbrowse.....en mi versión no es posible usarlo, solo se puede hacer con oBrw:=TxBrowse():New().
Siento haberos hecho perder el tiempo, no me percaté hasta ahora del tema de que cuando se publica una versión _ y mejoras están ahí.
Mil perdones.

Un abrazo y seguimos en contacto.

Pedro
Un saludo
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

Re: Bitmap en Folder

Post by Daniel Garcia-Gil »

Pedro.
No hay problema, estamos para ayudarnos, tu caso tiene solucion, mantengo mi posicion del post anterior

saludos...
PD. la actualizacion es una buena decision
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
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Bitmap en Folder

Post by FranciscoA »

Pedro, tienes razón, pero lo de Daniel es acertado.

Probé mi ejemplo desde recursos (oDlg y oBrw) y se comporta como dices.

Como dice Daniel, puedes solucionarlo asi:

//------------------------
Function PuedeSalir(cAlias)
local lRet:=.f.

IF (cAlias)->(!bof())
if MsgNoYes("Si sale, perderá los datos actuales en edición."+CRLF+;
"¿Está seguro de salir?","Advertencia")
lRet := .t.
endif
ELSE
lRet:=.t. //dbf esta vacia, cierre automaticamente el dialogo.
ENDIF
return lRet

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

Fwxh1204-MySql-TMySql
Post Reply