Page 1 of 1

Celda transparente

Posted: Sat Dec 14, 2019 2:24 pm
by FranciscoA
Hola amigos.

En xBrowse tenemos la data oBrw:lTransparent := .t., que pinta todo el browse transparente, sobre el dialogo o ventana contenedora.

Pregunta:
Es posible, basado en una condicion, pintar transparentes determinadas celdas?

Me explico:
Tenemos un dialog que contiene una imagen como background.
Sobre esta imagen tenemos un xBrowse, con varias lineas y columnas.
Algunas celdas contienen valores, otras no.

Precisamente, las celdas que no contienen valores son las que se desea presentar transparentes. Es decir, hacer transparente el fondo de estas celdas y que se vea como fondo la imagen-background de la ventana o dialogo contenedor.
Es posible?

Gracias.

Re: Celda transparente

Posted: Sat Dec 14, 2019 3:27 pm
by FranciscoA
Lo siguiente no hace nada:

Code: Select all

//-----------------------------------------------------//
Function CeldaTransparente(oBrw2)    
local n1, n, uVal

  For n1 := 1 to oBrw2:nLen
     For n := 1 to len(oBrw2:aCols)
        uVal := oBrw2:aCols[n]:Value
        if Empty(uVal) .or. uVal = nil
           oBrw2:aCols[n]:lColTransparent := .t.
        endif
     Next 
  Next

  oBrw2:Refresh()

Return nil
 

Re: Celda transparente

Posted: Sat Dec 14, 2019 4:26 pm
by FranciscoA
Otro intento sin resultados deseados:

Code: Select all

//-----------------------------------------------------//
Function CeldaTransparente(oBrw2)
local n1, n

  For n1 := 1 to oBrw2:nLen
     For n := 1 to len(oBrw2:aCols)
        oBrw2:aCols[n]:lColTransparent := TranspDeCelda( oBrw2, n )
     Next 
     oBrw2:GoDown()
  Next

Return nil

//-----------------------------------------------------//
function TranspDeCelda( oBrw, n )
local uDato := oBrw:aRow[n], lTransparent := .f.

   if Empty(uDato) .or. uDato = nil
      lTransparent := .t.
   endif

return lTransparent
 

Re: Celda transparente

Posted: Sun Dec 15, 2019 12:38 am
by FranciscoA
Parece que encontré la solución:

Code: Select all

//Celdas sin valor serán transparentes. Para ello, oBrw2:lTransparent := .t., y ClrBck de celda debe ser NIL
//-----------------------------------------------------//
Function CeldaTransparente(oBrw2) 
local n

  For n := 1 to oBrw2:nLen
     AEval( oBrw2:aCols, { |o|o:lColTransparent := if(Empty(o:Value),.t.,.f.) } ) 
     oBrw2:GoDown()
  Next 

Return nil
 
Saludos.

Re: Celda transparente

Posted: Sun Dec 15, 2019 5:46 am
by nageswaragunupudi
FranciscoA wrote:Parece que encontré la solución:

Code: Select all

//Celdas sin valor serán transparentes. Para ello, oBrw2:lTransparent := .t., y ClrBck de celda debe ser NIL
//-----------------------------------------------------//
Function CeldaTransparente(oBrw2) 
local n

  For n := 1 to oBrw2:nLen
     AEval( oBrw2:aCols, { |o|o:lColTransparent := if(Empty(o:Value),.t.,.f.) } ) 
     oBrw2:GoDown()
  Next 

Return nil
 
Saludos.
oCol:lTransparent applies to the entire column, not to individual cells

Re: Celda transparente

Posted: Sun Dec 15, 2019 6:22 pm
by FranciscoA
oCol:lTransparent applies to the entire column, not to individual cells
Nages.
I know it.

After so much testing I reached that solution, and it's working for the litle proyect I am making.

Despues de muchas pruebas salió esa solución y está funcionando para el pequeño proyecto, hasta el momento.

https://www.4shared.com/photo/7kj6nn-mea/ruleta.html

Re: Celda transparente

Posted: Sun Dec 15, 2019 7:30 pm
by FranciscoA
He notado que si en la ultima fila hay celda sin valor, pone transparente toda esa columna.

Re: Celda transparente

Posted: Sun Dec 15, 2019 7:32 pm
by FranciscoA
Aqui dejo el codigo, por si alguien quiere mejorarlo.

Code: Select all

#include "fivewin.ch"

static aM, aR, cClr := ""
static oBrw1, oBrw2
//----------------------------------------------------------------------------//
function Main()
   local oDlg, oFont1
   local oBrush, cBrush := "C:\FWH1204\BITMAPS\BACKGRND\BEACH.BMP"
   local nWd := 240 
   local nHt := 600  

   CreaMatrices()

   DEFINE FONT oFont1 NAME "CONSOLAS" SIZE 0,-16 BOLD ITALIC
   DEFINE DIALOG oDlg SIZE nWd,nHt PIXEL TRUEPIXEL

   DEFINE BRUSH oBrush FILE cBrush RESIZE
   oDlg:SetBrush( oBrush )
   oBrush:End()

   PintaBrowse(oDlg)  

   ACTIVATE DIALOG oDlg CENTERED ;
         ON INIT CeldaTransparente(oBrw2)

   RELEASE oFont1
   RELEASE BRUSH oBrush
    
return nil

//----------------------------------------------------------------------------//
Function CreaMatrices()  
local n, aNms, aClr     

   aNms := {'00', '27', '10', '25', '29', '12', '8', '19', '31', '18', '6', '21', '33', '16', '4', '23', '35', '14', '2',  '0', '28', '9', '26', '30', '11', '7', '20', '32', '17', '5', '22', '34', '15', '3', '24', '36', '13', '1'}
   aClr := { 'V',  'R',  'N',  'R',  'N',  'R', 'N',  'R',  'N',  'R', 'N', 'R',  'N',   'R', 'N',  'R',  'N',  'R', 'N',  'V', 'N',  'R',  'N',  'R',  'N', 'R',  'N',  'R', 'N',  'R', 'N',  'R',  'N', 'R',  'N',  'R',  'N',  'R'}

  aR := {} 
  For n := 1 to Len(aNms)
      aadd( aR, {,,,} )  
      aR[n,1] := n                                        //Posicion
      aR[n,2] := if(len(aNms[n])=1, aNms[n]+" ", aNms[n]) //Numero (debe ser long 2 char)
      aR[n,3] := if(upper(aClr[n]) ="V","VERDE" ,;        //Color
                 if(upper(aClr[n]) ="R","ROJO"  ,;
                 if(upper(aClr[n]) ="N","NEGRO",)))
  Next

  aM := Array(13)
  aM[1] := {'0 ', '00', '  '} 
  aM[2] := {'  ', '2 ', '3 '} 
  aM[3] := {'  ', '5 ', '6 '} 
  aM[4] := {'7 ', '  ', '  '} 
  aM[5] := {'10', '11', '12'} 
  aM[6] := {'  ', '  ', '  '} 
  aM[7] := {'16', '17', '18'} 
  aM[8] := {'  ', '20', '21'} 
  aM[9] := {'  ', '23', '24'} 
  aM[10]:= {'25', '26', '27'} 
  aM[11]:= {'28', '29', '30'} 
  aM[12]:= {'31', '  ', '33'} 
  aM[13]:= {'34', '35', '36'} 

Return nil

//----------------------------------------------------------------------------//
Function PintaBrowse(oDlg)
local n, cCol, oFont

   DEFINE FONT oFont NAME "ARIAL" SIZE 0,-24 BOLD ITALIC

   @ 1,1 XBROWSE oBrw2 SIZE -1,-1 PIXEL OF oDlg  DATASOURCE aM ; 
   COLUMNS 1,2,3  HEADERS "Col1","Col2","Col3" ;
   CELL LINES NOBORDER

   FOR EACH cCol IN {"COL1", "COL2", "COL3"}
       WITH OBJECT oBrw2:oCol( cCol )
          :nWidth        := (oBrw2:nWidth/3)-1
       END
   NEXT

   WITH OBJECT oBrw2
      :nMarqueeStyle  := 0
      :nRowHeight     := 42 
      :lHeader  := .f.
      :lFooter  := .f.
      :lHScroll := .f.
      :lVScroll := .f.
      :lRecordSelector := .f.
      :nDataStrAligns := AL_CENTER
      :SetFont(oFont)
      :lTransparent  :=  .t.
      :CreateFromCode()
   END

   ColorFondoCelda(oBrw2)

   RELEASE oFont

Return nil


//-----------------------------------------------------//
Function ColorFondoCelda(oBrw2)    
local n

   For n := 1 to len(oBrw2:aCols)
      oBrw2:aCols[n]:bClrStd := ColorDeCelda( oBrw2, n )
   Next 

Return nil

//-----------------------------------------------------//
function ColorDeCelda( oBrw, n )
return {|| ElijeColor( oBrw:aRow[ n ] )  }

//-----------------------------------------------------//
function ElijeColor( uDato )
   local n, nClrBck, nClrTxt := RGB(255,255,255)

   cClr:=""
   for n := 1 to len(aR)
      if aR[n,2] == uDato
         cClr := aR[n,3] 
         exit
      endif
   Next
  
   if cClr == "VERDE"
      nClrBck := RGB(0, 200, 0)
   elseif cClr == "ROJO"
      nClrBck := RGB(225, 0, 0)
   elseif cClr == "NEGRO"
      nClrBck := RGB(0, 0, 0)
   else
      nClrBck := NIL 
   endif

return { nClrTxt, nClrBck }

//Celdas sin valor serán transparentes. Para ello, oBrw2:lTransparent := .t., y ClrBck de celda debe ser NIL
//-----------------------------------------------------//
Function CeldaTransparente(oBrw2) 
local n

  For n := 1 to oBrw2:nLen
     AEval( oBrw2:aCols, { |o|o:lColTransparent := if(Empty(o:Value),.t.,.f.) } ) 
     oBrw2:GoDown()
  Next 

Return nil

 

Re: Celda transparente

Posted: Sun Dec 15, 2019 10:16 pm
by FranciscoA
Resultado:
Image

Re: Celda transparente

Posted: Sun Dec 15, 2019 10:40 pm
by FranciscoA
Proyecto finalizado:
Image

Re: Celda transparente

Posted: Mon Dec 16, 2019 6:29 pm
by remtec
Hola Francisco.

Grande Maestro, te pasaste?

Te Felicito, se ve súper.

Muchos Saludos

Antonio.

Re: Celda transparente

Posted: Mon Dec 16, 2019 6:41 pm
by FranciscoA
Hola Antonio.
Gracias por tu comentario. Estamos a la orden.
Saludos.

Re: Celda transparente

Posted: Mon Dec 16, 2019 7:06 pm
by cnavarro
Francisco, muy bien, ya sabes que este tipo de "tips" de efectos estéticos me gustan mucho.
Tu implementación es muy muy buena ( "nivelazo" ).
Como siempre he dicho "Imaginación al poder"
Enhorabuena

Re: Celda transparente

Posted: Mon Dec 16, 2019 7:26 pm
by FranciscoA
Hola Cristóbal.
Mi estimado Maestro, gracias por sus comentarios.

Re: Celda transparente

Posted: Fri Dec 27, 2019 5:17 pm
by FranciscoA
FranciscoA wrote:He notado que si en la ultima fila hay celda sin valor, pone transparente toda esa columna.
Aqui está la solucion:

Code: Select all

#include "fivewin.ch"

//----------------------------------------------------------------------------//
function Main()
   local oDlg, oFont1, oBrw2, n, cCol, oFont
   local oBrush, cBrush := "C:\FWH1204\BITMAPS\BACKGRND\BEACH.BMP"
   local nWd := 240, nHt := 600  
   local aArr := CreaMatrices(), aR := aArr[1], aM := aArr[2]

   DEFINE FONT oFont  NAME "ARIAL" SIZE 0,-24 BOLD ITALIC
   DEFINE FONT oFont1 NAME "CONSOLAS" SIZE 0,-16 BOLD ITALIC
   DEFINE DIALOG oDlg SIZE nWd,nHt PIXEL TRUEPIXEL

   DEFINE BRUSH oBrush FILE cBrush RESIZE
   oDlg:SetBrush( oBrush )
   oBrush:End()

   @ 1,1 XBROWSE oBrw2 SIZE -1,-1 PIXEL OF oDlg  DATASOURCE aM ; 
   COLUMNS 1,2,3  HEADERS "Col1","Col2","Col3" ;
   CELL LINES NOBORDER

   FOR EACH cCol IN {"COL1", "COL2", "COL3"}
       WITH OBJECT oBrw2:oCol( cCol )
          :nWidth        := (oBrw2:nWidth/3)-1
       END
   NEXT

   WITH OBJECT oBrw2
      :nMarqueeStyle  := 0
      :nRowHeight     := 42 
      :lHeader  := .f.
      :lFooter  := .f.
      :lHScroll := .f.
      :lVScroll := .f.
      :lRecordSelector := .f.
      :nDataStrAligns := AL_CENTER
      :SetFont(oFont)
      :lTransparent  :=  .t.
      :CreateFromCode()
   END

   ColorFondoCelda(oBrw2, aR)

   ACTIVATE DIALOG oDlg CENTERED ;
         ON INIT ( CeldaTransparente(oBrw2) )

   RELEASE oFont1, oFont
   RELEASE BRUSH oBrush
    
return nil

//----------------------------------------------------------------------------//
Function CreaMatrices()  
local n, aNms, aClr, aR, aM     

   aNms := {'00', '27', '10', '25', '29', '12', '8', '19', '31', '18', '6', '21', '33', '16', '4', '23', '35', '14', '2',  '0', '28', '9', '26', '30', '11', '7', '20', '32', '17', '5', '22', '34', '15', '3', '24', '36', '13', '1'}
   aClr := { 'V',  'R',  'N',  'R',  'N',  'R', 'N',  'R',  'N',  'R', 'N', 'R',  'N',   'R', 'N',  'R',  'N',  'R', 'N',  'V', 'N',  'R',  'N',  'R',  'N', 'R',  'N',  'R', 'N',  'R', 'N',  'R',  'N', 'R',  'N',  'R',  'N',  'R'}

  aR := {} 
  For n := 1 to Len(aNms)
      aadd( aR, {,,,} )  
      aR[n,1] := n                                        //Posicion
      aR[n,2] := if(len(aNms[n])=1, aNms[n]+" ", aNms[n]) //Numero (debe ser long 2 char)
      aR[n,3] := if(upper(aClr[n]) ="V","VERDE" ,;        //Color
                 if(upper(aClr[n]) ="R","ROJO"  ,;
                 if(upper(aClr[n]) ="N","NEGRO",)))
  Next

  aM := Array(14)
  aM[1] := {'Rojo', 'Negro', 'Verde'} 
  aM[2] := {'0 ', '00', '  '} 
  aM[3] := {'  ', '2 ', '3 '} 
  aM[4] := {'  ', '5 ', '6 '} 
  aM[5] := {'7 ', '  ', '  '} 
  aM[6] := {'10', '11', '12'} 
  aM[7] := {'  ', '  ', '  '} 
  aM[8] := {'16', '17', '18'} 
  aM[9] := {'  ', '20', '21'} 
  aM[10]:= {'  ', '23', '24'} 
  aM[11]:= {'25', '26', '27'} 
  aM[12]:= {'28', '29', '30'} 
  aM[13]:= {'31', '  ', '33'} 
  aM[14]:= {'  ', '  ', '36'} 

Return { aR, aM }

//-----------------------------------------------------//
Function ColorFondoCelda(oBrw2, aR)    
local n

   For n := 1 to len(oBrw2:aCols)
      oBrw2:aCols[n]:bClrStd := ColorDeCelda( oBrw2, n, aR )
   Next 

Return nil

//-----------------------------------------------------//
function ColorDeCelda( oBrw, n, aR )
return {|| ElijeColor( oBrw:aRow[ n ], aR )  }

//-----------------------------------------------------//
function ElijeColor( uDato, aR )
   local n, nClrBck, nClrTxt := RGB(255,255,255), cClr

   cClr:=""
   for n := 1 to len(aR)
      if aR[n,2] == uDato
         cClr := aR[n,3] 
         exit
      endif
   Next
  
   if cClr == "VERDE" .or. uDato == "Verde"  //Si dato es Verde,Rojo,Negro, es apuesta por color.
      nClrBck := RGB(0, 200, 0)
   elseif cClr == "ROJO" .or. uDato == "Rojo"
      nClrBck := RGB(225, 0, 0)
   elseif cClr == "NEGRO" .or. uDato == "Negro"
      nClrBck := RGB(0, 0, 0)
   else
      nClrBck := NIL  //GetSysColor( 5 )
   endif

return { nClrTxt, nClrBck } 

//Celdas sin valor serán transparentes. Para ello, oBrw2:lTransparent := .t., y ClrBck de celda debe ser NIL
//-----------------------------------------------------//
Function CeldaTransparente(oBrw2) 
local n

   For n := 1 to len(oBrw2:aCols)
      oBrw2:aCols[n]:lColTransparent := if(Empty(oBrw2:aCols[n]:Value),.t.,.f.)
   Next 

Return nil
 
Saludos.