Colorear celdas en TWBrowse
Posted:
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.
Gracias
Posted:
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.
Posted:
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:
Posted:
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.
Posted:
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:
Posted:
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:
Posted:
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.
Posted:
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
Re:
Posted:
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:
Posted:
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.
Posted:
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:
Posted:
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.
Re:
Posted:
Wed Apr 30, 2008 11:43 am
by softruz
Error de acceso al array.
Un Saludo.