Página 1 de 2

Problema com rolagem no browse

Enviado: 15 Abr 2014 18:48
por rubens
Pessoal tô começando com a minigui extends e tô com um problema...
Tenho um browse que apresenta os itens de venda. só que quando chega no limite de itens (cabe 15 itens, 15 linhas) ele não faz a rolagem dos itens para cima. Continua inserindo linhas mas ela ficam oculta nas dimensoes do browse. Se eu clico com o mouse e faço a navegação funciona normal. Quando chega no limite de 15 linhas começa a rolagem para cima normalmente..
Tem alguma coisa errada nas propriedades do browse?
Ou não é possível essa "atualização"?

A definição do browse.

Código: Selecionar todos

 	   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 form_venda.getdesktopheight()-300
		   height 400
 		   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}
		   ON KEY DELETE ACTION APAGA_ITEM()
		   ON LOSTFOCUS SAI_GRID_VENDA() 
		   		   
		END BROWSE	

Código onde é feito a inclusao do registro e retorna para o tbox código

Código: Selecionar todos

	      sele IVT
	      append blank
	      replace codpro_ 	with PRO->CODPRO_
	      REPLACE CODBARRA 	WITH PRO->CODBARRA
	      replace und_		with pro->und_
	      replace nompro_ 	with alltrim(pro->nompro_)
	      replace qtde_   	with form_venda.tbox_quantidade.value
	      replace valor_  	with pro->prvendal_
	      replace total_  	with ( pro->prvendal_ * form_venda.tbox_quantidade.value )
	      commit
	      
	      /*
	      */
	      setproperty('form_venda','tbox_unitario','value',pro->prvendal_)
  	      setproperty('form_venda','tbox_subtotal','value',pro->prvendal_*form_venda.tbox_quantidade.value)
  	      _total_compra := ( _total_compra + ( pro->prvendal_ * form_venda.tbox_quantidade.value ) )
  	      setproperty('form_venda','tbox_total_compra','value',_total_compra)
  
  	      form_venda.grid_vendas.refresh
              setproperty('form_venda','tbox_codigo','value','')
  	      form_venda.tbox_codigo.setfocus
Na figura abaixo o Codigo 3025 deveria ter sido empurrado para cima.

Problema com rolagem no browse

Enviado: 15 Abr 2014 19:52
por Toledo
Rubens, tenta fazer o seguinte:

Uma linha antes de:

Código: Selecionar todos

form_venda.grid_vendas.refresh
Incluir:

Código: Selecionar todos

form_venda.grid_vendas.Value:=recno()
Uma coisa que estou achando estranho, é o comando ON KEY DELETE ACTION APAGA_ITEM() estar dentro do Browse, entre as linhas DEFINE BROWSE e END BROWSE. O correto seria estar depois do END BROWSE.

Abraços,

Problema com rolagem no browse

Enviado: 16 Abr 2014 08:24
por rubens
Caro Toledo...
Uma coisa que estou achando estranho, é o comando ON KEY DELETE ACTION APAGA_ITEM() estar dentro do Browse, entre as linhas DEFINE BROWSE e END BROWSE. O correto seria estar depois do END BROWSE.
Eu coloquei no corpo do form e fez o mesmo efeito... mas como você estranhou vou deixar dentro do form.

Quanto a questão da rolagem, eu já havia feito várias tentativas:
Usando dbgobottom()
Alterando o value do browse colocando reccount(), recno(), varrendo o arquivo e somando o total dos registros e setando o value com esse total. Mas todas as tentativas de alterar o value do browse ele começa a fazer a rolagem mas o limite muda automaticamente para o meio da altura definido no caso, no lugar de fazer a rolagem na linha 15, faz na linha 07.

Mais alguma sugestão???

Obrigado,

Rubens

Problema com rolagem no browse

Enviado: 16 Abr 2014 10:50
por Toledo
Rubens, então tente o seguinte:

substituir este comando:

Código: Selecionar todos

form_venda.grid_vendas.Value:=recno()
Por este código:

Código: Selecionar todos

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
  nRecnoGrid:=nRegsGrid-nGoGrid
  Go nRecnoGrid
  form_venda.grid_vendas.Value:=recno()
Endif
Atenção: observe que estou movendo a posição do registro (Recno()) diferente do último incluído no DBF, então se depois destas linhas você tiver que fazer alguma coisa com o (último) registro que acabou de incluir, mover para Go Bottom.
Não fiz testes, mas acho que vai funcionar.

Abraços,

Problema com rolagem no browse

Enviado: 16 Abr 2014 11:08
por rubens
Toledo... blz...exatamente... Funcionou direitinho... resolveu o problema da rolagem... inclusive vou tentar colocar no onlostfocus do browse, para toda vez que ocorrer uma mudança no browse ele fazer esta atualização sempre mostrando os últimos itens.

Voltando a questão do on key escape, dentro desse grid quando pressiono ESC ele deveria voltar para o Código do produto mas ele tá acionando a função ESC definida no formulario de vendas... como se tivesse pressionado esc duas vezes, ele tá ignorando a função esc do browse e indo direto para função esc do formulário...

Tem algum jeito de forçar essa hierarquia. Quando pressionar o ESC do Browse ele acionar a função do Browse e não do form?



Rubens

Problema com rolagem no browse

Enviado: 16 Abr 2014 11:17
por Toledo
Rubens, nas suas mensagens anteriores você não falou nada sobre a tecla ESC, então sem ver o código fica complicado saber o que você está fazendo.

Abraços,

Problema com rolagem no browse

Enviado: 16 Abr 2014 21:54
por rubens
Desculpe Toledo... realmente ficou um pouco confuso... A Dúvida é a seguinte:
O Browse está dentro do form. Os eventos de On Key vão refletir no form ou no browse?
Como capturar as teclas pressionadas no Browse? Tipo o foco tá no browse e pressiona ESC como capturar a tecla pressionada? Eu queria que quando o foco estiver no Browse e pressionar ESC, o foco voltasse para o objeto tbox_codigo do form.

O que eu tenho que mudar no código abaixo para conseguir isso?

Código: Selecionar todos

/*
  sistema     : PDV
  programa    : principal
  compilador  : xharbour
  lib gráfica : minigui extended
*/

#include 'minigui.ch'            

function main()
local bColor := {202,202,255}

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 5
	append blank 
  	 REPLACE CODBARRA WITH '000000000000'+STR(X,1)
    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 
    

   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 vai_grid_vendas();
	   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}
	   onchange saidobrowse()

   END BROWSE
	
	// Esc sai do programa/form	
   on key escape action saidoprograma()
		
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 msgyesno('Confirma saída do programa ?','Form')
		form_venda.release
endif

return(nil)

********************************************************************************		
static function vai_grid_vendas()
	
	form_venda.grid_vendas.setfocus
	
return nil 
Esse código aí é só um fragmento mas está compilando e executando...
Obrigado
Rubens

Problema com rolagem no browse

Enviado: 16 Abr 2014 22:30
por Toledo
Rubens, faça o seguinte:

Depois de:

Código: Selecionar todos

local bColor := {202,202,255}
Incluir a linha:

Código: Selecionar todos

Private lSai:=.T.
Substituir:

Código: Selecionar todos

      onchange saidobrowse()
Por:

Código: Selecionar todos

  ONGOTFOCUS {|| lSai:=.F. }
  ONLOSTFOCUS {|| lSai:=.T. }
Alterar a função saidoprograma():

Código: Selecionar todos

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

return(nil)
Agora quando você estiver no Browse e pressionar ESC, será apresentado a mensagem perguntando se quer sair do Browse e se confirmar, volta para o tbox_codigo.

Abraços,

Problema com rolagem no browse

Enviado: 16 Abr 2014 22:57
por brockinf
Boa Noite,

Como se compila só este fonte em Harbour ?

Obrigada,

Ana Brock

Problema com rolagem no browse

Enviado: 16 Abr 2014 23:45
por Toledo
Oi Ana, os códigos apresentados neste tópico tem que ser compilados com a biblioteca MiniGui para Harbour, então você terá que fazer o download da MiniGui (MiniGui Extended ou HMG Oficial) e instalar no seu computador.

Para compilar este último exemplo postado pelo Rubens, copie e salve em um arquivo PRG (por exemplo: demo.prg) e depois digite:

Para MiniGui Extended:
C:\MiniGUI\BATCH\Compile demo

Para HMG Oficial:
\hmg.3.2\build demo

Veja outros exemplos na pasta SAMPLES da MiniGui, para compilar os exemplos basta executar o arquivo compile.bat (MiniGui Extended) ou build.bat (HMG Oficial) que está em cada pasta da pasta SAMPLES.

Atenção: a MiniGui Extended precisa da instalação do Borland BCC (http://www.hmgextended.com/files/MISC/F ... eTools.exe)

Abraços,

Problema com rolagem no browse

Enviado: 25 Abr 2014 18:29
por rubens
Toledo...

Daqui um pouco você me bloqueia no Fórum.... mas agora que tomei gosto pela minigui e tô portando um programa para ela.. tenho que correr atrás..

O seguinte... a rotina que você disponibilizou funcionou belezinha... desde que só aconteça inclusões no browse.

Inclusoes no browse

Código: Selecionar todos

static function calcula_valores()

* msginfo(' qtde ' +  str(form_venda.tbox_quantidade.value))
	
if form_venda.tbox_quantidade.value <=0
	form_venda.tbox_quantidade.value := 1
   form_venda.tbox_quantidade.setfocus()
   return(nil)
endif

if form_venda.tbox_quantidade.value > 100
	form_venda.tbox_quantidade.value := 1
	form_venda.tbox_quantidade.setfocus()
	return(nil)
endif	

if form_venda.tbox_codigo.value == ''
	form_venda.tbox_quantidade.value := 1
   form_venda.tbox_codigo.setfocus
   return(nil)
else
   /*
   grava na tabela IVT
   */
   SELE IVT
   APPEND BLANK
   REPLACE CODPRO_ 	WITH PRO->CODPRO_
   REPLACE CODBARRA 	WITH PRO->CODBARRA
   REPLACE UND_		WITH PRO->UND_
   REPLACE NOMPRO_ 	WITH ALLTRIM(PRO->NOMPRO_)
   REPLACE QTDE_   	WITH FORM_VENDA.TBOX_QUANTIDADE.VALUE
   REPLACE VALOR_  	WITH PRO->PRVENDAL_
   REPLACE TOTAL_  	WITH ( PRO->PRVENDAL_ * FORM_VENDA.TBOX_QUANTIDADE.VALUE )
   REPLACE CODGRU_	WITH PRO->CODGRU_
  	REPLACE LUCRO_		WITH PRO->LUCRO_ * FORM_VENDA.TBOX_QUANTIDADE.VALUE
  	REPLACE PRVENDA	WITH PRO->PRVENDAL_
  	REPLACE TRIBUTO	WITH PRO->TRIBUTO	
	REPLACE VLVISTA	WITH PRO->PRVENDAL_
   COMMIT
   
   /*
   */
   setproperty('form_venda','tbox_unitario','value',pro->prvendal_)
   setproperty('form_venda','tbox_subtotal','value',pro->prvendal_*form_venda.tbox_quantidade.value)
   _total_compra := ( _total_compra + ( pro->prvendal_ * form_venda.tbox_quantidade.value ) )
   setproperty('form_venda','tbox_total_compra','value',_total_compra)

	ivt->(dbgotop())
   // controle de rolagem do browse
   nCrtHandle	:= GetControlIndex( "grid_vendas" , "form_venda" )
   nTamPagGrid	:= 15 // ListViewGetCountPerPage ( _HMG_aControlhandles [nCrtHandle] )
   nRegsGrid	:= ivt->(RecCount())
   If nRegsGrid>nTamPagGrid
      nGoGrid:=Int(nTamPagGrid/2)
      If nGoGrid!=(nTamPagGrid/2)
         nGoGrid+=1
      Endif
      nRecnoGrid:=nRegsGrid-nGoGrid
      Go nRecnoGrid
      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)
Se houver alguma exclusão o browse fica meio estranho.. quando deleto uma linha ele também sobe uma linha no limite inferior... fica uma linha vaga... se deletar duas linhas uma na sequencia da outra ele sobre outra linha no limite, deixando duas linhas em branco... daí vou incluindo itens e ele vai se 'ajustando' mas depois de uns 05 itens ele simplesmente some com o Browse. Daí mando incluir outro item e ele volta a apresentar o browse, não some itens mas some o browse como se mandasse ficar invísivel.

Exclusão de item no browse

Código: Selecionar todos

********************************************************************************		
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
		
		_total_compra := 0
		ivt->(dbgotop())
		sum ivt->total_ to _total_compra 
		
		setproperty('form_venda','tbox_total_compra','value',_total_compra)
*		ivt->(dbgotop())
	
	/*
	   // controle de rolagem do browse
	   nCrtHandle	:= GetControlIndex( "grid_vendas" , "form_venda" )
	   nTamPagGrid	:= ListViewGetCountPerPage ( _HMG_aControlhandles [nCrtHandle] )
	   nRegsGrid	:= ivt->(RecCount())
	   If nRegsGrid>nTamPagGrid
	      nGoGrid:=Int(nTamPagGrid/2)
	      If nGoGrid!=(nTamPagGrid/2)
	         nGoGrid+=1
	      Endif
	      nRecnoGrid:=nRegsGrid-nGoGrid
	      Go nRecnoGrid
	      form_venda.grid_vendas.Value:=recno()
	   Endif
	*/
		form_venda.grid_vendas.refresh()
		SETPROPERTY( 'FORM_VENDA','TBOX_TOTAL_COMPRA','VALUE',_total_compra)
	   form_venda.tbox_total_compra.refresh()
	   
  		limpa_produtos()
  		
	endif
	
endif
	
form_venda.tbox_codigo.setfocus()	
	
return(nil)
Estudei a rotina que voce passou mas não encontrei nada que pudesse corrigir esse problema de quando apaga um item.

Daí pensei em quando apagar um item dar um release no browse, só que aí não vi no help nenhum outro metodo que voltasse o browse. Quando dá um release apaga ele do form ?

O que você sugere novamente ?

Postei duas telas... uma mostrando o erro que dá quando eu apago 03 produtos seguidos, sem incluir nenhum outro... e a outra tela mostrando quando ele some com o browse... daí o cursor fica com o foco no codigo, agindo normalmente, e quando mando incluir qualquer outro item ele volta a mostrar o browse. Não tem uma sequencia x, para sumir com o browe, nesse exemplo aí eu inseri somente mais tres itens depois de apagar um item. e ele sumiu com o browse.

Obrigado
Rubens

Problema com rolagem no browse

Enviado: 25 Abr 2014 18:57
por Toledo
Rubens, como está o seu comando SET DELETED? Está ON ou OFF?

Acho que se você colocar SET DELETED ON, vai resolver.

Abraços,

Problema com rolagem no browse

Enviado: 25 Abr 2014 19:07
por rubens

Código: Selecionar todos

   /*
   setamentos (alguns do clipper outros da minigui)
   */
   set autoadjust on
   set deleted on
   set date british
   set century on
   set epoch to 1980
   set browsesync on
   set multiple off warning
   set tooltipballoon on
   set navigation extended
   set codepage to portuguese
   set language to portuguese
Já está....

Rubens

Problema com rolagem no browse

Enviado: 25 Abr 2014 19:09
por rubens
Quando o browse some e eu incluo mais um item, quando ele volta a aparecer volta do tamanho normal ...

Problema com rolagem no browse

Enviado: 25 Abr 2014 20:07
por Toledo
Tenta o seguinte:

Procure:

Código: Selecionar todos

      nRecnoGrid:=nRegsGrid-nGoGrid
      Go nRecnoGrid
      form_venda.grid_vendas.Value:=recno()
Troque por:

Código: Selecionar todos

      nRecnoGrid:=nRegsGrid-nGoGrid
      Go Bottom
      Skip -(nRecnoGrid)
      form_venda.grid_vendas.Value:=recno()
Observei que no seu código de apaga_item() você comentou o código para controle de rolagem do browse, você terá que retirar /* e */. E também o comando refresh e setfocus não tem os () no final, vejo meus exemplos nas mensagens anteriores.

Abraços,