Página 1 de 1

Duvidas com TBrowse

Enviado: 10 Mar 2006 02:54
por alaminojunior
Ola caros colegas, tenho um problema com o uso da classe TBrowse e gostaria de uma solução se possível, lá vai ...

uso a classe tbrowse para montar uma tela de consulta de produtos no meu sistema;
a tela do tbrowse tem 10 linhas, e uso sistema de consulta por codigo ou descricao; (02 indices)
o que está acontecendo é o seguinte:
se estiver no inicio do dbf e, se o cursor (barra de destaque) estiver posicionado na linha 08 (vamos supor), e eu digitar o codigo do 1º item da tabela, A BARRA DE DESTAQUE NÃO VAI PARA CIMA ! Dá a entender que:
como o item está sendo visualizado, o tbrowse ignora e não posiciona o cursor em cima do objeto da pesquisa. Para esclarecer um pouco mais mando um trecho do codigo:

Tb4:= tbcolumnne(vcab, { || predsc+" "+premar+" "+trans(prevnd,"@ZE 999,999.99")+"/"+preemb})
Tb3:= tbrowseDB(07,05,17,74)
Tb3:headsep:= "Ä"
Tb3:colorspec:= "n/w,gr+/b,n+/w,n+/n,b/w"
Tb4:defcolor:= {5}
Tb4:colorblock:= {|tb3| iif(preest <= 0 , {3,4},{1,2})}
Tb3:addcolumn(Tb4)
do while .t.
do while !Tb3:stabilize()
enddo
Show_Cond()
tempo:= inkey(180)
do case
case tempo = 0
protect()
tb3:refreshall()
loop

case tempo == K_DOWN
Tb3:down()
tb3:refreshall()

case tempo == K_UP
Tb3:up()
tb3:refreshall()

case tempo == K_PGDN
Tb3:PageDown()
tb3:refreshall()

case tempo == K_PGUP
Tb3:PageUp()
tb3:refreshall()

case isalpha(Chr(lastkey())) .OR. lastkey() > 48 .AND. lastkey() < 58
pesqui:=savescreen(24,18,26,62)
if (lastkey() > 48 .AND. lastkey() < 58)
set order to tag indpre01
ord:= 1
else
set order to tag indpre02
ord:= 2
endif
Keyboard Upper(Chr(lastkey()))
pesquisa()
restscreen(24,18,26,62,pesqui)
Tb3:RefreshAll()

e por aí vai...
Se alguem tiver uma solução, desde já agradeço

Enviado: 10 Mar 2006 10:31
por Dudu_XBase
Bom dia!
Tente fazer a seguinte alteração.

Código: Selecionar todos

  case isalpha(Chr(lastkey())) .OR. lastkey() > 48 .AND. lastkey() < 58
          pesqui:=savescreen(24,18,26,62)
          if (lastkey() > 48 .AND. lastkey() < 58)
               set order to tag indpre01
               ord:= 1
          else
              set order to tag indpre02
              ord:= 2
          endif
          Keyboard Upper(Chr(lastkey()))
          pesquisa()
          restscreen(24,18,26,62,pesqui)
          // isso foi adicionado
          while .not. oConsulta:Stabilize()
          enddo
          
          Tb3:RefreshAll() 
  

Enviado: 10 Mar 2006 10:48
por MARCELOG
Caro amigo,
o erro pode estar na função de pesquisa.
Ela está atuando sobre o arquivo e índices atuais.
Você já verificou o resultado da pesquisa e o registro em que ela se encontra.
Com efeito, se você deslocou o ponteiro e registro no banco de dados e "deu" um refreshall() ou configure(), não tem erro, o tbrowse é redesenhado com base no local atual do ponteiro de registro.

Verifique e poste, por favor.

MarceloG

Enviado: 10 Mar 2006 12:01
por alaminojunior
bom dia caros amigos,
em 1º lugar agradeço o empenho.
Dudu, com as alteraçoes que vc sugeriu, não tive solução;
O curioso é:
nas pesquisas ( estando o cursor ) no inicio da tabela e pesquisando algum registro que esteja daí para baixo, funciona que é uma beleza !
porém como já disse, se o tbrowse estiver mostrando os 10 primeiros registros, o cursor estiver em cima do 4º (supomos), e pesquisarmos o codigo ou a descrição dos registros que estão acima do cursor, ele simplesmente não destaca a linha pesquisada, é como se o tbrowse entendesse que o registro já esta sendo visualizado, e que não precisa destacar a barra em cima do item da pesquisa !
já tentei com :hilite() em tudo que é lugar, porém não tem jeito.
isso causa um transtorno (voces bem podem imaginar), imagina o caboclo pesquisando os itens para um pedido, se ele for apressadinho e não prestar atenção na tela (o que é comum) vai incluir o item errado !
caso alguem tenha outras idéias,
antecipadamente agradeço :-o

Enviado: 10 Mar 2006 13:57
por MARCELOG
Primeiro, é importante destacar que a cada verificação do teclado (do case isso ou aquilo), não há necessidade de um refreshall.
Se o volume de dados for grande, isso pode comprometer a rapidez do processamento.

Quanto a visualização, faça o seguinte:

Se a variável tb3 é local, torne a mesma private para torná-la visível na função/ procedure pesquisa()

Coloque antes da saída da função/procedure de pesquisa, mas depois do dbseek (ou seek) o seguinte:

alert(recno())
tb3:configure()
tb3:forcestable()

Isso vai possibilitar ver em qual registro o ponteiro(foco) do arquivo se encontra e determinar e forçar o redesenho de todo o tbrowse na próxima estabilização.

Se funcionar, é só desabilitar o alert e pronto.

Por favor, retorne.

MarceloG

Enviado: 10 Mar 2006 17:50
por Lopes
Caso ainda não tenha resolvido tenho 2 meios aqui que sempre funcionaram comigo:

1o

Código: Selecionar todos

nSaveRecno := RecNo()
oDivBr:RefreshAll()
While !oDivBr:Stabilize(); EndDo
While Recno() != nSaveRecno
  oDivBr:up()
  While !oDivBr:Stabilize() ; EndDo
EndDo
Esse pode ser meio demorado dependendo da sua base de dados pois o que ele faz é ir até o final e daí vai subindo o cursor do TBrowse até encontrar o registro que seja igual ao que está sendo procurado.

2o

Código: Selecionar todos

nSaveRec := Recno()
oDivBr:RefreshAll()
oDivBr:ForceStable()
Bem, o "oDiv:ForceStable" teoricamente é igual ao "While !DivBr:Stabilize() ; EndDo" porém em alguns casos só consegui o resultado desejado usando ele.


Tenta esses métodos (se ainda não tiver tentado) e depois fala se resolveu ou não seu problema.

Enviado: 10 Mar 2006 17:53
por alaminojunior
É MarceloG, a coisa tá preta, não funcionou não.
difícil hein ?
pensando e refletindo melhor o que acontece é que: o resultado da pesquisa é mostrado sempre na posição onde está o cursor, porém quando se está exibindo os registros iniciais e a barra de destaque está no quarto registro, e faz-se a pesquisa de um registro que esteja para cima, a barra de destaque não sai do lugar.

Enviado: 10 Mar 2006 21:21
por MARCELOG
Caro amigo,
verificando melhor o tópico, fiquei como algumas dúvidas para poder de ajudar.

Então, para entender vamos admitir que você está na primeira coluna e segunda linha do tbrowse.

Essa coluna é o código e o índice ativo é o código.

Logo, o tbrowse está destacando e eventualmente mostrando "000002". Acertei? Beleza!

Aí você faz a pesquisa do número "000006". Ele é encontrado e o tbrowse destaca a sexta linha do tbrowse. Certo? Beleza de novo!

Novamente você pesquisa o número "000003".

O tbrowse fica na sexta linha ou vai para a terceira?

Se ele foi para a terceira linha, ou destacou o terceiro registro, tudo bem!

É que o tbrowse tenta manter a posição relativa na janela.

Agora se você quer que essa linha fique destacada, mostrando uma cor diferente, isso vai depender da condição que você especificou em colorblock e se ela foi atendida. Sacou?

Todavia, se o tbrowse ficou quietinho na sexta linha e você tem certeza de que o registro "000003" existe, experimente refazer os índices.

Também, utilize todos os argumentos do comando SET ORDER.

Teste.

Use refresshal, configure ou invalidade.

Não deu?

Me manda um email com a função completa, inclusive de pesquisa pra poder analisar.

Uma simples pesquisa com tbrowse não pode dar essa "zebra" né.

MarceloG

Enviado: 10 Mar 2006 22:19
por alaminojunior
Pois é meu caro :D interessante não ?

Então, para entender vamos admitir que você está na primeira coluna e segunda linha do tbrowse. OK

Essa coluna é o código e o índice ativo é o código. OK

Logo, o tbrowse está destacando e eventualmente mostrando "000002". Acertei? Beleza! OK

Aí você faz a pesquisa do número "000006". Ele é encontrado e o tbrowse destaca a sexta linha do tbrowse. Certo? Beleza de novo! OK

Novamente você pesquisa o número "000003". Ok

O tbrowse fica na sexta linha ou vai para a terceira?
Ele fica na sexta linha

estou certo de que não é indexação (Depois mando o fonte, e vc vai entender) ou melhor vou mandar uma demo do sistema com um minimo de dbf´s, vc vai entender melhor ainda
Por enquanto, obrigado

Enviado: 10 Mar 2006 22:20
por alaminojunior
Me manda seu E-½

Enviado: 13 Mar 2006 10:35
por MARCELOG
Experimente, como um recurso, no final da função/procedure de pesquisa o seguinte:

DbGoto(RecNo())