Página 1 de 10

cor no tbrowse

Enviado: 27 Mar 2017 16:58
por janio
Ola a todos,

Preciso destacar alguns itens num browse e ate q tem funcionado. O problema tem ocorrido qndo a barra luminosa chega no item com cor diferente e ao sair o item assume a cor padrao.

No caso em tela, tenho:
Letras PRETAS com fundo BRANCO
Item destacado: Letra VERMELHA com fundo BRANCO

Mas ao passar a barra pelo que tem a letra VERMELHA e sair, este assume a cor de todos os outros (preto com fundo branco). Gostaria q o item continuasse com letra VERMELHA depois de sair da barra luminosa.

Código: Selecionar todos

oBrw:colorspec := "N/W*,B/I,G+/B,R+/G*+,R/w*,G/2"
...

   for n := 1 to Len( aCampos )
      oCol := TBColumnNew( aCabecalho[n], &( "{||" + aCAMPOS[n] + "}" ) ) 
      oCol:Picture := aPict[n]
      oBrw:AddColumn(oCol)
     oBrw:GetColumn(n):ColorBlock :=  { || { if(FLGATV="N",5,1) } } 

   next 

cor no tbrowse

Enviado: 27 Mar 2017 22:13
por janio
Resolvi com:

Código: Selecionar todos

   for n := 1 to Len( aCampos )
      oCol := TBColumnNew( aCabecalho[n], &( "{||" + aCAMPOS[n] + "}" ) ) 
      oCol:Picture := aPict[n]
      oBrw:AddColumn(oCol)
		oBrw:GetColumn(n):ColorBlock :=  { || { if(FLGATV="N",5,1) } }
   next 
...

   While ( .t. )

	   if FLGATV = "N"
      	oBrw:colorrect({oBrw:rowpos,1,oBrw:rowpos,oBrw:colCount},{5,2})
	      do While ( !oBrw:stabilize() ) ; Enddo
	      oBrw:colorrect({oBrw:rowpos,1,oBrw:rowpos,oBrw:colCount},{2,2})
		Else
      	oBrw:colorrect({oBrw:rowpos,1,oBrw:rowpos,oBrw:colCount},{1,1})
	      do While ( !oBrw:stabilize() ) ; Enddo
	      oBrw:colorrect({oBrw:rowpos,1,oBrw:rowpos,oBrw:colCount},{2,2})
		Endif		

      If oBrw:Stable
...

cor no tbrowse

Enviado: 28 Mar 2017 10:26
por JoséQuintas
Veja se acha melhor assim:

Código: Selecionar todos

 While ( .t. )

   oBrw:colorrect({oBrw:rowpos,1,oBrw:rowpos,oBrw:colCount},iif( FLGATV=="N", {5,2}, { 1,1}))
   do While ( !oBrw:stabilize() ) ; Enddo
    oBrw:colorrect({oBrw:rowpos,1,oBrw:rowpos,oBrw:colCount},{2,2})
   If oBrw:Stable
...

cor no tbrowse

Enviado: 01 Jun 2021 15:43
por carlaoonline
Boa tarde !

MUDAR A COR NA LINHA DO DBEDIT()

Sei que o assunto é cor no TBrowse() mas caso alguém ainda queira continuar usando o DBedit() e acha que não seja possível colorir linhas individuais, segue um programinha exemplo de como eu fiz.

Em minha vida toda só desenvolvi apenas um sistema para uma firma, não sou programador profissional Nunca usei o TBrowse (até pq o sisteminha é muito simples e nunca precisei ir muito a fundo), mas mesmo sem usar o TBrowse () desenvolvi essas linhas de programação para mudar a cor da linha no DBedit() conforme a condição do registro.

Código: Selecionar todos

FUNCTION Main()

// By Carlos A. Desconsi

// Para quem quer colocar cores no Dbedit() e nao quer usar o TBrowse()


//  Compilar   hbmk2 prog  -b
//  -b    somente se quiser acompanhar o Debug passo a passo...

//HB_SETCODEPAGE( "PT850" )
//hb_langSelect( 'PT' )

   AltD( 1 )  
   SET SOFTSEEK OFF
   SET OPTIMIZE ON
   SET FIXED ON
   SET UNIQUE OFF    
   SET CONSOLE OFF   
   SET DELETED ON    
   SET SCOREBOARD OFF 
   SET EXCLU OFF
   SET CONFIRM ON
   SET ESCAPE ON      
   SET DATE BRITI     
   SET WRAP ON        
   SET EPOCH TO 2000  
   
   PUBLIC COR_MEN:= "B/W,W+/R,,,N/W"               // Cor dos menus
   PUBLIC COR_EDI:= "W+/BG,W/R,,,N/W"              // Cor da tela que edita registros
   PUBLIC COR_TAB:= "W/R,N/W,,,N/W"                // Cor da listagem em planilha no Dbedit()       
   PUBLIC COR_FUN:= "W+/B,W/B"                     // Cor de fundo
   PUBLIC CABECA:="Teste de Cor no Dbedit"




   SetColor( COR_FUN )
   Cls
   SetColor("n/w")   
   @ 0,0 Clear to  0,MaxCol()  
   @ 0, ( MaxCol()/2 ) - len(cabeca)/2 say cabeca
   @ MaxRow(),0 clear to  MaxRow(),MaxCol()     
   SetColor("w+/n*")      
   @ 05,05 Clear to 20,76      
   
   USE TESTE

   SetColor( COR_TAB )
   @ 04,03 to 19,74   
   nTop=05 ; nLeft=04 ; nBottom=18 ; nRight=73
   Declare vetor1[ fcount()]
   Afields(vetor1)

   DestacarLinhas=.T.  // Se deixar em .F. nao utiliza o recurso de cores diferentes...
   
   cNovaCor="A"  // Representa Letra azul e fundo Vermelho  no SetColor do SaveScreen
   // Faça testes colocando qualquer outro caractere para essa variavel cNovaCor e teras cores diferentes no destaque...
   
   DBEdit( nTop,nLeft,nBottom,nRight,vetor1,"f_lista")
   Quit
   
   
   
//
//
//
Function f_lista
Para Modo, Rec

     if modo<2

	    // Condicao para destacar linhas (pode ser adaptado para passar parametro em um CodeBlock se achar melhor)	 

        Quase_Um_tbrowse("VALOR_FIN<2000")       
        // Quase_Um_tbrowse("YEAR(VENCIMEN)<2019") 
		// Quase_Um_tbrowse(CHR(34)+"PINOQUIO"+CHR(34)+"$UPPER(NOME)")  // ->  "Pinoquio"$UPPER(NOME)
		// Quase_Um_tbrowse("VENCIMEN<=DATE() .AND. EMPTY(DATA_RECE)") 
        return 13
     endif

     if lastkey()=27
        return 0
     endif

     if lastkey()=13 

		A=vetor1[rec]
		rlock()
		@ ROW(),COL() GET &A 
		READ
		unlock
		keyboard( chr(4) )  // Ou outra tecla, apenas para atualizar a cor caso tenha mudado na edicao...

	 endif	

Return 13

Agora a função:

Código: Selecionar todos

//
// Se ficar muito lento em rede, vc pode estipular para entrar na funcao
// apenas quando mudar os dados da tela ( Quando fizer UPDATED() ou qdo passar com as setas alem do limite da tela: modo=1 .or. modo=2)
//

Function Quase_Um_Tbrowse(cCond)

   If DestacarLinhas  // Determina se executa ou nao a operacao...
         // Eh considerado que foi usada as variaveis -> dbedit(nTop,nLeft,nBottom,nRight...   
         nLinhaTop=nTop+2                        // Coordenada na tela (Linha) que comeca a listagem dos registros do DBedit() 
         nLinhaAtual:=Row()                      // Coordenada atual (Linha) do cursor
         nLinhaNoBrowse=nLinhaAtual-nLinhaTop+1  // Posicao relativa da linha do cursor dentro do DBedit() (Refrente as linhas de registros visiveis na tela)
         nLinhaTotal=( nBottom - nTop ) - 02     // Total de linhas no DBedit() que sao visiveis baseada na resolucao usada e nas coordenadas do DBedit()

         nRec=OrdKeyNo()                         // Registro corrente dento do indice
         nTotReg=OrdKeyCount()                   // Total de registros indexados
         nRecAtual=Recno()                       // Pega o registro atual para poder voltar depois.
         SKIP - (nLinhaNoBrowse-1)       // Ele volta para o primeiro registro da tela visivel, eh a diferenca da linha que ele esta pela do inicio do dbedit() na tela
         nLimite=IF(nLinhaTotal>nTotReg,nTotReg,nLinhaTotal)   // Vai percorrer da primeira linha do dbedit() na tela ate a ultima linha (visivel) ou ate o ultimo registro (o que for menor, pois pode ter menos registros do que a quantidade de linhas na tela do dbedi())
         FOR nLinhaAvaliada=1 to nLimite+1   
             IF &cCond  
                nLinhaSalva=SaveScreen(nLinhaTop-1+nLinhaAvaliada,nLeft,nLinhaTop-1+nLinhaAvaliada,nRight)  // Salva a linha avaliada com SaveScreen
                nTamanho=len(nLinhaSalva)
                FOR nL=1 to nTamanho+1 STEP 2
                    IF !SubStr(nLinhaSalva,nL,1)=Chr(179)  // Somente se NAO for o SEPARADOR de colunas...
                       // alterne as linhas abaixo para ver...					
                       nLinhaSalva=Left(nLinhaSalva,nL)+cNovaCor+Right(nLinhaSalva,(nTamanho-nL)-1)  // Substitui a cor atual pela nova cor na variavel salva com SaveScreen
                       // nLinhaSalva=Left(nLinhaSalva,nL)+chr(nl+59)+Right(nLinhaSalva,(nTamanho-nL)-1)  					   
                    ENDIF
                NEXT
                restscreen(nLinhaTop-1+nLinhaAvaliada,nLeft,nLinhaTop-1+nLinhaAvaliada,nRight,nLinhaSalva)  // Devolve a linha salva com a cor modificada.
             ENDIF
             SKIP
         NEXT
         GO nRecAtual    // Volta para o registro que estava originalmente.
		 
	     A=vetor1[rec]
	     @ ROW(),COL() SAY &A COLOR(COR_MEN)
	     KEYBOARD( CHR(INKEY(0)) )
		 
   Endif		 
return		 
  
Seguindo essa mesma linha de raciocínio (linha de raciocínio esquisita, pois o correto é usar o TBrowse() ), é possível colorir uma coluna individualmente (através da coordenada do cabeçalho do campo), um único campo de um único ou vários registros, ambos na cor que quiser ou cada um em uma cor.....como se fosse um TBrowse() , mas é mais a título de curiosidade pois não deixa de ser um "Andar pra trás", uma vez que o TBrowse faz tudo isso de forma mais prática....


Use um arquivo DBF qualquer, apenas na linha da condição, coloque a condição conforme os campos do arquivo que vc usar.

Baixem e vejam só pro curiosidade: DBEDIT() COM LINHAS COLORIDAS.

cor no tbrowse

Enviado: 18 Jul 2021 00:12
por cjp
Boa noite a todos.
Estou precisando usar cor no tbrowse, apenas no caso de o conteúdo de um campo conter certa string.
Verifiquei o exemplo deste post, mas não consegui adaptar para o caso que eu preciso.
Alguém pode me ajudar?
O tbrowse que tenho é de uma tabela em MySQL, com 6 campos e uns 20 registros. Preciso que apenas um dos campos fique com cor diferente, e apenas na linha que contém a palavra 'Total'.

cor no tbrowse

Enviado: 19 Jul 2021 14:01
por alxsts
Olá!
cjp escreveu:Preciso que apenas um dos campos fique com cor diferente, e apenas na linha que contém a palavra 'Total'.
Solicitação esquisita...

A palavra "Total" está no meio dos dados?
Tem alguma posição fixa ou é variável?
É um cabeçalho de coluna?
É apenas uma ocorrência ou podem existir várias espalhadas pelo tbrowse?
Quando é que ele tem que ficar com a cor diferente? Sempre? Ou quando o cursor do tbrowse estiver em cima da célula que contém a palavra "Total"?
Como está definindo este tbrowse?
Pode postar exemplo do que está fazendo?
Pode postar um print do tbrowse?

cor no tbrowse

Enviado: 20 Jul 2021 01:42
por cjp
Solicitação esquisita...

A palavra "Total" está no meio dos dados?
Sim, a a palavra está no meio dos dados (vide imagem anexa).
Tem alguma posição fixa ou é variável?
É variável, de acordo com o horário.


É um cabeçalho de coluna?
Não.

É apenas uma ocorrência ou podem existir várias espalhadas pelo tbrowse?
Tem 3 a 5 ocorrências por dia.


Quando é que ele tem que ficar com a cor diferente? Sempre? Ou quando o cursor do tbrowse estiver em cima da célula que contém a palavra "Total"?
Sempre que tiver a palavra Total.

Como está definindo este tbrowse?
Pode postar exemplo do que está fazendo?
Segue a parte do código que interessa (já que a mesma função é usada para vários tbrowses):

Código: Selecionar todos

function conspontodata
		 private dt :=date()
		 
		 if seconds()<8000
		    dt=dt-1
		 endif
		 
		 @ 20,80 say "Data:"get dt
		 read
		 
		 if lastkey()#27
            consado("select data,hora,comida,quantidade,pontos,id from pontos where data='"+dtsql(dt)+"' order by hora")
		 endif	
return


function consado(sql,or,modo,coluna,prov)
         #include "tbrowse.ch"
		 local cSair :="N"
         LOCAL oColumn, I, nLen, oTBrowse, oRs, cod, prd, prmax
	        @ 22,25 say "Abrindo consulta..."
		 
		 do while .t.
		    if !AdoConecta(nProvAqui,7)
		       ?"Não conseguiu conectar; tente novamente mais tarde"
			   inkey(5)
			   return .f.
	        else
               oRS := Conexao:Execute( sql )
		    endif
	  
            if oRS:Eof()
	           @ 22,25 say "Não há nenhum item   "
		       inkey(11)
		       inkey(11)
	           return .f.
	        endif

            cls

      oTBrowse:goTopBlock    := { || oRs:moveFirst() }
      oTBrowse:goBottomBlock := { || oRs:moveLast() }
      oTBrowse:skipBlock     := { | n | ADORecordSetSkipper( oRs, n ) }
      oTBrowse:HeadSep       := Chr(196)
      oTBrowse:ColSep        := Chr(179)
      oTBrowse:FootSep       := ""
	  
      nLen := oRs:fields():count() - 1
	  
	         If procname(1)="CONSPONTO"
		        IF upper(oRs:fields(i):name)="COMIDA"
		           nFieldLen := 47
		        ELSEIF upper(oRs:fields(i):name)="QUANTIDADE"
		           nFieldLen := 18
		        ELSEIF upper(oRs:fields(i):name)="PONTOS"
		           nFieldLen := 12
		        ELSEIF upper(oRs:fields(i):name)="ID"
		           nFieldLen := 9
				Endif
			 Endif
			 
             oTBrowse:addColumn( oColumn )
		 
         NEXT
	  
	  Endif

   DO WHILE .T.
      vez++
      oTBrowse:forceStable()
*      oTBrowse:ColorRect( { oTBrowse:RowPos, oTBrowse:LeftVisible, oTBrowse:RowPos, oTBrowse:RightVisible }, { 2, 1 } )
*      oTBrowse:ColorRect( { oTBrowse:rowPos, oTBrowse:colPos, oTBrowse:rowPos, oTBrowse:colPos }, { 3, 2 } )
      oTBrowse:refreshCurrent()
	  
	  
      nKey := Inkey(0)
	  
	  elseif nkey ==13 .and. "CONSPONTO"$procname(1)
	         nPt=0
	         @ maxrow()-10,35 say "Pontos:"get nPt pict "999.99"
			 read 
			 if lastkey()#27
			    exqado("update pontos set pontos="+alltrim(str(nPt))+" where id="+alltrim(str(cod)))
			 endif
			 
	  elseif upper(chr(nkey)) =="C" .and. "CONSPONTO"$procname(1)
	         dDt=date()  //oRs:Fields("data"):Value
	         cHr=time()  //oRs:Fields("hora"):Value
	         cCom=oRs:Fields("comida"):Value
	         cQuant=oRs:Fields("quantidade"):Value
	         nPt=oRs:Fields("pontos"):Value
			 
			 @ maxrow()-5,25 say "Nova data:"get dDt
             @ maxrow()-4,25 say "Nova hora:"get cHr pict "99:99:99"
			 read
			 if lastkey()#27
				exqado("insert into pontos (data,hora,comida,quantidade,pontos) values ('"+dtsql(dDt)+"','"+cHr+"','"+cCom+"','"+cQuant+"',"+alltrim(str(nPt))+")")
			 endif
			 
	  elseif upper(chr(nkey)) =="A" .and. "CONSPONTO"$procname(1)
	         dDt=oRs:Fields("data"):Value
	         cHr=oRs:Fields("hora"):Value
	         @ maxrow()-5,25 say "Nova data:"get dDt
			 @ maxrow()-3,25 say "Nova hora:"get cHr
			 read 
			 if lastkey()#27
			    exqado("update pontos set data='"+dtsql(dDt)+"',hora='"+cHr+"' where id="+alltrim(str(cod)),3)
			 endif
			 
	  elseif upper(chr(nkey)) =="Q" .and. "CONSPONTO"$procname(1)
	         cQuant=oRs:Fields("quantidade"):Value+space(15)
	         @ maxrow()-5,25 say "Nova quantidade:"get cQuant
			 read 
			 if lastkey()#27
			    exqado("update pontos set quantidade='"+alltrim(cQuant)+"' where id="+alltrim(str(cod)),3)
			 endif
			 
	  elseif upper(chr(nkey)) =="M" .and. "CONSPONTO"$procname(1)
	         cCom=oRs:Fields("comida"):Value+space(15)
	         @ maxrow()-5,25 say "Comida:"get cCom
			 read 
			 if lastkey()#27
			    exqado("update pontos set comida='"+alltrim(cCom)+"' where id="+alltrim(str(cod)),3)
			 endif
			 
	  elseif upper(chr(nkey)) =="E" .and. "CONSPONTO"$procname(1)
	         conf="N"
	         @ maxrow()-5,25 say "Confirma exclusão?"get conf pict "@!"
			 read 
			 if conf="S"
			    if exqado("delete from pontos where id="+alltrim(str(cod)),3)
				   @ maxrow()-1,5 say "Excluído com sucesso"
				   inkey(3)
				endif
			 endif
			 
	  
      IF oTBrowse:applyKey( nKey ) == TBR_EXIT
	     cSair="S"
         EXIT
      ENDIF
   ENDDO
   
   
   if cSair="S"
      exit
   endif
   enddo

   oRs:Close()
   Conexao:Close()
return .t.

FUNCTION ADORecordSetFieldBlock( oRs, i, xVal )

   LOCAL bRet

   IF xVal == NIL
      IF oRs:eof()
         bRet := { || Space( Max( oRs:Fields( i ):DefinedSize , Len( oRs:Fields( i ):name ) ) ) }
      ELSE
         bRet := { || oRs:Fields( i ):value }
      ENDIF
   ELSE
      bRet := { |xVal| oRs:Fields( i ):Value := xVal }
   ENDIF

   RETURN bRet

FUNCTION ADORecordSetSkipper(oRecordSet,nSkip)

   LOCAL nRec := oRecordSet:AbsolutePosition

   IF ! ( oRecordSet:eof )
      oRecordSet:Move( nSkip )
      IF oRecordSet:eof
         oRecordSet:moveLast()
      ENDIF
      IF oRecordSet:bof
         oRecordSet:moveFirst()
      ENDIF
   ENDIF

RETURN (oRecordSet:AbsolutePosition - nRec)

Pode postar um print do tbrowse?
Segue no anexo.

cor no tbrowse

Enviado: 21 Jul 2021 02:21
por alxsts
Olá!
cjp escreveu:Tem alguma posição fixa ou é variável?
É variável, de acordo com o horário.
Pelo que vi na imagem, é sempre na coluna que tem o cabeçalho "comida". Portanto, sempre acontece na coluna 3 do browse. O caminho é este:

Código: Selecionar todos

IF Upper(oRs:fields(i):name)=="COMIDA"
   oColumn:width := 47
   oColumn:colorBlock := { |x| If( At( "TOTAL ", Upper(x) ) > 0, { 3, 2 }, { 1, 2 } ) }
Endif

oTBrowse:addColumn( oColumn )
Adapte aí ao teu código.

cor no tbrowse

Enviado: 21 Jul 2021 09:42
por cjp
Funcionou em parte, acho que porque eu não soube adaptar.
Imagino que o x deva ser para colocar a cor desejada, correto? Fiz vários testes, mas não consegui, só fica preto.
Além disso, ele está colocando todo o campo em preto. Gostaria que apenas a letra ficasse em vermelho. Imagino que deve ter uma forma de definir isso, mas não sei como. Pode me ajudar?

cor no tbrowse

Enviado: 22 Jul 2021 01:49
por alxsts
Olá!
cjp escreveu:Imagino que o x deva ser para colocar a cor desejada, correto?
Errado. É o dado a ser exibido na célula do TBrowse.
cjp escreveu:Gostaria que apenas a letra ficasse em vermelho. Imagino que deve ter uma forma de definir isso, mas não sei como.
Isto está ligado à propriedade colorSpec do TBrowse.

Código: Selecionar todos

LOCAL cColor, oTbrowse

SetBlink( .F. )
cColor  := "W+/R,G+/W,RG+/B,BG+/G,N/GR,GR+/BG,R+/W*"
//            1    2     3     4    5     6     7

oTbrowse:colorSpec := cColor
Note a variável cColor. É uma string contendo 7 pares de configurações de cores. Poderia ser qualquer outro número ao invés de sete.

Código: Selecionar todos

IF Upper(oRs:fields(i):name)=="COMIDA"
   oColumn:width := 47
   oColumn:colorBlock := { |x| If( At( "TOTAL ", Upper(x) ) > 0, { 3, 2 }, { 1, 2 } ) }
Endif

oTBrowse:addColumn( oColumn )
O código que repito acima, mostra a configuração do objeto coluna (TbColumn) para a coluna "comida" do teu TBrowse. Como eu disse, o x é o valor (conteúdo de dados que tem na célula) da célula da coluna "comida" de uma linha do TBrowse. Se dentro deste valor da célula estiver a string "TOTAL ", vão ser usados os pares de cores 3 e 2 da especificação de cores do TBrowse (oTbrowse:colorSpec). Caso contrário, vão ser usados os pares de cores 1 e 2 da especificação de cores do TBrowse (oTbrowse:colorSpec). No oTbrowse:colorSpec acima, "W+/R,G+/W" é para onde aponta o par {1,2}. O TBrowse usa a primeira cor do par para pintar os cabeçalhos de coluna e os dados do TBrowse. A segunda cor é usada para pintar a célula em destaque, aquela em que o cursor está posicionado.
cjp escreveu:Gostaria que apenas a letra ficasse em vermelho. Imagino que deve ter uma forma de definir isso
Defina um par de cores com letra vermelha sobre uma cor de fundo que quiser. Depois associe esta cor à coluna "comida" usando

Código: Selecionar todos

oColumn:colorBlock := { |x| If( At( "TOTAL ", Upper(x) ) > 0, { 7, 7 }, { 1, 2 } ) }
Note que no oTbrowse:colorSpec acima, a sétima cor é letra vermelha em fundo branco. Por isto, quando existir a palavra "TOTAL " na célula "comida", aplico o par {7,7}. Este par vai pintar a céluma com a mesma cor, estando ou não a célula em destaque.

Espero que tenha entendido alguma coisa. Teste aí

PS: não fique imaginando. Pesquise, estude, entenda como funciona...

cor no tbrowse

Enviado: 22 Jul 2021 11:37
por cjp
Peço desculpa pelas perguntas tão básicas, mas é que realmente não entendo praticamente nada de Tbrowse (até gostaria de te pedir indicação de algum livro ou coisa assim em que eu pudesse estudar melhor isto; vi no xHarbour Language Reference Guide que tem o Tbrowse, e até tem a colorspec, mas não me ajudou muito).

Entendi o que vc falou, mas ainda não funcionou, não sei porquê. Testei, está entrando no If, portanto, está executando o oColumn:colorBlock. Mas não altera a cor da letra.

Conferi que estou fazendo exatamente como vc mencionou:

Código: Selecionar todos

                   oColumn:colorBlock := { |x| If( At( "TOTAL ", Upper(x) ) > 0, { 7, 7 }, { 1, 2 } ) }

cor no tbrowse

Enviado: 22 Jul 2021 12:09
por alxsts
Olá!

Poste o código. Só uma linha é insuficiente...
cjp escreveu: indicação de algum livro ou coisa assim em que eu pudesse estudar melhor isto
Ainda nos anos 1990 li o livro Programacao Orientada ao Objeto Em Clipper 5.0 - Marcelo Ferreira e Flavio J. Jarabeck Este livro mudou totalmente a minha forma de programar em Clipper 5. Foi onde aprendi TBrowse e code blocks. Neste link tem um exemplar a venda por 10 reais mais o frete.

cor no tbrowse

Enviado: 03 Ago 2021 10:17
por cjp
A função inteira é muito grande, porque ela serve para muitas aplicações minhas. Não sei se adiantaria publicar tudo aqui.

O trecho em questão está:

Código: Selecionar todos

	         If procname(1)="CONSPONTO"
		        IF upper(oRs:fields(i):name)="COMIDA"
		           nFieldLen := 47
                   oColumn:colorBlock := { |x| If( At( "TOTAL ", Upper(x) ) > 0, { 7, 7 }, { 1, 2 } ) }
		        ELSEIF upper(oRs:fields(i):name)="QUANTIDADE"
		           nFieldLen := 18
		        ELSEIF upper(oRs:fields(i):name)="PONTOS"
		           nFieldLen := 12
		        ELSEIF upper(oRs:fields(i):name)="ID"
		           nFieldLen := 9
				Endif
			 Endif
Como disse antes, está entrando no colorBlock, já testei.

Agradeço a indicação do livro, já estou providenciando a compra. Certamente me será muito útil.

cor no tbrowse

Enviado: 03 Ago 2021 10:44
por JoséQuintas
Essa rotina de browse vai ficar cada vez mais complicada/perigosa de ser mexida.
Deveria ter feito como falei há tempos atrás, de deixar na rotina genérica somente o que é genérico.
À primeira vista, essa parte está correta.

cor no tbrowse

Enviado: 03 Ago 2021 13:12
por alxsts
Olá!

Veja:
Capturar.JPG
Segue o código. Estude, adapte à tua necessidade e informe se funcionou.

Código: Selecionar todos

/*
        Exibição das linhas de um Record set ADO usando TBrowseDB()
        Alexandre Santos
        Compilar: Hbmk2 tbado hbwin.hbc
*/

#include "tbrowse.ch"
#include "inkey.ch"
#include "setcurs.ch"
#include "hbgtinfo.ch"
#include "box.ch"
#include "set.ch"
#include "ado.ch"

// Default column separator
#define DEF_CSEP  " " + chr(179) + " "

// Default heading separator
#define DEF_HSEP chr(196) + chr(194) + chr(196)

// Default footing separator
#define DEF_FSEP chr(196) + chr(193) + chr(196)

FUNCTION Teste()

   LOCAL oCn, oRs, oColumn, oTbr As Object
   LOCAL i, nLen, nKey, nOldCursor As Numeric
   LOCAL cCnString as Character
   LOCAL bErr := ErrorBlock( __BreakBlock() ), oErr

   REQUEST HB_LANG_PT          
   REQUEST HB_CODEPAGE_PTISO
   REQUEST HB_GT_WVT_DEFAULT
   REQUEST HB_GT_WIN

   HB_CDPSELECT("PTISO")
   
   BEGIN SEQUENCE

      SetUp()

      /*
           Ajuste aqui a connection string conforme o banco
           Ou pequise aqui...: https://www.connectionstrings.com/
      */
      
      cCnString := "DRIVER={MariaDB ODBC 3.1 Driver};TCPIP=1;SERVER=localhost;Database=test;UID=root;PWD=root;PORT=3306"

      oCn := win_OleCreateObject("ADODB.Connection")

      oCn:ConnectionString := cCnString
      oCn:CursorLocation := adUseClient
      oCn:Mode := adModeReadWrite

      oCn:open()
      
      DispOutAt( MaxRow(), 4, PadR( "Obtendo informações... ",22 ), "W/W" )

      oRs := oCn:Execute( "SELECT * FROM tbDieta;" )

      IF oRs != NIL .And. oRs:state = adStateOpen
         oTbr := TBrowse():new( 02, 3, MaxRow() - 3, MaxCol() - 3 )

         // Separators
         oTbr:headSep   := DEF_HSEP
         oTbr:colSep    := DEF_CSEP
         oTbr:footSep   := DEF_FSEP

         // Navigation code blocks for Record Set
         oTbr:goTopBlock    := { || oRs:moveFirst() }
         oTbr:goBottomBlock := { || oRs:moveLast() }
         oTbr:skipBlock     := { |n| ADORecordSetSkipper( oRs,n ) }

         // Colors
         oTbr:colorSpec := "N/W, W+/N,N/W*,W+/R,R/W,R/W*"

         // create TBColumn objects and add them to TBrowse object - zero based
         nLen := oRs:fields():count() - 1

         FOR i := 0 TO nLen
            // add code block for individual columns of the record set
            oColumn := TBColumnNew( oRs:fields(i):name(), ADORecordSetFieldBlock( oRs, i ) )
            // Column widths. For some data types, definedSize returns -1...
            oColumn:width := Max( Min( oRs:Fields(i):definedSize,50), Len( oRs:fields(i):name ) ) + 5

            If i==2  // coluna 3
               oColumn:width := 25
               oColumn:colorBlock := { |x| If( At( "TOTAL ", Upper(x) ) > 0, { 5, 5 }, { 1, 2 } ) }
            Endif

            // Add new column to TBrowse
            oTbr:addColumn( oColumn )
         NEXT

         // border
         DispBox( oTbr:nTop - 1, oTbr:nLeft - 1, oTbr:nBottom + 3, oTbr:nRight + 1, B_SINGLE )
         
         nOldCursor := SetCursor( SC_NONE )

         IF ( oRs:eof() )
            DispOutAt( Int( ( oTbr:nBottom - oTbr:nTop ) / 2 ), oTbr:nLeft + 2, ;
                 PadC( "Não há dados disponíveis para exibição.", Int( oTbr:nRight - oTbr:nLeft ) - 2 ), "W+/RB" )
            __Quit()
         ENDIF

         DO WHILE .T.

            oTbr:forceStable()

            // Paint TBrowse current line...
            oTbr:ColorRect( { oTbr:RowPos, oTbr:LeftVisible, oTbr:RowPos, oTbr:RightVisible }, { 2, 1 } )
            // ... and current cell in different colors
            If oTbr:colPos == 3 .And. At( "TOTAL ", Upper( Eval( oTBr:getColumn( 3 ):block ) ) ) > 0 
               oTbr:ColorRect( { oTbr:rowPos, oTbr:colPos, oTbr:rowPos, oTbr:colPos }, { 6, 6 } )
            Else
               oTbr:ColorRect( { oTbr:rowPos, oTbr:colPos, oTbr:rowPos, oTbr:colPos }, { 3, 2 } )
            Endif

            oTbr:refreshCurrent()

            DispOutAt( MaxRow() - 1, 3, PadR( " Registro " + Ltrim( Str( oRs:AbsolutePosition ) ) + " de " + Ltrim( Str( oRs:recordCount ) ) + " ", 20 ), "N/W" )
            
            nKey := Inkey(0)

            IF oTbr:applyKey( nKey ) == TBR_EXIT
               If Alert( "Fechar?", { " Não ", " Sim " }, "W+/N" ) == 2
                  EXIT
               Endif
            ENDIF
         ENDDO
      ELSE
         Hb_Alert( "Não foi possível obter dados para exibição.",, "W+/B" )
      ENDIF
   RECOVER USING oErr
      hb_Alert(  { PadC( "*** Uma exceção não tratada foi encontrada ***", 50 ), ;
                   Replicate( "_", 50 ), "", ;
                   PadR( " Erro       : " + oErr:description, 50 ), ;
                   PadR( " Operação   : " + oErr:operation, 50 ), ;
                   PadR( " Subsistema : " + oErr:subsystem, 50 ), ;
                   PadR( " Subcódigo  : " + LTrim( Str( oErr:subcode ) ), 50 ), ;
                   PadR( " Programa   : " + ProcFile(), 50 ), ;
                   PadR( " Procedure  : " + ProcName(), 50 ), ;
                   PadR( " Linha      : " + LTrim( Str( ProcLine() ) ), 50 ), "", "", ;
                   Replicate( "_", 50 ), "" },, "W+/N" )
   ALWAYS
      If oRs != NIL .And. oRs:state() = adStateOpen
         oRs:close()
      Endif

      If oCn != NIL .And. oCn:state = adStateOpen
         oCn:close()
      Endif

      oCn := NIL
      oRs := NIL
      SetCursor( nOldCursor )
      ErrorBlock( bErr )
   END SEQUENCE
   
   CLS
   
RETURN NIL
//------------------------------------------------------------------------------

STATIC FUNCTION SetUp()
   LOCAL nHeight := 20
   LOCAL nWidth  := Int( nHeight / 2 )

   SetMode(32, 120)
   SetBlink( .F. )

   Set( _SET_DELETED, .T. )
   Set( _SET_EXACT, .T. )
   Set( _SET_EPOCH, Year( Date() - 90 ) )
   Set( _SET_DATEFORMAT, "DD/MM/YYYY" )

   #ifdef _SET_EVENTMASK 
      Set( _SET_EVENTMASK, INKEY_ALL + HB_INKEY_GTEVENT - INKEY_MOVE )
      MSetCursor( .t. ) 
   #endif

   hb_gtInfo( HB_GTI_WINTITLE , "Testes TBrowse colorBlock() com Acesso ao MySQL via ADO" )
   hb_gtInfo( HB_GTI_ALTENTER, .T. )  // allow <Alt-Enter> for full screen
   hb_gtinfo( HB_GTI_SELECTCOPY, .T.)
   hb_gtInfo( HB_GTI_CLOSABLE, .F. )
   hb_gtinfo( HB_GTI_RESIZABLE, .T.)

   Do Case 
      Case hb_gtinfo( HB_GTI_DESKTOPWIDTH) > 1023
           hb_gtinfo( HB_GTI_SCREENWIDTH, 960)
           hb_gtinfo( HB_GTI_SCREENHEIGHT, 512)
           hb_gtinfo( HB_GTI_FONTWIDTH, 10)
           hb_gtinfo( HB_GTI_FONTSIZE,  22)
      Case hb_gtinfo( HB_GTI_DESKTOPWIDTH) > 799
           hb_gtinfo( HB_GTI_SCREENWIDTH, 640)
           hb_gtinfo( HB_GTI_SCREENHEIGHT, 400)
           hb_gtinfo( HB_GTI_FONTWIDTH, 12)
           hb_gtinfo( HB_GTI_FONTSIZE,  27)
      Otherwise
           hb_gtinfo( HB_GTI_FONTWIDTH, 8)
           hb_gtinfo( HB_GTI_FONTSIZE, 17)
   Endcase

   hb_gtInfo( HB_GTI_FONTNAME , "Lucida Console" )
   hb_gtInfo( HB_GTI_FONTWIDTH, nWidth  )
   hb_gtInfo( HB_GTI_FONTSIZE , nHeight )

RETURN NIL
//------------------------------------------------------------------------------

STATIC FUNCTION ADORecordSetFieldBlock( oRs, i, xVal )

   LOCAL bRet

   IF xVal == NIL
      If oRs:eof()
         bRet := { || Space( Max( oRs:Fields( i ):DefinedSize , Len( oRs:Fields( i ):name ) ) ) }
      Else
         bRet := { || oRs:Fields( i ):value }
      Endif   
   Else 
      bRet := { |xVal| oRs:Fields( i ):Value := xVal }
   ENDIF

   RETURN bRet
//------------------------------------------------------------------------------

STATIC FUNCTION  ADORecordSetSkipper(oRecordSet,nSkip)

   LOCAL nRec := oRecordSet:AbsolutePosition

   IF ! ( oRecordSet:eof )
      oRecordSet:Move( nSkip )

      IF oRecordSet:eof
         oRecordSet:moveLast()
      ENDIF

      IF oRecordSet:bof
         oRecordSet:moveFirst()
      ENDIF
   ENDIF

RETURN (oRecordSet:AbsolutePosition - nRec)
//------------------------------------------------------------------------------
STATIC FUNCTION Rgb( r, g, b )
RETURN ( r + ( g * 256 ) + ( b * 256 * 256 ) )
//------------------------------------------------------------------------------
Criação e população da tabela:

Código: Selecionar todos

CREATE TABLE tbDieta ( data date,
                       hora varchar(8),
                       comida varchar(30),
                       quantidade varchar(10),
                       pontos decimal(6,2),
                       id int(6)
);

INSERT INTO tbDieta (data, hora, comida, quantidade, pontos, id) 
VALUES 
('2021-07-20', '09:56:12', 'leite',  '1 copo', 5.0, 26692 ),
('2021-07-20', '09:56:42', 'café', '1 xícara', 1.0, 26692 ),
('2021-07-20', '11:29:00', 'Total do café da manhã', '', 6.0, 26844 ),
('2021-07-20', '12:56:55', 'arroz', '50g', 10.0, 26692 ),
('2021-07-20', '12:57:15', 'feijão', '30g', 5.0, 26692 ),
('2021-07-20', '12:57:26', 'carne', '50g', 20.0, 26692 ),
('2021-07-20', '13:59:00', 'Total do almoço', '', 35.0, 26844 ),
('2021-07-20', '16:57:34', 'pão', '1', 30.0, 26693 ),
('2021-07-20', '16:58:10', 'leite', '1 copo', 5.0, 26693 ),
('2021-07-20', '19:59:00', 'Total do lanche da tarde', '', 35.0, 26844 ),
('2021-07-20', '21:58:27', 'lasanha', '100g', 100.0, 26693 ),
('2021-07-20', '23:59:00', 'Total da janta',  '', 100.0, 26845 ),
('2021-07-20', '23:59:05', 'Total de pontos',  '', 176.0, 26845 );
Peguei os dados da imagem postada acima pelo Inácio, usando o On Line OCR. Interessante...