Colorear celdas en TWBrowse

softruz
Posts: 485
Joined: Fri Feb 09, 2007 10:34 am

Colorear celdas en TWBrowse

Post 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.
User avatar
Anderson.OL
Posts: 92
Joined: Thu Feb 15, 2007 11:37 am
Location: Itaocara - RJ - Brasil
Contact:

Post by Anderson.OL »

FiveWin 9.03 + xHarbour !!
softruz
Posts: 485
Joined: Fri Feb 09, 2007 10:34 am

Gracias

Post by softruz »

Anderson mi problema es pintar celdas individuales no filas, ¿Me podrías decir como lo puedo conseguir?

Un Saludo.
User avatar
Antonio Linares
Site Admin
Posts: 42520
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 75 times
Contact:

Post 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
regards, saludos

Antonio Linares
www.fivetechsoft.com
softruz
Posts: 485
Joined: Fri Feb 09, 2007 10:34 am

Re:

Post 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.
User avatar
Antonio Linares
Site Admin
Posts: 42520
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 75 times
Contact:

Post by Antonio Linares »

En base a que criterio (valor de un campo, posicion, etc.) quieres colorear una determinada celda ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
softruz
Posts: 485
Joined: Fri Feb 09, 2007 10:34 am

Re:

Post 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.
softruz
Posts: 485
Joined: Fri Feb 09, 2007 10:34 am

rE:

Post 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.
User avatar
Antonio Linares
Site Admin
Posts: 42520
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 75 times
Contact:

Post 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

#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
regards, saludos

Antonio Linares
www.fivetechsoft.com
softruz
Posts: 485
Joined: Fri Feb 09, 2007 10:34 am

Re:

Post 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.
softruz
Posts: 485
Joined: Fri Feb 09, 2007 10:34 am

Re:

Post 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.
User avatar
Antonio Linares
Site Admin
Posts: 42520
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 75 times
Contact:

Post 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).
regards, saludos

Antonio Linares
www.fivetechsoft.com
softruz
Posts: 485
Joined: Fri Feb 09, 2007 10:34 am

Re:

Post 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.
User avatar
Antonio Linares
Site Admin
Posts: 42520
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 75 times
Contact:

Post by Antonio Linares »

Que error te da ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
softruz
Posts: 485
Joined: Fri Feb 09, 2007 10:34 am

Re:

Post by softruz »

Error de acceso al array.

Un Saludo.
Post Reply