Page 1 of 2

Colorear celdas en TWBrowse

PostPosted: Fri Apr 25, 2008 4:09 pm
by softruz
Muy buenas, estoy intentando coloreas celdas de un TwBrowse según parametros pero no lo consigo, mi versión es FWH712 y XHB 1.1.0, hay algún ejemplo por ahí.

Un Saludo.

PostPosted: Fri Apr 25, 2008 4:56 pm
by Anderson.OL

Gracias

PostPosted: Mon Apr 28, 2008 8:08 am
by softruz
Anderson mi problema es pintar celdas individuales no filas, ¿Me podrías decir como lo puedo conseguir?

Un Saludo.

PostPosted: Mon Apr 28, 2008 10:15 am
by Antonio Linares
Usando la clase TWBrowse estandard de FWH no puedes colorear celdas individuales. Necesitarías usar la clase TCBrowse, que requiere algunos cambios sobre tu código actual.

O modificar la función wBrwLine() en source\classes\wbrowse.prg. Está en PRG y no es dificil de modificar

Re:

PostPosted: Mon Apr 28, 2008 10:37 am
by softruz
Anotnio, me podrías echar una mano para ver en que parte del código tendría que modificar para no realizar cambios y no empeorarlo.

Un Saludo.

PostPosted: Mon Apr 28, 2008 11:40 am
by Antonio Linares
En base a que criterio (valor de un campo, posicion, etc.) quieres colorear una determinada celda ?

Re:

PostPosted: Mon Apr 28, 2008 11:46 am
by softruz
Lo que quiero conseguir es colorear una determinada celda según si el valor de dicha celda es igual a uno dado.

Un Saludo.

rE:

PostPosted: Tue Apr 29, 2008 9:32 am
by softruz
Muy buenas Antonio, he estado mirando el código pero me gustaría que me dijeras por donde puedo tirar para no modificar código innecesario.

Un Saludo.

PostPosted: Tue Apr 29, 2008 10:46 am
by Antonio Linares
Haz estas dos modificaciones en source\classes\wbrowse.prg function wBrwLine():

1: Comenta esta línea (2248):

// SetBkColor( hDC, If( ValType( nClrPane ) == "B",;
// nClrPane := Eval( nClrPane ), nClrPane ) )

2: Añade lo que está en rojo (línea 2282):

SetBkColor( hDC, If( nColAct != nil, If( ValType( nClrBack ) == "B",;
Eval( nClrBack ), nClrBack ),;
If( ValType( nClrPane ) == "B", Eval( nClrPane, n ), nClrPane ) ) )

Aqui tienes un ejemplo de uso:
Code: Select all  Expand view
#include "FiveWin.ch"

function Main()

   local oDlg, oBrw, aValues := { { "One", "Two", "Three" }, { "Four", "Five", "Six" } }
   
   DEFINE DIALOG oDlg TITLE "Colored Cell"
   
   @ 0, 0 LISTBOX oBrw ;
      FIELDS aValues[ oBrw:nAt, 1 ], aValues[ oBrw:nAt, 2 ], aValues[ oBrw:nAt, 3 ] ;
      OF oDlg
   
   oBrw:SetArray( aValues )
   oBrw:nClrPane = { | nCol | If( aValues[ oBrw:nAt, nCol ] == "Five", CLR_HRED, CLR_WHITE ) }
   oDlg:oClient = oBrw
   
   ACTIVATE DIALOG oDlg CENTERED ;
      ON INIT oDlg:ReSize()
   
return nil   

Image

Re:

PostPosted: Tue Apr 29, 2008 3:47 pm
by softruz
Muy buenas Antonio, he probado el código que me has proporcionado pero no lo consigo, yo utilizo la FwH v.7.12 y principalmente a la hora de modificar wbrowse.prg las líneas no coinciden con las que me das son siempre 2 líneas menos, no se si es por la version, con este código:


redefine listbox oTbr FIELDS "";
HEADERS "Mes/Día","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31" ID 501 of odlg font oFontTahoma;
on dblclick iif(empty(aId[oTbr:nAt,oTbr:nColAct]) .or. aId[oTbr:nAt,oTbr:nColAct]=0,msgalert("Debe seleccionar un día con un Servicio asignado.",oConfiguracion:Titulo_Aplicacion),(oDlg:end(),m_ServiciosDirDet(,aId[oTbr:nAt,oTbr:nColAct])))
oTbr:SetArray(acDatos)// Lo mete en el browse
oTbr:bline := {|| {acDatos[oTbr:nAt,1],acDatos[oTbr:nAt,2],acDatos[oTbr:nAt,3],acDatos[oTbr:nAt,4],acDatos[oTbr:nAt,5],acDatos[oTbr:nAt,6],acDatos[oTbr:nAt,7],acDatos[oTbr:nAt,8],acDatos[oTbr:nAt,9],acDatos[oTbr:nAt,10],acDatos[oTbr:nAt,11],acDatos[oTbr:nAt,12],acDatos[oTbr:nAt,13],acDatos[oTbr:nAt,14],acDatos[oTbr:nAt,15],acDatos[oTbr:nAt,16],acDatos[oTbr:nAt,17],acDatos[oTbr:nAt,18],acDatos[oTbr:nAt,19],acDatos[oTbr:nAt,20],acDatos[oTbr:nAt,21],acDatos[oTbr:nAt,22],acDatos[oTbr:nAt,23],acDatos[oTbr:nAt,24],acDatos[oTbr:nAt,25],acDatos[oTbr:nAt,26],acDatos[oTbr:nAt,27],acDatos[oTbr:nAt,28],acDatos[oTbr:nAt,29],acDatos[oTbr:nAt,30],acDatos[oTbr:nAt,31],acDatos[oTbr:nAt,32]}}
oTbr:aColSizes:= anTam

oTbr:nClrPane = { | nCol | if( acDatos[ oTbr:nAt, nCol ] = "X", CLR_HRED, CLR_WHITE ) }
oTbr:lCellStyle = .t.
oTbr:lAutoEdit = .f.
oTbr:lAutoSkip = .t.

* da error de acceso al array por motivo de la línea:
oTbr:nClrPane = { | nCol | if( acDatos[ oTbr:nAt, nCol ] = "X", CLR_HRED, CLR_WHITE ) }

* y si pongo:
oTbr:nClrPane = { | | if( acDatos[ oTbr:nAt, 7 ] = "X", CLR_HRED, CLR_WHITE ) }

me pinta la línea del listbox que tenga en la columna 7 de color rojo.

¿Que puedo hacer?

Un Saludo.

Re:

PostPosted: Tue Apr 29, 2008 4:29 pm
by softruz
Ya he conseguido hacerlo quitando:

oTbr:lCellStyle = .t.

Pero mi problema es que necesito seleccionar la casilla para hacer referencia a dicha celda, entonces si hago una cosa no puedo hacer otra, ¿que solución me puedes proponer?

Un Saludo.

PostPosted: Tue Apr 29, 2008 7:00 pm
by Antonio Linares
Si necesitas más prestaciones en el browse tienes que plantearte pasar a un browse más potente, como el TXBrowse ó el TCBrowse que soporta objetos columnas.

Tambien tienes el browse de Manuel Mercado y el de Hernan. Como ves hay varias posibilidades.

La clase TWBrowse está ideada para construir browses sencillos y muy rápidos, pero claro, no ofrece toda la funcionalidad de browses más potentes (y más complicados de usar).

Re:

PostPosted: Wed Apr 30, 2008 11:28 am
by softruz
Muy buenas, ante todo gracias Antonio, solo me falta que no me de error al ejecutar el bloque de código nCrlPane, es decir:

este bloque de código da error
oBrw:nClrPane = { | nCol | If( aValues[ oBrw:nAt, nCol ] == "Five", CLR_HRED, CLR_WHITE ) }

con lCellstyle:=.t.

como podría arreglar ese error en el listbox.

Un Saludo.

PostPosted: Wed Apr 30, 2008 11:30 am
by Antonio Linares
Que error te da ?

Re:

PostPosted: Wed Apr 30, 2008 11:43 am
by softruz
Error de acceso al array.

Un Saludo.