Clipper On Line • Ver Tópico - cor no tbrowse

cor no tbrowse

Projeto Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

 

cor no tbrowse

Mensagempor janio » 27 Mar 2017 16:58

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.

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
Anexos
cor.png
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar de usuário

janio
Colaborador

Colaborador
 
Mensagens: 1835
Data de registro: 06 Jul 2004 07:43
Cidade/Estado: UBAJARA - CE
Curtiu: 8 vezes
Mens.Curtidas: 68 vezes

cor no tbrowse

Mensagempor janio » 27 Mar 2017 22:13

Resolvi com:

   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
...
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar de usuário

janio
Colaborador

Colaborador
 
Mensagens: 1835
Data de registro: 06 Jul 2004 07:43
Cidade/Estado: UBAJARA - CE
Curtiu: 8 vezes
Mens.Curtidas: 68 vezes

cor no tbrowse

Mensagempor JoséQuintas » 28 Mar 2017 10:26

Veja se acha melhor assim:

 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
...
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18158
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

cor no tbrowse

Mensagempor carlaoonline » 01 Jun 2021 15:43

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.

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:

//
// 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.
Avatar de usuário

carlaoonline
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 190
Data de registro: 24 Ago 2014 22:38
Cidade/Estado: Porto Alegre-RS
Curtiu: 73 vezes
Mens.Curtidas: 22 vezes

cor no tbrowse

Mensagempor cjp » 18 Jul 2021 00:12

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'.
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1531
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

cor no tbrowse

Mensagempor alxsts » 19 Jul 2021 14:01

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?
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2945
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

cor no tbrowse

Mensagempor cjp » 20 Jul 2021 01:42

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):

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.
Anexos
total.png
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1531
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

cor no tbrowse

Mensagempor alxsts » 21 Jul 2021 02:21

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:
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.
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2945
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

cor no tbrowse

Mensagempor cjp » 21 Jul 2021 09:42

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?
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1531
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

cor no tbrowse

Mensagempor alxsts » 22 Jul 2021 01:49

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.
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.
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
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...
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2945
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

cor no tbrowse

Mensagempor cjp » 22 Jul 2021 11:37

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:

                   oColumn:colorBlock := { |x| If( At( "TOTAL ", Upper(x) ) > 0, { 7, 7 }, { 1, 2 } ) }
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1531
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

cor no tbrowse

Mensagempor alxsts » 22 Jul 2021 12:09

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.
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2945
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

cor no tbrowse

Mensagempor cjp » 03 Ago 2021 10:17

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á:

            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.
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1531
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

cor no tbrowse

Mensagempor JoséQuintas » 03 Ago 2021 10:44

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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18158
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

cor no tbrowse

Mensagempor alxsts » 03 Ago 2021 13:12

Olá!

Veja:

Capturar.JPG


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

/*
        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:
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...
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2945
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Próximo



Retornar para Harbour

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 4 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro