Clipper On Line • Ver Tópico - Problema com rolagem no browse

Problema com rolagem no browse

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

Problema com rolagem no browse

Mensagempor rubens » 26 Abr 2014 11:57

Toledo...

Colocando do jeito que voce falow o código abaixo, ele perde a rolagem.
nRecnoGrid:=nRegsGrid-nGoGrid
Go Bottom
Skip -(nRecnoGrid)
form_venda.grid_vendas.Value:=recno()


neste post viewtopic.php?f=45&t=14669&p=85879&hilit=mostrar+novos+registros#p85879 você deu uma dica para o Paulão o qual gerou uns testes do jeito dele e disse que resolveu.. mandei uma mensagem para ele para mostrar certinho o código onde grava o registro para ver o que tem de diferente.

Fiz uma alteração baseada no comentário dele e só com estas linhas fica funcional... mas somente quando faz inclusão o problema é quando deleta um item, parece que ele se desconfigura. Fiz as alterações na rotina de exclusão que você falou na postagem anterior. Tentei remover a rotina de Apaga_item ativando no browse o ALLOWDELETE .T. para ver era na função Apaga_item, mas quando volta inserir items depois de apagar um item... ele desestabiliza..


   form_venda.grid_vendas.Value :=  recno()-8
   form_venda.grid_vendas.refresh



O problema maior é sumir o browse aleatoriamente, imagina o cliente passando uma venda de uns 30 itens e de repente a listagem de itens some e depois volta, vai gera desconfiança...

Infelizmente era para ser um coisa tão simples...

Obrigado

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar de usuário

rubens
Colaborador

Colaborador
 
Mensagens: 1518
Data de registro: 16 Ago 2003 09:05
Cidade/Estado: Nova Xavantina - MT
Curtiu: 77 vezes
Mens.Curtidas: 104 vezes

Problema com rolagem no browse

Mensagempor Toledo » 27 Abr 2014 11:17

rubens escreveu:Fiz uma alteração baseada no comentário dele e só com estas linhas fica funcional...
form_venda.grid_vendas.Value :=  recno()-8

Rubens, como pode ocorrer uma exclusão de registros, então não se pode tomar como base o RECNO(), pois o cálculo (recno()-8) pode resultar um dos registros deletados. Devido a esta possibilidade que eu sugeri dar um GO BOTTOM para ir para o último registro e depois dar um SKIP - (menos) para retornar uma certa quantidade de registros.

Como o código que você apresentou não tinha como compilar, pois era apenas uma parte do seu código, as minhas sugestões não foram testadas, então tinha que lhe passar as alterações e você fazer os testes para ver se daria certo.

Bom, diante desta situação, então resolvi pegar o código inicial deste seu tópico, que é compilável, e incluir as rotinas de incluir e excluir registros, assim pude fazer alguns testes.

Rubens, compile o exemplo que segue abaixo e faça algumas inclusões (no campo Código digite na sequencia: 11, 12, 13, 14... até 21) e depois clique no Browse e selecione um dos registros e pressione a tecla DELETE e confirme a exclusão. Pode excluir quantos registros quiser e depois volte a incluir os códigos (22, 23, 24, etc).

#include 'minigui.ch'      

function main()
local bColor := {202,202,255}
Private lSai:=.T.

set deleted on

if file('ivendast.dbf')
ferase('ivendast.dbf')
endif

aStru := {;
   {'CODBARRA','C',13,00},;
  {"CODPRO_" ,"C",05,00},;
  {"NOMPRO_" ,"C",40,00},;
  {"QTDE_" ,"N",12,03},;
  {"VALOR_" ,"N",12,02},;
  {"TOTAL_" ,"N",12,02},;
  {"CODGRU_" ,"C",03,00},;
  {"OBSIV_" ,"C",50,00},;
  {"LUCRO_" ,"N",12,02},;
  {"PRVENDA" ,"N",12,02},;
  {"TRIBUTO" ,"C",02,00},;
  {"UND_"  ,"C",02,00},;
  {"VLVISTA" ,"N",12,02},;
  {"DESCONTO" ,"N",12,02},;
  {"COMISSAOP","N",12,02},;
  {"COMISSAO" ,"N",12,02}}
DBCREATE( 'ivendast.dbf' , aStru)

use ivendast.dbf alias ivt

for x=1 to 10
append blank
   REPLACE CODBARRA WITH STRZERO(X,13)
  REPLACE CODPRO_ WITH STRZERO(X,5)
  REPLACE NOMPRO_ WITH STRZERO(X,5)
  REPLACE QTDE_  WITH X
  REPLACE VALOR_ WITH X
  REPLACE TOTAL_ WITH X*X
  REPLACE CODGRU_ WITH STRZERO(X,3)
  REPLACE OBSIV_ WITH STRZERO(X,5)
  REPLACE LUCRO_ WITH X
  REPLACE PRVENDA WITH X
  REPLACE TRIBUTO WITH '00'
  REPLACE UND_  WITH 'UN'
  REPLACE VLVISTA WITH X
  COMMIT
next
Go Top

define window form_venda;
  at 100,300;
  width getdesktopwidth();
  height getdesktopheight();
  main
 
@ getdesktopheight()-145,5 textbox tbox_codigo;
  height 48;
  width 290;
  font 'verdana' size 22 bold;
  backcolor {0,255,255};
  fontcolor BLUE;
  on enter calcula_valores();
  rightalign;
  MAXLENGTH 13

n_soma_colunas := (220+140+60+140+150)
n_tam_col_desc := (getdesktopwidth()-n_soma_colunas)-40
   
DEFINE BROWSE grid_vendas
  row 110
  col 0
  width getdesktopwidth()
  height getdesktopheight()-300
  headers  {'Código Barras','Descrição'  ,'Qtde'   ,'Und'   ,'Unitário' ,'SubTotal'}
  widths {220,n_tam_col_desc,140,60,140,150}
  WORKAREA IVT
  FIELDS  {'IVT->CODBARRA','IVT->nompro_' ,'IVT->QTDE_','IVT->UND_','IVT->VALOR_','IVT->TOTAL_'}
  READONLY { .F. , .F. , .F. , .F. , .F. , .F. }
  LOCK .F.
  FONTNAME 'verdana'
  FONTSIZE 16
  FONTBOLD .T.
  backcolor {229,229,229}
  nolines .T.
  VSCROLLBAR .F.
  DYNAMICBACKCOLOR { bColor , bColor, bColor, bColor, bColor, bColor }
  justIfy {BROWSE_JTFY_LEFT,BROWSE_JTFY_LEFT,BROWSE_JTFY_RIGHT,BROWSE_JTFY_RIGHT,BROWSE_JTFY_RIGHT,BROWSE_JTFY_RIGHT}
  ONGOTFOCUS {|| lSai:=.F. }
  ONLOSTFOCUS {|| lSai:=.T. }
END BROWSE

form_venda.grid_vendas.Value:=recno()
// Esc sai do programa/form
on key escape action saidoprograma()

ON KEY DELETE ACTION APAGA_ITEM()
 
end window

form_venda.tbox_codigo.setfocus
form_venda.maximize
form_venda.activate

return(nil)

*-------------------------------------------------------------------------------
static function saidobrowse()

if msgyesno('Confirma saída do browse?','Browse')
  form_venda.tbox_codigo.setfocus
endif

return(nil)

*-------------------------------------------------------------------------------
static function saidoprograma()
If lSai
if msgyesno('Confirma saída do programa ?','Form')
  form_venda.release
endif
Else
saidobrowse()
Endif

return(nil)

******************************************************************************** 
static function calcula_valores()
X:=Val(form_venda.tbox_codigo.value)
if X>0
  append blank
  REPLACE CODBARRA WITH STRZERO(X,13)
  REPLACE CODPRO_ WITH STRZERO(X,5)
  REPLACE NOMPRO_ WITH STRZERO(X,5)
  REPLACE QTDE_  WITH X
  REPLACE VALOR_ WITH X
  REPLACE TOTAL_ WITH X*X
  REPLACE CODGRU_ WITH STRZERO(X,3)
  REPLACE OBSIV_ WITH STRZERO(X,5)
  REPLACE LUCRO_ WITH X
  REPLACE PRVENDA WITH X
  REPLACE TRIBUTO WITH '00'
  REPLACE UND_  WITH 'UN'
  REPLACE VLVISTA WITH X
  COMMIT

  nCrtHandle:=GetControlIndex ( "grid_vendas" , "form_venda" )
  nTamPagGrid:=ListViewGetCountPerPage ( _HMG_aControlhandles [nCrtHandle] )
  nRegsGrid:=RecCount()
  If nRegsGrid>nTamPagGrid
    nGoGrid:=Int(nTamPagGrid/2)
    If nGoGrid!=(nTamPagGrid/2)
      nGoGrid+=1
    Endif
    Go Bottom
    Skip -(nGoGrid)
    form_venda.grid_vendas.Value:=recno()
  Endif

  form_venda.grid_vendas.refresh
  setproperty( 'form_venda','tbox_codigo','value', '')
  form_venda.tbox_codigo.setfocus

endif
return nil

**************************************************************
static function apaga_item()
local nReg := form_venda.grid_vendas.value

if !lSai

  IF MsgOkCancel ('Confirma exclusão do item ?','Exclusao de Item')
   
    ivt->(dbgoto( nReg ))
    delete

    Go Top
    nCrtHandle:=GetControlIndex ( "grid_vendas" , "form_venda" )
    nTamPagGrid:=ListViewGetCountPerPage ( _HMG_aControlhandles [nCrtHandle] )
    nRegsGrid:=RecCount()
    If nRegsGrid>nTamPagGrid
      nGoGrid:=Int(nTamPagGrid/2)
      If nGoGrid!=(nTamPagGrid/2)
        nGoGrid+=1
      Endif
      Go Bottom
      Skip -(nGoGrid)
      form_venda.grid_vendas.Value:=recno()
    Endif

    form_venda.grid_vendas.refresh
  ENDIF

endif

form_venda.tbox_codigo.setfocus()   
   
return(nil)


Quando se tem um código que pode ser compilado, fica mais fácil encontrar uma solução para o problema.

Só para relembrar:
Toledo escreveu: E também o comando refresh e setfocus não tem os () no final


Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

Problema com rolagem no browse

Mensagempor rubens » 04 Mai 2014 10:44

Toledo...

Obrigado pela atenção que você dispensou para me ajudar a resolver o problema...
Mas mesmo fazendo as alterações que você postou aí ainda assim de vez em quando a tela com os itens some e o browse continua "comendo linhas". Daí resolvi dar uma estudada no grid, e consegui colocar para funcionar belezinha no grid. O único inconveniente do grid relacionado ao browse que encontrei foi ter que fazer dois controles né, se apaga um registro tem que ir no grid e apagar uma linha, se incluir um registro no dbf tem que incluir no grid também. No browse não era feito de forma automática.
Mas tá funcionando e belezinha... não tenho problemas com o controle de linhas é só mandar ir para o ultimo item (itemcount) do grid que ele automaticamente atualiza a exibição.

Obrigado

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar de usuário

rubens
Colaborador

Colaborador
 
Mensagens: 1518
Data de registro: 16 Ago 2003 09:05
Cidade/Estado: Nova Xavantina - MT
Curtiu: 77 vezes
Mens.Curtidas: 104 vezes

Anterior



Retornar para MiniGui

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 4 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro