Duvida com Tbrowse

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

Moderador: Moderadores

frazato
Usuário Nível 3
Usuário Nível 3
Mensagens: 219
Registrado em: 08 Jul 2004 07:45

Duvida com Tbrowse

Mensagem por frazato »

Boa tarde!

Estou montando uma tela de monitoramento de produto e nele estou usando 3 dbfs ao mesmo tempo, para alimentar as colunas tenho uma função que retorna os valores de cada dbfs, esta um pouco lento, mais até ai tudo bem, porque o usuario nao fica rolando muito a tela, mais gostaria de fazer as colunas/celulas mudarem de cor, quando usando os dados de um dbf e simples, mais a minha duvida e a seguinte, como faço para pegar o valor corrente de uma coluna , ja que esta coluna e resultado de uma funcao, nao um registro.



Obrigado.


Frazato
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Duvida com Tbrowse

Mensagem por alxsts »

Saudações a todos.

Caro Frazato, não conheço [x]Harbour e sim Clipper mas, como é xBase, vou tentar te ajudar:

Para pegar o valor de uma coluna de um TBrowse, voce precisa pegar primeiro o objeto coluna (oTb:getColumn( <posição da coluna>)) e depois executar o block da coluna. Veja um exemplo de código:

Código: Selecionar todos

   // cria TBrowse
   oTb := TBrowseNew( 0, 0, MaxRow(), MaxCol() )

   // adiciona algumas colunas
   oTb:addColumn(TBColumnNew( "Placa",    FieldBlock( "VEICULO->IDPLACA" ) ) )
   oTb:addColumn(TBColumnNew( "Marca", { || Left( VEICULO->NMMARCA, 15 ) } ) )
   oTb:addColumn(TBColumnNew( "Cor",{ || VEICULO->CDCOR } ) )

   // estabelece a largura da coluna Cor
   oTb:getColumn(3):width := 9

   oTb:addColumn(TBColumnNew( "Usu rio", { || PadR( Left( VEICULO->CDUSUINC, 3 ), 4 ) } ) )
   oTb:addColumn(TBColumnNew( "Status",  { || If( VEICULO->FGATIVO == "A", "Ativo", If( VEICULO->FGATIVO == "I", "Inativo", "" ) ) } ) )
   // estabelece a largura do campo Status
   oTb:getColumn(5):width := 7

   oTb:gobottomblock := {||dbgobottom()}
   oTb:gotopblock := {||dbgotop()}
   oTb:skipblock := {|n|dskip(n)}
   oTb:headSep := DEF_HSEP
   oTb:colSep  := DEF_CSEP
   oTb:footSep := DEF_FSEP
   oTb:colorSpec := SetTBColorSpec( oTb, 1 )

   // ajusta a coluna de cor para refletir a cor do veiculo
   oTb:getColumn(3):colorBlock := { |x| SetTBColorSpec( oTb, 2, x ) }

   // executa estabilização
   oTb:forceStable()

   // obtem o objeto coluna onde o TBrowse estiver posicionado
   oCol := oTb:getColumn(oTb:colPos)

   // obtem o valor da célula (dados) onde o TBrowse estiver posicionado
   xVar := Eval(oCol:block)

Pelo que voce postou, o teu problema não é este e sim exibir uma célula colorida conforme uma regra. Para isso, voce precisará contruir uma função que execute essa regra e devolva um array com um par de números. Essa função deverá ser colocada no colorBlock do objeto coluna desejado e obrigatóriamente deverá retornar um array com um par de números inteiros que apontará para a variável de instancia do TBrowse, chamada colorSpec. Durante a estabilização o TBrowse executará o code block colocado em colorBlock e pintará a célula conforme a referencia ao colorSpec referenciada pelo par de números do array. Abaixo, repito o código já postado acima. Nele ajusto o colorBlock para executar a função SetTBColorSpec( ), para a coluna 3 do TBrowse, a cada estabilização. Note que o code block recebe um parametro x, que é repassado para a função. Esse parametro contem o dado da coluna.

Código: Selecionar todos

   // ajusta a coluna de cor para refletir a cor do veiculo
   oTb:getColumn(3):colorBlock := { |x| SetTBColorSpec( oTb, 2, x ) }
Segue o código da função. Note que ela retorna o array com o par de números que aponta para o colorSpec do TBrowse. Voce não vai entender a minha necessidade na ocasião que construi esse código Espero que sirva como exemplo.

Código: Selecionar todos

STATIC FUNCTION SetTBColorSpec( oTb, nMode, cColorName )

   STATIC nOffSet, aColorArray

   LOCAL aRet, nPos, cColorSpec

   IF PCount() > 0
      IF nMode == 1
         // Na primeira chamada, configura a especificacao de cor do TBrowse
         IF nOffSet == NIL
            nOffSet := 0
            cColorSpec := oTb:colorSpec
            // conta quantas cores existem no colorspec padrao do Tbrowse (SetColor() atual
            // por default ou outro valor atribuido pelo programa)
            WHILE ! Empty( cColorSpec )
               nPos := At( ",", cColorSpec )
               IF nPos > 0
                  nOffSet++
                  cColorSpec := SubStr( cColorSpec, nPos + 1 )
               ELSE
                  IF ! Empty( cColorSpec )
                     nOffSet++
                     cColorSpec := ""
                  ENDIF
               ENDIF
            ENDDO
         ENDIF
         cColorSpec := oTb:colorSpec
         // inicializa array com as cores padrao, para
         // pesquisa em cada estabilizacao do TBrowse
         aColorArray := { { "Preta"   , "W+/N",   "N/B"   } , ;
                          { "Cinza"   , "N/W",    "W/B"   } , ;
                          { "Branca"  , "N/W*",   "W+/B"  } , ;
                          { "Ciano"   , "N/BG*",  "BG+/B" } , ;
                          { "Verde"   , "N/G*",   "G+/B"  } , ;
                          { "Azul"    , "W+/B*",  "B+/B*" } , ;
                          { "Amarela" , "N/GR*",  "GR+/B" } , ;
                          { "Laranja" , "W+/R*",  "R+/B"  } , ;
                          { "Vermelha", "W+/R",   "R/B"   } , ;
                          { "Marrom"  , "W+/GR",  "GR/B"  } , ;
                          { "Lilas"   , "N/RB*",  "RB+/B" } , ;
                          { "Roxa"    , "W+/RB",  "RB/B"  }   ;
                        }

         // acrescenta as cores padrao no colorspec original
         AEval( aColorArray, { |e| cColorSpec += "," + e[2] } )
         // atualiza a colorspec do TBrowse
         oTb:colorSpec := cColorSpec
      ELSE
         // na estabilizacao ajusta a cor da coluna conforme a cor
         // armazenada no registro do veículo
         nPos := AScan( aColorArray, { |e| e[1] == RTrim( cColorName ) } )
         IF nPos > 0
            // monta um array para retorno e execução pelo oTb:getColumn(3):colorBlock,
            // com um par de cores ( uma cor encontrada na tabela de cores, para cor standard
            // e outra cor para enhanced )
            // acrescido de nOffSet (quantidade de cores que ja existiam)
            aRet := { nOffSet + nPos, 2 }
         ELSE
            aRet := { 1, 2 }
         ENDIF
      ENDIF
   ELSE
      // libera memoria
      nOffSet     := NIL
      aColorArray := NIL
   ENDIF

   RETURN aRet
//------------------------------------------------------------------------------
Esses elementos do array apontam para a variável de instância colorSpec do TBrowse. O primeiro elemento (unselected color) define a cor usada para exibir uma célula do TBrowse quando o cursor não está sobre ela. Já o segundo elemento (selected color) é usado para exibir a célula quando o cursor está posicionado nela. Assim, se o colorSpec do TBrowse contiver "B/W,B/W*,N/W,B/W,B/W,R+/W,R*+/W,W+/BG" ), o array {1,2} apontaria para o primeiro e o segundo par de cores, ou seja B/W,B/W*.

Com certeza a resposta ficou longa mas o assunto exige. Espero ter ajudado. Mais dúvidas? Poste.
Editado pela última vez por alxsts em 06 Ago 2009 18:35, em um total de 1 vez.
[]´s
Alexandre Santos (AlxSts)
frazato
Usuário Nível 3
Usuário Nível 3
Mensagens: 219
Registrado em: 08 Jul 2004 07:45

Re: Duvida com Tbrowse

Mensagem por frazato »

Certinho, muito Obrigado.


Frazato
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

alxsts

Mensagem por lugab »

Muito legal essa postagem... Esclareceu muito sobre o tbrowse.

Tu sabe como faz pro mouse ficar ativo , em termos de rolar as telas ou retornar um código no click do botão ?...
lugab
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Duvida com Tbrowse

Mensagem por alxsts »

Olá Lugab,

usei muito uma lib chamada SuperLib e dá pra fazer o que voce quer, facilmente. Ela tem um manipulador de eventos que controla teclado e mouse. Atualmente é freeware e vem com os fontes e NG.

Pode baixar em http://www.the-oasis.net/ftpmaster.php3 ... ftplib.htm (o arquivo é o Supfree.zip)

Vá estudando. Se precisar de um exemplo poderemos fazer.
[]´s
Alexandre Santos (AlxSts)
frazato
Usuário Nível 3
Usuário Nível 3
Mensagens: 219
Registrado em: 08 Jul 2004 07:45

Re: Duvida com Tbrowse

Mensagem por frazato »

Sim!
Tenho o uso do Mouse em meu tBrowse mais estou usando a Gtwvw, caso queira posso lhe enviar uma tela das que utilizo.


Fiz usando os exemplos do Manoel Angeiras.

[img]C:\Documents%20and%20Settings\Frazato\Meus%20documentos\Minhas%20imagens\ManagerRepositor.jpg[/img]


Rs.. nao consigo anexar a imagem da Tela..


Frazato
Anexos
reposito.txt
(33.84 KiB) Baixado 214 vezes
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Duvida com Tbrowse

Mensagem por alxsts »

Olá amigos,
Caro Frazato, não conheço [x]Harbour e sim Clipper mas, como é xBase, vou tentar te ajudar:
infelizmente, a lib que mencionei é para Clipper, 16 bits... Mas não deixe de postar suas dúvidas. Certamente os colegas do Forum ajudarão.
[]´s
Alexandre Santos (AlxSts)
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Re: Duvida com Tbrowse

Mensagem por lugab »

Frazato, Queria ver o fonte do seu código tbrowse em que o mouse funciona..

O meu fonte tbrowse, eu copiei daqui mesmo do fórum, mas o mouse não funciona nele...

To precisando pra cacilda dessa rotina !!


(Alxsts, pena q a lib é só pra 16bits, mas.......valeu a intenção)
lugab
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Duvida com Tbrowse

Mensagem por alxsts »

Saudações a todos, neste dia dos pais.
...Atualmente é freeware e vem com os fontes e NG.
Os fontes, em sua maioria, são escritos em Clipper e, até aí, tudo bem, é só compilar em xHb. Existem algumas funções em C e Assember. Pergunto aos entendidos em C e Assembler: Seria possível converter isso?
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Duvida com Tbrowse

Mensagem por sygecom »

Olá a Todos,
A LIB SUPERLIB já funciona com o Harbour do SVN. Econtra-se em: \harbour\examples\superlib
Para quem não acompanha o Harbour e quiser testar, posso enviar o Harbour compilado para BCC55,BCC58,BCC60,MINGW ou MSVC. É só para testar mesmo, mas para quem quiser usar em produção é por conta e risco, e já estou usando com MSVC. Mas cada um sabe o que é melhor para si. Posso colocar em 4shared.com da vida se quiserem.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Re: Duvida com Tbrowse

Mensagem por lugab »

Eu to precisando é é exibir na tela um arquivo .TXT (de 24lin X 80col), em tela cheia, usando o Trbowse.

Durante a exibição, qdo o "cabra" clicar no mouse ou apertar algum tecla (que não seja o "ESC" ), chamarei a minha rotina de seleção de impressoras. Se o cabvra clicar ESC, eu simplesmente abandono a rotina

Alguém aqui tem uma rotina pronta pra eu compilar junto com meus fontes no Xharbour e a deseja compartilhar ?

Grato,

Gabriel
lugab
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Duvida com Tbrowse

Mensagem por alxsts »

Olá!

Pode-se verificar, através do recurso de busca deste fórum, que o tema já foi discutido recentemente.

Veja este tópico que trata o assunto e remete o leitor a outro tópico que faz o mesmo, apresentando o código fonte de rotinas publicadas em um livro do Stephen J. Straley. Já usei estas rotinas em Clipper e funcionam muito bem.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Duvida com Tbrowse

Mensagem por sygecom »

Olá Gabriel,
Você já está usando o TBROWSE() para visualizar o TXT ? se tiver vai ficar fácil de lhe mostrar como proceder, mas se não tiver vamos primeiro ver a primeira etapa de visualizar, depois mandar para a impressora a visualização é mamão com açúcar.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Re: Duvida com Tbrowse

Mensagem por lugab »

Não, Leonardo. Não fiz nada com Tbrowse ainda.

Acho que visualizar arquivo texto é uma função tão comum que deve ter um monte de rotina já pronta e por isso eu prefiro queixar uma aqui do que reinventar a roda. Eu faço tanta coisa aqui na loja, que nem ânimo eu tenho de me enfronhar no tbrowse..

Falo daquelas funções , tipo as que a gente só passa o nome e a pasta do arquivo .TXT e as coisas acontecem, tanto clicando no mouse, como usando as teclas de função, sabe ?

Prefiro tê-la compilada no meu fonte, do que dar run em wordpad, edit e etc..


E alxsts, eu baixei o fonte daquele post seu e vou experimentar....

Grato a todos,

gabriel
lugab
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Duvida com Tbrowse

Mensagem por sygecom »

Certo entendi, esse do link usei por muitos anos sem problemas, unica adaptação seria de mandar a visualização para impressão que não tem essa opção mas é facil de adaptar, se ficar com dificuldades post que vamos resolvendo.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Responder