Celda transparente

Post Reply
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Celda transparente

Post 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.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Celda transparente

Post 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
 
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Celda transparente

Post 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
 
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Celda transparente

Post 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.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
User avatar
nageswaragunupudi
Posts: 8017
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Contact:

Re: Celda transparente

Post 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
Regards

G. N. Rao.
Hyderabad, India
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Celda transparente

Post 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
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Celda transparente

Post by FranciscoA »

He notado que si en la ultima fila hay celda sin valor, pone transparente toda esa columna.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Celda transparente

Post 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

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

Fwxh1204-MySql-TMySql
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Celda transparente

Post by FranciscoA »

Resultado:
Image
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Celda transparente

Post by FranciscoA »

Proyecto finalizado:
Image
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
remtec
Posts: 431
Joined: Fri May 12, 2017 2:50 pm

Re: Celda transparente

Post by remtec »

Hola Francisco.

Grande Maestro, te pasaste?

Te Felicito, se ve súper.

Muchos Saludos

Antonio.
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Celda transparente

Post by FranciscoA »

Hola Antonio.
Gracias por tu comentario. Estamos a la orden.
Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
User avatar
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Celda transparente

Post 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
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Celda transparente

Post by FranciscoA »

Hola Cristóbal.
Mi estimado Maestro, gracias por sus comentarios.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Celda transparente

Post 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.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
Post Reply