Página 1 de 2

TBROWSE

Enviado: 25 Nov 2020 14:10
por GilmarDalantonia
Boa tarde pessoal, alguem sabe como mudar a cor do titulo dos campos e das linhas que separam as colunas no tbrowse?
consegui mudar a cor das colunas, mas linhas e cabeçalho não achei como

TBROWSE

Enviado: 25 Nov 2020 15:44
por JoséQuintas
Só o meu Harbour faz isso.
Enviei a alteração pro oficial mas tá lá parado há anos.

TBROWSE

Enviado: 29 Dez 2020 15:19
por cjp
Não sei se dá pra tratar disso neste mesmo tópico, mas creio que sim, pois ele é genérico sobre Tbrowse.
Gostaria de saber como faço para centralizar os dados em algumas colunas do Tbrowse. Preciso que algumas apenas estejam com os dados centralizados, os demais como já estão (alinhados à esquerda).
É possível?

TBROWSE

Enviado: 29 Dez 2020 21:00
por JoséQuintas
Sobre o que mencionei, link direto:

https://github.com/harbour/core/pull/18 ... 4c5062437f

Passo a passo:
pull1.png
pull2.png
pull3.png
Tá lá desde março/2019, se estiver no padrão aceitável, seria só alguém clicar e confirmar o merge.

TBROWSE

Enviado: 31 Dez 2020 02:41
por alxsts
Olá!
cjp escreveu:como faço para centralizar os dados em algumas colunas do Tbrowse

Código: Selecionar todos

oTBColumn   := TBColumn():new( PadC( "Nome", 20 ), { || PadC( Alltrim( Tabela->nome ), 20 ) } )
oTBrowse:addColumn( oTBColumn )
Pode usar também PadR() e PadL().

TBROWSE

Enviado: 02 Jan 2021 16:56
por cjp
Coloquei exatamente como vc disse, e está dando o seguinte erro:

Código: Selecionar todos

Ocorreu o erro: Error BASE/1005  Nenhuma variável exportada: WIDTH
É provável que eu precisasse fazer alguma adaptação ao meu sistema, mas eu não sei como fazer isso. Pode me ajudar?

TBROWSE

Enviado: 02 Jan 2021 18:00
por JoséQuintas
Não sei a que mensagem se referiu, porque não achei width em mensagem nenhuma.

Não sei se ajuda:
A mensagem de erro é quando não existe width no objeto/classe.
tipo.... campo:width, mas se olhar o objeto campo, ele não tem a propriedade width

TBROWSE

Enviado: 02 Jan 2021 23:02
por cjp
Pois é, estranhamente, meu Tbrowse não tem nenhum width. Mas estava funcionando até agora.

Estava assim:

Código: Selecionar todos

                oColumn       := TBColumnNew( oRs:fields(i):name(), ADORecordSetFieldBlock( oRs, i ) )
E eu coloquei assim:

Código: Selecionar todos

                oTBColumn   := TBColumn():new( PadC( "Nome", 20 ), { || PadC( Alltrim( Tabela->nome ), 20 ) } )
Como faço?

TBROWSE

Enviado: 03 Jan 2021 03:17
por alxsts
Olá!

O código que postei foi apenas um exemplo genérico. Claro que se você simplesmente copiar para o teu programa vai dar erro...

Você mencionou TBROWSE e não ADO...

Tente isto:

Código: Selecionar todos

oColumn := TBColumnNew( PadC( Alltrim( oRs:fields(i):name() ), 20 ), { || PadC( Alltrim( Eval( ADORecordSetFieldBlock( oRs, i ) ) ), 20 ) } )
Não sei se vai dar certo. Talvez tenha que fazer um tratamento na função ADORecordSetFieldBlock() para alinhar da forma desejada...

TBROWSE

Enviado: 03 Jan 2021 09:22
por cjp
De fato, eu não falei que era ADO porque achei que a questão era só de Tbrowse, achei que não tinha a ver com o ADO em si.

Copiei simplesmente do jeito que vc colocou, pois não soube fazer as alterações necessárias.

Fiz agora com tua última sugestão, mas também não funcionou. Deu o seguinte erro:

Código: Selecionar todos

Ocorreu o erro: Error WINOLE/1007  O item nÒo pode ser encontrado na coleþÒo correspondente ao nome ou ao ordinal solicitado. (0x800A0CC1): ADODB.Recordset
Estranho, porque não mudei mais nada. Esse erro normalmente dá no ADO quando tentamos usar um campo da tabela que não está no select.

Eu não saberia mudar a ADORecordSetFieldBlock, que está assim:

Código: Selecionar todos

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


TBROWSE

Enviado: 03 Jan 2021 14:37
por JoséQuintas
Não tem a ver com ADO.

No fórum são postados exemplos, porque tem que ajustar conforme a necessidade de cada um.
Quando você considera algo desconhecido, você simplesmente copia e cola fonte.
Isso não dá certo.
Mesmo assim, não teria explicação para o erro de Width.
O erro piorou... talvez ao invés de passar o número do campo, está passando o tamanho que está sendo usado como número do campo.

Isso não tem a ver com ADO, nem browse, e sim com programação.

Esse codeblock pra ADO está relativamente simples, serve pra ler ou gravar campo no ADO.

NÃO tem a ver diretamente com o problema, mas:

No DBF, ao pegar estrutura, temos NAME, SIZE, LEN, DEC
No ADO temos :Name, :DefinedSize, :Value (este último é o valor, o conteúdo)

No DBF temos Field( nCont ), e no ADO temos oRS:Fields( nCont )
Mas no ADO temos
oRs:Fields( nCont ):Value
oRs:Fields( nCont ):DefinedSize
oRs:Fields( nCont ):Name

Além disso, a função tem EOF(), Space(), Max(), Nil, que são coisas auto-explicativas.

A função retorna o codeblock a ser usado, ou pra ler ou pra salvar.

Se o codeblock vém pronto dessa função.... com certeza é nela que precisa mexer.

Só que aí entra passar o parâmetro de tamanho e/ou de centralizar.

E voltamos ao início do texto: o SEU uso é SEU. Tem que fazer por si próprio de acordo com o que precisa.
Postamos exemplos e você coloca diretamente em seu fonte, o que na prática é estragar seu fonte cada vez mais.

E se a função pode retornar campos numéricos, data, caractere, etc... vai precisar colocar análises sobre isso, porque pra cada tipo de campo vai ter uma solução diferente.

Bom... ou pensa nos exemplos postados, pra adequar à sua necessidade, ou vai complicar cada vez mais isso.
De repente resolve uma coisa e estraga outra, então, vai ter que saber como resolver cada situação, SEM FICAR COPIANDO/COLANDO FONTE.

TBROWSE

Enviado: 03 Jan 2021 21:00
por cjp
De fato eu apenas copiei, porque de fato não entendo o suficiente, nem de Tbrowse, nem de codeblock. E também não entendo muito de ADO, a não ser o que vc mesmo me ensinou.
O código todo foi copiado do teu modelo, com pequenas modificações, e está funcionando muito bem. Eu só queria uma pequena alteração, apenas centralizar uns campos.
Mas vc tem razão: eu não tenho conhecimento suficiente para fazer isso sem ajuda. Então, é melhor desistir.

TBROWSE

Enviado: 03 Jan 2021 22:17
por alxsts
Olá!
cjp escreveu:Então, é melhor desistir.
Não meu querido. Desistir? Jamais! O melhor é estudar, pesquisar, se esforçar e sentir, no final, a alegria de ver funcionar! E não se esqueça que tem vários colegas aqui, dispostos a colaborar, como sempre.

TBROWSE

Enviado: 03 Jan 2021 22:27
por JoséQuintas
cjp escreveu:Mas vc tem razão: eu não tenho conhecimento suficiente para fazer isso sem ajuda. Então, é melhor desistir.
Ou pior que isso... já fez isso em outro fonte, que eu me lembro.
Só que ao invés de usar como base o que já fez, tá pegando o genérico.

oRs:Fields( 1 ):Value

Isso não retorna o valor? pode ser string, data, número, etc.
Quer a string centralizada?

Ao invés de oRs:Fields( "NOME" ):Value

Vai usar Padc( oRs:Fields( "NOME" ):Value, 20 )

Só que não a partir desse fonte genérico, no outro aonde informa cada campo.
Ou será que vai centralizar tudo que é string, tudo que é número, tudo que é data, etc?
Então não serve o genérico.

TBROWSE

Enviado: 03 Jan 2021 22:34
por JoséQuintas
Mas pera aí.....

Esse fonte é o que mostra tudo que vém do SELECT, exatamente como veio.

Se servir, pode apenas alterar o SELECT pra trazer tudo pronto do jeito que quer.