cor no tbrowse
Enviado: 16 Ago 2021 14:52
Não sei o que quis dizer com parou de funcionar.
Aqui mais genérica.
Aqui mais genérica.
Código: Selecionar todos
oTBrowse := { ;
{ "DATA", { || oRs:ToDate( "DATA" ) } }, ;
{ "HORA", { || oRs:ToString( "HORA", 8 ) } }, ;
{ "COMIDA", { || oRs:ToString( "COMIDA", 30 ) }, { | x | If( At( "TOTAL ", Upper( x ) ) > 0, { 5, 5 }, { 1, 2 } ) } }, ;
{ "QUANTIDADE", { || oRs:ToString( "QUANTIDADE", 20 ) } }, ;
{ "PONTOS", { || oRs:ToStr( "PONTOS", 6 ) } }, ;
{ "ID", { || oRs:ToStr( "ID", 6 ) } } }
Código: Selecionar todos
FUNCTION Teste()
LOCAL oRs, oTBrowse
LOCAL oCN := ConexaoMySQL( "serverjpa", "tatu", "tatu", "tatu" )
Set( _SET_CODEPAGE, "PTISO" )
Set( _SET_EVENTMASK, INKEY_ALL + HB_INKEY_GTEVENT - INKEY_MOVE )
SET DATE BRITISH
hb_gtInfo( HB_GTI_WINTITLE , "Testes TBrowse colorBlock() com Acesso ao MySQL via ADO" )
hb_gtInfo( HB_GTI_FONTNAME , "Lucida Console" )
SetMode( 20, 80 )
SetColor( "W/B","N/W",,,"W/B" )
CLS
oCn:open()
DO WHILE .T.
@ 4, MaxRow() SAY Padr( "Obtendo informações... ", 22 ) COLOR "W/W"
oRs := oCn:Execute( "SELECT * FROM tbDieta;" )
SuperADO( oRs )
IF oRs == NIL .OR. oRs:Eof()
Hb_Alert( "Não foi possível obter dados para exibição.",, "W+/B" )
EXIT
ENDIF
oTBrowse := { ;
{ "DATA", { || oRs:ToDate( "DATA" ) } }, ;
{ "HORA", { || oRs:ToString( "HORA", 8 ) } }, ;
{ "COMIDA", { || oRs:ToString( "COMIDA", 30 ) }, { | x | If( At( "TOTAL ", Upper( x ) ) > 0, { 5, 5 }, { 1, 2 } ) } }, ;
{ "QUANTIDADE", { || oRs:ToString( "QUANTIDADE", 20 ) } }, ;
{ "PONTOS", { || oRs:ToStr( "PONTOS", 6 ) } }, ;
{ "ID", { || oRs:ToStr( "ID", 6 ) } } }
BrowseADO( oRs, oTBrowse )
IF Alert( "Fechar?", { " Não ", " Sim " }, "W+/N" ) == 2
oRs:Close()
EXIT
ENDIF
EXIT
ENDDO
oCn:close()
RETURN Nil
Código: Selecionar todos
elseif procname(1)="ENTERITEM" .or. procname(2)="ENTERITEM"
set color to w/r
Código: Selecionar todos
BrowseADO( oRs, oTBrowse, bFuncaoUsuario )
Código: Selecionar todos
BrowseADO( oRs, oTBrowse, { | oBrowse, nKey | SuaFuncao( oRs, oBrowse, nKey ) } )
STATIC FUNCTION SuaFuncao( oRs, oBrowse, nKey )
...
Código: Selecionar todos
IF bFuncaoUsuario != Nil
Eval( bFuncaoUsuario, oBrowse, nKey )
ENDIF
Código: Selecionar todos
FUNCTION Teste()
LOCAL oRs, oTBrowse
LOCAL oCN := ConexaoMySQL( "serverjpa", "tatu", "tatu", "tatu" )
Set( _SET_CODEPAGE, "PTISO" )
Set( _SET_EVENTMASK, INKEY_ALL + HB_INKEY_GTEVENT - INKEY_MOVE )
SET DATE BRITISH
hb_gtInfo( HB_GTI_WINTITLE , "Testes TBrowse colorBlock() com Acesso ao MySQL via ADO" )
hb_gtInfo( HB_GTI_FONTNAME , "Lucida Console" )
SetMode( 20, 80 )
SetColor( "W/B","N/W",,,"W/B" )
CLS
oCn:open()
DO WHILE .T.
@ 4, MaxRow() SAY Padr( "Obtendo informações... ", 22 ) COLOR "W/W"
oRs := oCn:Execute( "SELECT * FROM tbDieta;" )
SuperADO( oRs )
IF oRs == NIL .OR. oRs:Eof()
Hb_Alert( "Não foi possível obter dados para exibição.",, "W+/B" )
EXIT
ENDIF
oTBrowse := { ;
{ "DATA", { || oRs:ToDate( "DATA" ) } }, ;
{ "HORA", { || oRs:ToString( "HORA", 8 ) } }, ;
{ "COMIDA", { || oRs:ToString( "COMIDA", 30 ) }, { | x | If( At( "TOTAL ", Upper( x ) ) > 0, { 5, 5 }, { 1, 2 } ) } }, ;
{ "QUANTIDADE", { || oRs:ToString( "QUANTIDADE", 20 ) } }, ;
{ "PONTOS", { || oRs:ToStr( "PONTOS", 6 ) } }, ;
{ "ID", { || oRs:ToStr( "ID", 6 ) } } }
BrowseADO( oRs, oTBrowse, { | oBrowse, nKey | TestUser( oRs, oBrowse, nkey ) } )
IF Alert( "Fechar?", { " Não ", " Sim " }, "W+/N" ) == 2
oRs:Close()
EXIT
ENDIF
EXIT
ENDDO
oCn:close()
RETURN Nil
STATIC FUNCTION TestUser( oRs, oBrowse, nKey )
IF nKey == K_F5
Alert( "Foi teclado F5" )
Alert( oRs:ToString( "COMIDA" ) )
oBrowse:RefreshAll()
ENDIF
RETURN 1
Código: Selecionar todos
tbrowseado("select data,hora,comida,quantidade,pontos,id from pontos where data='"+dtsql(dt)+"' order by hora")
FUNCTION Tbrowseado(cSql)
LOCAL oRs, oTBrowse
LOCAL oCN :=ConexaoMySQL( "mysql.inaciocarvalho.com.br", "xxx", "xxx", "xxx" )
Set( _SET_CODEPAGE, "PTISO" )
Set( _SET_EVENTMASK, INKEY_ALL + HB_INKEY_GTEVENT - INKEY_MOVE )
SET DATE BRITISH
* hb_gtInfo( HB_GTI_WINTITLE , "TBrowse colorBlock() com Acesso ao MySQL via ADO" )
* hb_gtInfo( HB_GTI_FONTNAME , "Lucida Console" )
SetColor( "W/B","N/W",,,"W/B" )
CLS
oCn:open()
DO WHILE .T.
@ 4, MaxRow() SAY Padr( "Obtendo informações...", 22 ) COLOR "W/W"
oRs := oCn:Execute( cSql )
SuperADO( oRs )
IF oRs == NIL .OR. oRs:Eof()
Hb_Alert( "Não foi possível obter dados para exibição",, "W+/B" )
EXIT
ENDIF
oTBrowse := { ;
{ "DATA", { || oRs:ToDate( "DATA" ) } }, ;
{ "HORA", { || oRs:ToString( "HORA", 8 ) } }, ;
{ "COMIDA", { || oRs:ToString( "COMIDA", 30 ) }, { | x | If( At( "TOTAL ", Upper( x ) ) > 0, { 5, 5 }, { 1, 2 } ) } }, ;
{ "QUANTIDADE", { || oRs:ToString( "QUANTIDADE", 20 ) } }, ;
{ "PONTOS", { || oRs:ToStr( "PONTOS", 6 ) } }, ;
{ "ID", { || oRs:ToStr( "ID", 6 ) } } }
tBrowseADO2( oRs, oTBrowse, { | oBrowse, nKey | TestUser( oRs, oBrowse, nkey ) } )
* tBrowseADO2( oRs, oTBrowse )
* IF Alert( "Fechar?", { " Não ", " Sim " }, "W+/N" ) == 2
oRs:Close()
EXIT
* ENDIF
* EXIT
ENDDO
oCn:close()
RETURN Nil
FUNCTION tBrowseADO2( oRs, oTBrowse )
LOCAL oTbr, nKey, oColumn, aItem, nLen, I
oTbr := TBrowse():new( 02, 3, MaxRow() - 3, MaxCol() - 3 )
oTbr:headSep := Chr(196) + Chr(194) + Chr(196)
oTbr:colSep := " " + Chr(179) + " "
oTbr:footSep := Chr(196) + Chr(193) + Chr(196)
oTbr:goTopBlock := { || oRs:moveFirst() }
oTbr:goBottomBlock := { || oRs:moveLast() }
oTbr:skipBlock := { |n| ADORecordSetSkipper( oRs,n ) }
oTbr:colorSpec := "W/B,W+/N,N/W*,W+/R,R+/B,R/W*"
IF oTBrowse == Nil
// 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
// Add new column to TBrowse
oTbr:addColumn( oColumn )
NEXT
ELSE
FOR EACH aItem IN oTBrowse
oColumn := TBColumnNew( aItem[1], aItem[2] )
IF Len( aItem ) > 2
oColumn:ColorBlock := aItem[3]
ENDIF
oTbr:AddColumn( oColumn )
NEXT
ENDIF
// border
DispBox( oTbr:nTop - 1, oTbr:nLeft - 1, oTbr:nBottom + 3, oTbr:nRight + 1, B_SINGLE )
DO WHILE .T.
oTbr:refreshCurrent()
DO WHILE ! oTbr:Stable()
oTbr:Stabilize()
ENDDO
// Paint TBrowse current line...
//oTbr:ColorRect( { oTbr:RowPos, oTbr:LeftVisible, oTbr:RowPos, oTbr:RightVisible }, { 2, 1 } )
@ MaxRow() - 1, 3 SAY Padr( " Registro " + Ltrim( Str( oRs:AbsolutePosition ) ) + " de " + Ltrim( Str( oRs:recordCount ) ) + " ", 20 ) COLOR "N/W"
nKey := Inkey(0)
IF oTbr:applyKey( nKey ) == TBR_EXIT
EXIT
ENDIF
ENDDO
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 ConexaoMySQL( cServer, cDatabase, cUser, cPassword )
LOCAL oCn := win_OleCreateObject("ADODB.Connection")
/*
Ajuste aqui a connection string conforme o banco
Ou pequise aqui...: https://www.connectionstrings.com/
*/
oCn:ConnectionString := "DRIVER={MariaDB ODBC 3.1 Driver};TCPIP=1;SERVER=" + ;
cServer + ";Database=" + cDatabase + ";UID=" + cUser + ";PWD=" + cPassword + ";PORT=3306"
oCn:CursorLocation := 3
RETURN oCn
FUNCTION SuperADO( oRs )
__ObjAddMethod( oRs, "TOSTRING", @ADOToString() )
__ObjAddMethod( oRs, "TONUMBER", @ADOToNumber() )
__ObjAddMethod( oRs, "TODATE", @ADOToDate() )
__ObjAddMethod( oRs, "TOSTR", @ADOToStr() )
RETURN Nil
STATIC FUNCTION ADOToDate( cField )
LOCAL x, Self := QSelf()
x := ::Fields( cField ):Value
IF ValType( x ) != "D"
x := Ctod("")
ENDIF
RETURN x
STATIC FUNCTION ADOToString( cField, nLen )
LOCAL x, Self := QSelf()
x := ::Fields( cField ):Value
IF ValType( x ) != "C"
x := ""
ENDIF
IF nLen != Nil
x := Pad( x, nLen )
ENDIF
RETURN x
STATIC FUNCTION ADOToNumber( cField )
LOCAL x, Self := QSelf()
x := ::Fields( cField ):Value
IF ValType( x ) != "N"
x := 0
ENDIF
RETURN x
STATIC FUNCTION ADOToStr( cField, nLen, nDec )
LOCAL x, Self := QSelf()
x := ::Fields( cField ):Value
IF ValType( x ) != "N"
x := 0
ENDIF
IF nLen == Nil
x := Str( x )
ELSEIF nDec == Nil
x := Str( x, nLen )
ELSE
x := Str( x, nLen, nDec )
ENDIF
RETURN x
STATIC FUNCTION TestUser( oRs, oBrowse, nKey )
IF nKey == K_F5
Alert( "Foi teclado F5" )
Alert( oRs:ToString( "COMIDA" ) )
oBrowse:RefreshAll()
ENDIF
RETURN 1cjp escreveu:Minha aplicação está assim (não mudei quase nada):
Código: Selecionar todos
nKey := Inkey(0)
IF oTbr:applyKey( nKey ) == TBR_EXIT
EXIT
ENDIF
ENDDO
Código: Selecionar todos
IF bFuncaoUsuario != Nil
Eval( bFuncaoUsuario, oBrowse, nKey )
ENDIF
Código: Selecionar todos
tBrowseADO2( oRs, oTBrowse, { | oBrowse, nKey | TestUser( oRs, oBrowse, nkey ) } )Se puder me ajudar também nestas questões, agradeçoMais dois detalhes:
1) ao sair do tbrowse, a tela fica estranha (vide imagem anexa);
2) depois de sair do tbrowse, tá dando erro na minha aplicação em outras partes (combinação ilegal de collations); sei que isso tem a ver com a collation da base de dados, mas nunca tive esse erro no meu sistema; detalhe é que a tabela que estou usando neste tbrowse é a mesma que já uso em outras partes do sistema, e está no mesmo banco de dados da tabela em que está dando erro.
eu conseguia que ficasse do jeito que queria: tela totalmente vermelha, com as letras brancas.
Mas agora, depois que mexi em alguma coisa, que não sei o que foi, a tela está ficando parcialmente azul, na parte de exibição do tbrowse(). Isto está acontecendo, pelo que pude apurar, depois do oTBrowse:refreshCurrent().
Já procurei de tudo na função, a única referência a color é mesmo a que postei acima.
Também tentei comparar com uma versão anterior da mesma função que tenho aqui, mas não achei nada que possa justificar esse azul.
Tenho plena consciência de que a culpa disso é a confusão que está esta função. Preciso mudar isso. Mas, enquanto não sei fazer melhor do que está, preciso muito desta função funcionando, pois ela é usada em várias funções do meu sistema, e funciona muito bem. E essa parte que está com esse problema na cor é uma das funções mais importantes (se não a mais importante) do meu sistema.
Por favor, alguém poderia me ajudar?
Sim, está passando a função de usuário para tbrowseado2()cjp escreveu:Desculpe, mas não te entendi.
Esta não é a chamada para a função de usuário?
tBrowseADO2( oRs, oTBrowse, { | oBrowse, nKey | TestUser( oRs, oBrowse, nkey ) } )
O que mais eu preciso fazer exatamente?
Que imagem?cjp escreveu:1) ao sair do tbrowse, a tela fica estranha (vide imagem anexa);
Será que é a velha mania de pegar fontes do post e colocar no fonte do aplicativo? às vezes misturando várias?cjp escreveu:2) depois de sair do tbrowse, tá dando erro na minha aplicação em outras partes (combinação ilegal de collations); sei que isso tem a ver com a collation da base de dados, mas nunca tive esse erro no meu sistema; detalhe é que a tabela que estou usando neste tbrowse é a mesma que já uso em outras partes do sistema, e está no mesmo banco de dados da tabela em que está dando erro.
Eu havia esquecido de anexar a tela. Desculpe. Segue agora.Que imagem?
Testei agora com save / rest scre, mas continua do mesmo jeito.Ao sair do tbrowse tela estranha? talvez um SAVE SCREEN antes do tbrowse, e um RESTORE SCREEN após o tbrowse.
Não, a função antiga não tem esse problema.O tbrowse anterior não tinha esse problema?
Que parte de fonte está diferente de antes?
Realmente não está. Mas eu não saberia fazer isso. Pode me ajudar? Achei que só precisaria fazer a função de usuário.Sim, está passando a função de usuário para tbrowseado2()
E aonde o tbrowseado2() está fazendo uso disso?
De fato, limitei-me a colar teu exemplo no meu sistema, fazendo pouquíssimas alterações. O fato é que ainda não aprendi a lidar com o tbrowse. Estou lendo o livro recomendado pelo alxsts, mas ainda não cheguei a este ponto.Será que é a velha mania de pegar fontes do post e colocar no fonte do aplicativo? às vezes misturando várias?
Se tá dando erro de collation, a única coisa que se pode imaginar é que tem algum comando pra mudar collation no fonte.
Estou passando a idéia do que fazer, tem que entender primeiro, antes de colocar direto no seu aplicativo fazendo alterações.
Se tem tbrowse funcionando pra várias teclas, é só colocar a rotina que mostrei nessa parte de teclas, igual já tem no tbrowse que já funciona.
A diferença é que vai passar a ser tratado fora, na função de usuário, e não dentro do tbrowse genérico.
Código: Selecionar todos
hb_gtInfo( HB_GTI_COMPATBUFFER, .F. )
Código: Selecionar todos
IF oTbr:applyKey( nKey ) == TBR_EXIT
EXIT
ENDIF
IF bUserFunction != NIL
DO WHILE ! oBrowse:Stable
oBrowse:Stabilize()
ENDDO
Eval( bUserFunction, oBrowse, oRs, nKey )
oBrowse:RefreshAll()
ENDIF
nKey := 0