Page 1 of 1

Pequeño aporte: Cambiar Color a Header/Footer 1 Col.

Posted: Mon Apr 06, 2015 3:10 pm
by FranciscoA
Hola amigos del foro.
Conforme a lo prometido, aquí les dejo un ejemplo funcional que muestra como cambiar el color a Header y Footer de una sola columna en xBrowse.
Espero lo disfruten.

El color cambia cuando se hace lo siguiene:
1 - Cambiar de columna con teclas direccionales
2 - Click en header
3 - Click en footer
4 - Click en los datos

El cursor de los datos se posiciona automaticamente en la columna correspondiente.
La dbf usada, CLIENTES, se encuentra en samples.

English:
Hello forum friends .
As promised , here are a functional example that shows how to change the color to Header and Footer single column in xBrowse .
I hope you enjoy .

The color changes when you do the following :
1 - Change column with arrow keys
2 - Click on header
3 - Click on footer
4 - Click on data

The data cursor is automatically positioned in the appropriate column .
The dbf used , CLIENTES, found in samples.

Code: Select all

#include "fivewin.ch"
#include "xbrowse.ch"

REQUEST DBFCDX

//----------------------------------------------------------------------------//
function Main()
   local oDlg, oBrw, oFont, cAlias
   local oOldCol 

   USE CLIENTES VIA "DBFCDX"
   cAlias := Alias()
   GO TOP

   DEFINE FONT oFont NAME "TAHOMA" SIZE 0,-14
   DEFINE DIALOG oDlg SIZE 1100,600 PIXEL FONT oFont

   @ 10,10 XBROWSE oBrw SIZE -10,-10 PIXEL OF oDlg ;
      DATASOURCE cAlias ;
      AUTOCOLS ;
      AUTOSORT CELL LINES FOOTERS NOBORDER 

   WITH OBJECT oBrw
      :lColChangeNotify := .t.
      :CreateFromCode()
   END

   oOldCol := oBrw:aCols[oBrw:nColSel]
   oOldCol:bClrGrad := bGradColor() 

   AEval(oBrw:aCols,{|o| o:bLClickFooter := o:bLClickHeader := {|nRow,nCol,nFlags,oCol| ChgClrHeadFoot(oCol,@oOldCol,oBrw,nCol) } })

   oBrw:bChange:={|oCol| oCol:=oBrw:SelectedCol(),ChgClrHeadFoot(oCol,@oOldCol,oBrw,nil) }

   ACTIVATE DIALOG oDlg CENTERED 

   oFont:End()
   CLOSE
return nil

//---------------------------------// Change Header/footer color for one xBrowse's column only
Function ChgClrHeadFoot(oCol,oOldCol,oBrw, nCol)

  if( !oCol == oOldCol ,;
    ( oOldCol:bClrGrad := oBrw:bClrGrad ,;
      oCol:bClrGrad := bGradColor(),;  
      oOldCol := oCol,;
      if( nCol != nil, oBrw:SelectCol(oBrw:MouseColPos(nCol)), nil ),;
      oBrw:Refresh() ;
    ), )

Return nil

//----------------------------------
Function bGradColor()
local bClrGrad := { | lInvert | If( lInvert, ;
      { { 1/3, nRGB( 252, 232, 171 ), nRGB( 248, 195,  34 ) }, ;
        { 2/3, nRGB( 248, 195,  34 ), nRGB( 252, 232, 171 ) }  ;
      }, ;
      { { 1/3, nRGB( 248, 195,  34 ), nRGB( 252, 232, 171 ) }, ;
        { 2/3, nRGB( 252, 232, 171 ), nRGB( 248, 195,  34 ) }  ;
      } ) }
Return bClrGrad
 
Saludos.

Re: Pequeño aporte: Cambiar Color a Header/Footer 1 Col.

Posted: Mon Apr 06, 2015 4:33 pm
by acuellar
Gracias Francisco.

Saludos,

Adhemar

Re: Pequeño aporte: Cambiar Color a Header/Footer 1 Col.

Posted: Mon Apr 06, 2015 7:52 pm
by joseluisysturiz
Francisco, muchas gracias por tu aporte, probado y hasta los momento se ve muy bien en el xbrowse, cualquier cosa extraña te comento, saludos... :shock:

Re: Pequeño aporte: Cambiar Color a Header/Footer 1 Col.

Posted: Thu Apr 09, 2015 3:38 pm
by ACC69
FranciscoA wrote:Hola amigos del foro.
Conforme a lo prometido, aquí les dejo un ejemplo funcional que muestra como cambiar el color a Header y Footer de una sola columna en xBrowse.
Espero lo disfruten.

El color cambia cuando se hace lo siguiene:
1 - Cambiar de columna con teclas direccionales
2 - Click en header
3 - Click en footer
4 - Click en los datos

El cursor de los datos se posiciona automaticamente en la columna correspondiente.
La dbf usada, CLIENTES, se encuentra en samples.

English:
Hello forum friends .
As promised , here are a functional example that shows how to change the color to Header and Footer single column in xBrowse .
I hope you enjoy .

The color changes when you do the following :
1 - Change column with arrow keys
2 - Click on header
3 - Click on footer
4 - Click on data

The data cursor is automatically positioned in the appropriate column .
The dbf used , CLIENTES, found in samples.

Code: Select all

#include "fivewin.ch"
#include "xbrowse.ch"

REQUEST DBFCDX

//----------------------------------------------------------------------------//
function Main()
   local oDlg, oBrw, oFont, cAlias
   local oOldCol 

   USE CLIENTES VIA "DBFCDX"
   cAlias := Alias()
   GO TOP

   DEFINE FONT oFont NAME "TAHOMA" SIZE 0,-14
   DEFINE DIALOG oDlg SIZE 1100,600 PIXEL FONT oFont

   @ 10,10 XBROWSE oBrw SIZE -10,-10 PIXEL OF oDlg ;
      DATASOURCE cAlias ;
      AUTOCOLS ;
      AUTOSORT CELL LINES FOOTERS NOBORDER 

   WITH OBJECT oBrw
      :lColChangeNotify := .t.
      :CreateFromCode()
   END

   oOldCol := oBrw:aCols[oBrw:nColSel]
   oOldCol:bClrGrad := bGradColor() 

   AEval(oBrw:aCols,{|o| o:bLClickFooter := o:bLClickHeader := {|nRow,nCol,nFlags,oCol| ChgClrHeadFoot(oCol,@oOldCol,oBrw,nCol) } })

   oBrw:bChange:={|oCol| oCol:=oBrw:SelectedCol(),ChgClrHeadFoot(oCol,@oOldCol,oBrw,nil) }

   ACTIVATE DIALOG oDlg CENTERED 

   oFont:End()
   CLOSE
return nil

//---------------------------------// Change Header/footer color for one xBrowse's column only
Function ChgClrHeadFoot(oCol,oOldCol,oBrw, nCol)

  if( !oCol == oOldCol ,;
    ( oOldCol:bClrGrad := oBrw:bClrGrad ,;
      oCol:bClrGrad := bGradColor(),;  
      oOldCol := oCol,;
      if( nCol != nil, oBrw:SelectCol(oBrw:MouseColPos(nCol)), nil ),;
      oBrw:Refresh() ;
    ), )

Return nil

//----------------------------------
Function bGradColor()
local bClrGrad := { | lInvert | If( lInvert, ;
      { { 1/3, nRGB( 252, 232, 171 ), nRGB( 248, 195,  34 ) }, ;
        { 2/3, nRGB( 248, 195,  34 ), nRGB( 252, 232, 171 ) }  ;
      }, ;
      { { 1/3, nRGB( 248, 195,  34 ), nRGB( 252, 232, 171 ) }, ;
        { 2/3, nRGB( 252, 232, 171 ), nRGB( 248, 195,  34 ) }  ;
      } ) }
Return bClrGrad
 
Saludos.

Hola buenos dias a todos.

Gracias Ing. Francisco por el aporte y muy buena .

Podrias postear ejemplos de como pintar color en una columna de registros dada una condicion if(cuenta=2106)...., que me pinte de color la columna del registro o de otra manera que me pinte de otro color misma columna en caso que no se cumpla la condicion o volver a su color natural.

Y como podria pintar dos colores distintos en dos diferentes columnas,hablando a nivel de registros no de header ni footer,ya que yo soy muy burro :evil: :oops: :cry: para el pintado de colores en xbrowse .

Saludos cordiales.

Atte: Adrian C. C.

acc69@hotmail.com

Re: Pequeño aporte: Cambiar Color a Header/Footer 1 Col.

Posted: Fri Apr 10, 2015 3:05 am
by FranciscoA
Hola Adrian, probá así:

Code: Select all

  //color columna condicionada
   oBrw2:aCols[6]:bClrStd := { || IF( lTuCondicion, {CLR_YELLOW, CLR_BLACK}, {CLR_WHITE, CLR_RED} ) }
 
   //cualquier color en cualquier columna
   oBrw2:aCols[3]:bClrStd := { || {CLR_BLACK, CLR_YELLOW} } 
   oBrw2:aCols[4]:bClrStd := { || {CLR_BLACK, CLR_CYAN} }  
 
Saludos

Re: Pequeño aporte: Cambiar Color a Header/Footer 1 Col.

Posted: Fri Apr 10, 2015 7:07 am
by AIDA
Hola esta super se ve mas bonito el xbrowse :mrgreen:

ya lo aplique y en red local funciona muy bien :D

pero ya en red remota se tarda al darle click a la columna que selecciono :shock:

Saluditos :wink:

Re: Pequeño aporte: Cambiar Color a Header/Footer 1 Col.

Posted: Fri Apr 10, 2015 2:17 pm
by nageswaragunupudi
Two suggestions:

1) Instead of changing bClrGrad whenever column is changed, just initialize each column's bClrGrad in the beginning only once.

2) Calling oBrw:Refresh() each time a column is change slows the performance, particularly on networks, because oBrw:Refresh() re-reads all records from the database. Reading all records from database each time a column is changed makes the browse slow.

It is better to paint headers and footers only without repainting the data. XBrowse provides a method RefreshFooters() to paint only footers, but does not provide a method to refresh headers only. I suggest a function for this.

Please try this alternative solution:

Code: Select all

#include "fivewin.ch"

function Main()

   local oDlg, oBrw, oFont, cAlias
   local oOldCol

   USE CLIENTES VIA "DBFCDX"
   cAlias := Alias()
   GO TOP

   DEFINE FONT oFont NAME "TAHOMA" SIZE 0,-14
   DEFINE DIALOG oDlg SIZE 1100,600 PIXEL FONT oFont

   @ 10,10 XBROWSE oBrw SIZE -10,-10 PIXEL OF oDlg ;
      DATASOURCE cAlias ;
      AUTOCOLS ;
      AUTOSORT CELL LINES FOOTERS NOBORDER

   AEval( oBrw:aCols, { |o| o:bClrGrad := bColClrGrad( o ) } )
   WITH OBJECT oBrw
      :lColChangeNotify := .t.
      :bChange    := { || If( oBrw:SelectedCol() == oOldCol, nil, ;
         ( BrwRefreshHeaders( oBrw ), oBrw:RefreshFooters(), oOldCol := oBrw:SelectedCol() ) ) }
      :CreateFromCode()
   END

   ACTIVATE DIALOG oDlg CENTERED

   oFont:End()
   CLOSE
return nil

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

function BrwRefreshHeaders( oBrw )

   local nRow     := 0
   local nCol     := If( oBrw:lRecordSelector, oBrw:nRecSelWidth, 0 )
   local aCols    := Array( Len( oBrw:aDisplay ) + 1 )
   local nLast    := oBrw:LastDisplayPos()
   local nFor, oCol

   for nFor := 1 to nLast
      aCols[ nFor ] := nCol
      oCol := oBrw:ColAtPos( nFor )
      nCol += oCol:nWidth + 2
   next
   aCols[ nFor ] := nCol
   oBrw:PaintHeader( oBrw:GetDC(), aCols, nLast, oBrw:hWhitePen, oBrw:hBtnShadowPen, oBrw:hColPen )
   oBrw:ReleaseDC()

return nil

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

static function bColClrGrad( oCol )
return { | lInvert | ;
         If( lInvert, Eval( oCol:oBrw:bClrGrad, .t. ), ;
         If( oCol == oCol:oBrw:SelectedCol(), ;
             { { 1/3, nRGB( 248, 195,  34 ), nRGB( 252, 232, 171 ) }, ;
               { 2/3, nRGB( 252, 232, 171 ), nRGB( 248, 195,  34 ) }  ;
             }, Eval( oCol:oBrw:bClrGrad, .f. ) ) ) }

//----------------------------------------------------------------------------//
 
Note: PaintHeader() method is not intended to be used in application programs directly. This may change in future versions. But if we change this method, we surely provide Method RefreshHeaders(). Then you can safely replace call to "BrwRefreshHeaders( oBrw )" with "oBrw:RefreshHeaders()"

Re: Pequeño aporte: Cambiar Color a Header/Footer 1 Col.

Posted: Fri Apr 10, 2015 3:33 pm
by FranciscoA
Mr Nages.

Gracias por sus sugerencias, su atención, y su codigo.

Precisamente estaba tratando de crear la function RefreshHeaders() y/o usar PaintHeader(), pero aún no lo había logrado de ese modo, así que decidí exponer el código por si alguien decidía mejorarlo.

Nuevamente, gracias!!

*******************
Thanks for your suggestions , your attention, and your code .

I was just trying to create the RefreshHeaders function () and / or use PaintHeader (), but still had not managed that way , so I decided to expose the code in case someone decided to improve it.

Again , thank you !!
********************

Re: Pequeño aporte: Cambiar Color a Header/Footer 1 Col.

Posted: Fri Apr 10, 2015 3:40 pm
by FranciscoA
Agradezco los comentarios de los que decidieron probarlo.

Re: Pequeño aporte: Cambiar Color a Header/Footer 1 Col.

Posted: Fri Apr 10, 2015 4:41 pm
by nageswaragunupudi
Included new method RefreshHeaders() in FWH 15.04.
With this bChange can be written as:

Code: Select all

      :bChange    := { || If( oBrw:SelectedCol() == oOldCol, nil, ;
         ( oBrw:RefreshHeaders(), oBrw:RefreshFooters(), oOldCol := oBrw:SelectedCol() ) ) }
 

Re: Pequeño aporte: Cambiar Color a Header/Footer 1 Col.

Posted: Fri Apr 10, 2015 5:00 pm
by FranciscoA
Mr. Nages.
Great !!
A more satisfaction from FiveWin for all users, especially those who maintain updated its version .
Regards.

Re: Pequeño aporte: Cambiar Color a Header/Footer 1 Col.

Posted: Fri Apr 10, 2015 5:20 pm
by joseluisysturiz
FranciscoA wrote:Agradezco los comentarios de los que decidieron probarlo.
Al Cesar lo que es del Cesar..y al PROGRAMADOR lo que es del PROGRAMADOR...saludos... :shock:

Re: Pequeño aporte: Cambiar Color a Header/Footer 1 Col.

Posted: Fri Apr 10, 2015 10:22 pm
by ACC69
FranciscoA wrote:Hola Adrian, probá así:

Code: Select all

  //color columna condicionada
   oBrw2:aCols[6]:bClrStd := { || IF( lTuCondicion, {CLR_YELLOW, CLR_BLACK}, {CLR_WHITE, CLR_RED} ) }
 
   //cualquier color en cualquier columna
   oBrw2:aCols[3]:bClrStd := { || {CLR_BLACK, CLR_YELLOW} } 
   oBrw2:aCols[4]:bClrStd := { || {CLR_BLACK, CLR_CYAN} }  
 
Saludos

Gracias Ing. Francisco, excelente, no era gran cosa ni dificil,pero si soy muy burro para colorear en xBrowse que lo mismo me sucede con los dialogosy fonts,que mejor lo dejo por default...

Saludos y buen dia.

Atte: Adrian C. C.

Re: Pequeño aporte: Cambiar Color a Header/Footer 1 Col.

Posted: Sun Aug 01, 2021 5:38 pm
by MarioG
Hola!
Retomando este tema.
Se puede dar color al Footer de distintas columnas?
O sea sin ninguna condición; desde el arranque que muestre el color definido

Gracias!