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.