Page 1 of 2

Erro em bKeyDown

Posted: Sun Dec 30, 2007 11:09 pm
by miragerr
Ola amigos

tem um pequeno problema com o bKeyDown na versão do FWH 7.12

ele EXECUTA 2X a mesma função

exemplo:

Code: Select all

// Testing GETs

#include "FiveWin.ch"

function Main()
   LOCAL oDlg, oGet
   LOCAL cCad := "Testing    " // pad("Testing Gets",40)
   LOCAL nNum := 0
   LOCAL dDat := Date()

   Set century On
   Set Date Ansi
   Set Date format "mm/dd/yyyy"

   SET _3DLOOK ON

   DEFINE DIALOG oDlg TITLE "TGet from " + FWDESCRIPTION

   @ 1,    2 SAY "Text..:" OF oDlg
   @ 1,    6 GET oGet VAR cCad OF oDlg SIZE 60, 10 COLOR "W/G" PICTURE "@K"
   @ 1.8,  2 SAY "Number:" OF oDlg
   @ 2,    6 GET oGet VAR nNum OF oDlg SIZE 60, 10 PICTURE "9999999.99"
   @ 2.6,  2 SAY "Date:" OF oDlg
   @ 3,    6 GET oGet VAR dDat PICTURE "@E" OF oDlg SIZE 60, 10  // "@D"

// VEJA AKI <<------------------------------------------------------------------
// se precionar F2 ira repetir 2X a mesma função
	oGet:bKeyDown := {|nKey| 	IIF( nKey=VK_F2, MsgInfo("ok"), ), NIL }


   @ 3,    7 BUTTON "&Ok" OF oDlg SIZE 30, 12 ACTION oDlg:End()
   @ 3,   16 BUTTON "&Cancel" SIZE 30, 12 OF oDlg ACTION oDlg:End() CANCEL

   ACTIVATE DIALOG oDlg CENTERED

return nil

//------------------------------------------------------------------------//

procedure appsys // XBase++ requirement
return
Creio que isto não esta correto

outra coisa na CLASSE WINDOW comigo acontece algo estranho
pois se comento a linha abaixo


METHOD EndPaint() INLINE ::nPaintCount--,;
EndPaint( ::hWnd, ::cPS ), ::cPS := nil, ::hDC := nil //, 0 // keep this zero here!


veja que estou comentanto o ZERO pois desta forma as minhas DIALOGS que tem VALID se encerram corretamente

se coloco o ZERO "DEFAULT" não me encerra "finaliza" a DIALOG corretamente

Espero que corrijam o problema

Posted: Mon Dec 31, 2007 1:17 am
by Antonio Linares
oGet:bKeyDown := {|nKey| IIF( nKey=VK_F2, ( MsgInfo("ok"), 0 ), ) }

Posted: Mon Dec 31, 2007 1:20 am
by Antonio Linares
Por favor prueba fwh\samples\TestDlg.prg y verás que el VALID se ejecuta correctamente.

Puedes proporcionar un ejemplo que reproduzca el error que comentas ?

Posted: Mon Dec 31, 2007 1:30 pm
by miragerr
Ola amigo ANTONIO

Funciono perfecto :D

oGet:bKeyDown := {|nKey| IIF( nKey=VK_F2, ( MsgInfo("ok") , 0 ), ) }

Mais tenho muitas functions neste estilo, terei que fazer UMA a UMA esta mudança, num tem como permanecer igual a FWH 7.09

Seriam muitas alteraçoes :cry:

Posted: Thu Jan 03, 2008 4:43 pm
by miragerr
Ola amigo Antonio


como fazer numa situação desta:

Code: Select all

	oCod:bKeyDown := {|nKey| 	iif( nKey=VK_F3, ( lQtd := .T., oQtd:SetFocus() ), ),;
										IIF( nKey=VK_F2, ( MenuPdv( oDlg_Pdv, @vmprod, @oBrowse, oSSay ), oCod:SetFocus() ), ),;
										IIF( nKey=VK_F4, ( Canc_Cupom( @vmProd, @oBrowse, oSSay, oCod ), oBrowse:Refresh(), oCod:SetFocus(),;
																oEstDbf:Blank(), SysRefresh(), oCod:SetFocus(), oDlg_Pdv:Update() ), ),;
										IIF( nKey=VK_F5, ( Finaliza_Venda( @VMProd, oBrowse, oSSay ),;
																cCod := Space(Len(VMREFERE_ESTO)),;
																oCod:SetFocus(),;
																oBmp1:cResName := NIL,;
																IIF( !Empty(USERINFO_BMPIMP), oBmp1:LoadImage(, Alltrim(USERINFO_BMPIMP) ), oBmp1:LoadImage( "BITMAP_28") ),;
																oBmp1:refresh(),;
																CaixaLivre( oDlg_Pdv, vmProd, oBrowse, oFnTit3 ) , oDlg_Pdv:Update() ) , ),;
										iif( nKey=VK_F6, ( oCod:Disable(), xSetFocus(oBrowse), oCod:Enable() ), ),;
										iif( nKey=VK_F7, ( AbreGavetaPDV(), oCod:SetFocus() ), ),;
										iif( nKey=VK_F8, ( BuscaPrecoPDV(), oCod:SetFocus() ), ),;
										iif( nKey=VK_F9, ( nPeso := 1, MsgRun("Aguarde Buscando Peso...","Atenção",{|| nPeso := PegaPesoBalanca()} ), iif( Empty(nPeso), 1, nQtd := nPeso ), oDlg_Pdv:Update(), oCod:SetFocus() ), ),;
										iif( nKey=86   , ( Most_Tela( @vmprod, @oBrowse, .T. ),oBrowse:nRowPos	:= Min( Len( vmprod ), 7 ),;
																oBrowse:nAt := Len( vmprod ), xSetFocus(oBrowse), nQtd := 1, cCod := Space(Len(VMREFERE_ESTO)),;
																oQtd:Refresh(), oBtnPrin[4]:Enable(), oBtnPrin[5]:Enable(), oCod:nPos := 1, oCod:Refresh(),;
																oDlg_Pdv:Update() ), ),;
										iif( nKey=73   , ( InserirBoleto( @vmprod, @oBrowse, oSSay ), nGer := ASum( vmProd, 4), nQtd := 1, oDlg_Pdv:Update() ), );
										, 0 }
Não funciona BACKSPACE, LEFT, RIGHT

Na versão 7.09 não tinha estes problemas

Como resolver isto ??

Posted: Mon Jan 14, 2008 9:02 am
by thefull
Prueba esto;

::bKeyDown := { | nKey | IIF( nKey == VK_F8, ;
( eval( ::bAction ), 0 ) , 1 ) }

Es decir, si tu realizas la accion, devuelve cero, en caso contrario,
debes de DEVOLVER DIFERENTE DE CERO, un 1 por ejemplo, para que
se siga propagando el evento, y te trate las teclas que no tratas tu mismo.

De todas maneras te aconsejo que QUITES eso codigo del codeblock y lo envies a una funcion

Code: Select all

o:bKeyDown := { |nkey| MyKey( nKey ) }

STATIC FUNCTION MyKey( nKey )

  do case 
      case nKey == VK_F3
             Func1()
             return 0
  endcase

return 1

Posted: Mon Jan 14, 2008 1:59 pm
by pymsoft
Tengo el mismo problema con la version de enero 2008, o sea, no ejecuta las teclas de funcione con el bKeyDown...


Tengo codigo de este tipo en todo el programa:

Code: Select all

oG[2]:bKeyDown   = { | nKey, nFlags | IF( nKey = VK_SCROLL .OR. nKey = VK_F2, OpzioneModuli( oG[2] ), ) }
Será posible que tenga que cambiar todo mi codigo para que me funcionen las teclas de funcion en los GET?

:?


Vuelvo a compilar con la version de diciembre 2007 que me funciona...

Posted: Mon Jan 14, 2008 3:29 pm
by thefull
pymsoft wrote:Tengo el mismo problema con la version de enero 2008, o sea, no ejecuta las teclas de funcione con el bKeyDown...


Tengo codigo de este tipo en todo el programa:

Code: Select all

oG[2]:bKeyDown   = { | nKey, nFlags | IF( nKey = VK_SCROLL .OR. nKey = VK_F2, OpzioneModuli( oG[2] ), ) }
Será posible que tenga que cambiar todo mi codigo para que me funcionen las teclas de funcion en los GET?

:?


Vuelvo a compilar con la version de diciembre 2007 que me funciona...
Has puesto el devolver cero o uno ?

Code: Select all

oG[2]:bKeyDown   = { | nKey, nFlags | IF( nKey = VK_SCROLL .OR. nKey = VK_F2, OpzioneModuli( oG[2] ), 0 ), 1 }

Posted: Mon Jan 14, 2008 3:44 pm
by pymsoft
TheFull,

Nunca puse devolver 0 o 1, porqué debería ponerlo ahora?

Que fue lo que cambió que no me enteré?

Tendría que devolver 0 o 1 en TODAS las llamadas a teclas de función en los GETS :cry:


Saludos

Posted: Mon Jan 14, 2008 8:39 pm
by Antonio Linares
Pedro,

Es un cambio reciente que se ha introducido para poder controlar si queremos que la ejecución de una tecla, siga ó nó, después de evaluar el bKeyDown.

Antes se hacía al final, y no había forma de capturar la tecla al principio, antes de empezar a procesarla

La ejecución se detiene sólo si se devuelve cero:

Code: Select all

   if ::bKeyDown != nil
      if ValType( uVal := Eval( ::bKeyDown, nKey, nFlags, Self ) ) == "N" .and. ;
         uVal == 0
         return 0
      endif   
   endif   

Posted: Tue Jan 15, 2008 9:27 am
by thefull
pymsoft wrote:TheFull,

Nunca puse devolver 0 o 1, porqué debería ponerlo ahora?

Que fue lo que cambió que no me enteré?

Tendría que devolver 0 o 1 en TODAS las llamadas a teclas de función en los GETS :cry:


Saludos
Es como te dice Antonio, también me volví loco; O realiza una modificacion;

Code: Select all

   if ::bKeyDown != nil
       uVal := Eval( ::bKeyDown, nKey, nFlags, Self )   
          if ValType( uVal ) == "N" 
             if uVal == 0
                return 0
             endif
          endif   
       endif
   endif    
Teoricamente, no esta probado, esto tiene que funcionarte, TODOS los valores que devuelves con tu codeblock, seran ignorados , EXCEPTO los que devuelven numericos , que usaran la nueva implementación, manteniendo la compatibilidad con tu codigo y con el nuevo.

Posted: Tue Jan 15, 2008 9:29 am
by pymsoft
Antonio,


Me toca cambiar todas las ocurrencias en los GET donde uso bkeydown...

Muchas de este tipo:

Code: Select all

    oG[1]:bKeyDown := { | nKey, nFlags | IF( nKey == VK_F2, ( cCodCli := ListaCLF( oG[1], oG[1]:oGet:Buffer, "C" ), cNameCli := NameClf( cCodCli ), oG[2]:refresh() ), NIL ), TastiFun( nKey, nFlags, oBrw, mov_tmp->mov_cod, mov_tmp->mov_tag, oSayTot, codOpe, cCodCli, oG, lAperCassaOk ) }
    oG[3]:bKeyDown := { | nKey, nFlags | IF( nKey == VK_F2, (cTmp := oG[3]:varget(), ListaDlgArt( @cTmp, @cCodTag ), cCodArt := cTmp, oG[3]:refresh(), oG[4]:refresh() ) , NIL ), TastiFun( nKey, nFlags, oBrw, mov_tmp->mov_cod, mov_tmp->mov_tag, oSayTot, codOpe, cCodCli, oG, lAperCassaOk ) }
    oG[6]:bKeyDown := { | nKey, nFlags | IF( nKey == VK_NEXT .AND. !EMPTY( cCodArt ) .AND. ( !EMPTY(cCodTag) .AND. oV:cGesTag = "S" .OR. EMPTY(cCodTag) .AND. oV:cGesTag != "S") , (NewRiga( oBrw, oG ), oG[3]:setfocus()) , NIL ), TastiFun( nKey, nFlags, oBrw, mov_tmp->mov_cod, mov_tmp->mov_tag, oSayTot, codOpe, cCodCli, oG, lAperCassaOk ), ChgTotali( oSaytot ) }
    oG[7]:bKeyDown := { | nKey, nFlags | IF( nKey == VK_NEXT .AND. !EMPTY( cCodArt ) .AND. ( !EMPTY(cCodTag) .AND. oV:cGesTag = "S" .OR. EMPTY(cCodTag) .AND. oV:cGesTag != "S"), (NewRiga( oBrw, oG ), oG[3]:setfocus()) , NIL ), TastiFun( nKey, nFlags, oBrw, mov_tmp->mov_cod, mov_tmp->mov_tag, oSayTot, codOpe, cCodCli, oG, lAperCassaOk ), ChgTotali( oSaytot ) }
O modificar la clase tget todas las veces que actualice... no se puede poner una data global por default para que se comporte en este modo o no?

Gracias

Posted: Thu Jan 17, 2008 3:29 am
by miragerr
Antonio

Atualizei meu FWH 7.09 para 7.12 e tive que voltar pro 7.09, pois tinha problema com bKeyDown, adiquiri novamente a 8.01 no qual no WhatsAnew.txt informa:
* Fix: Due to recent Class TGet changes, bKeyDon was evaluated twice. Now it is ok.

ainda persiste o problema executa 2x a mesma função


e continua o problema
oCod:bKeyDown := {|nKey| iif( nKey=VK_F3, ( lQtd := .T., oQtd:SetFocus() ), ),;
IIF( nKey=VK_F2, ( MenuPdv( oDlg_Pdv, @vmprod, @oBrowse, oSSay ), oCod:SetFocus() ), ),;
IIF( nKey=VK_F4, ( Canc_Cupom( @vmProd, @oBrowse, oSSay, oCod ), oBrowse:Refresh(), oCod:SetFocus(),;
oEstDbf:Blank(), SysRefresh(), oCod:SetFocus(), oDlg_Pdv:Update() ), ),;
IIF( nKey=VK_F5, ( Finaliza_Venda( @VMProd, oBrowse, oSSay ),;
cCod := Space(Len(VMREFERE_ESTO)),;
oCod:SetFocus(),;
oBmp1:cResName := NIL,;
IIF( !Empty(USERINFO_BMPIMP), oBmp1:LoadImage(, Alltrim(USERINFO_BMPIMP) ), oBmp1:LoadImage( "BITMAP_28") ),;
oBmp1:refresh(),;
CaixaLivre( oDlg_Pdv, vmProd, oBrowse, oFnTit3 ) , oDlg_Pdv:Update() ) , ),;
iif( nKey=VK_F6, ( oCod:Disable(), xSetFocus(oBrowse), oCod:Enable() ), ),;
iif( nKey=VK_F7, ( AbreGavetaPDV(), oCod:SetFocus() ), ),;
iif( nKey=VK_F8, ( BuscaPrecoPDV(), oCod:SetFocus() ), ),;
iif( nKey=VK_F9, ( nPeso := 1, MsgRun("Aguarde Buscando Peso...","Atenção",{|| nPeso := PegaPesoBalanca()} ), iif( Empty(nPeso), 1, nQtd := nPeso ), oDlg_Pdv:Update(), oCod:SetFocus() ), ),;
iif( nKey=86 , ( Most_Tela( @vmprod, @oBrowse, .T. ),oBrowse:nRowPos := Min( Len( vmprod ), 7 ),;
oBrowse:nAt := Len( vmprod ), xSetFocus(oBrowse), nQtd := 1, cCod := Space(Len(VMREFERE_ESTO)),;
oQtd:Refresh(), oBtnPrin[4]:Enable(), oBtnPrin[5]:Enable(), oCod:nPos := 1, oCod:Refresh(),;
oDlg_Pdv:Update() ), ),;
iif( nKey=73 , ( InserirBoleto( @vmprod, @oBrowse, oSSay ), nGer := ASum( vmProd, 4), nQtd := 1, oDlg_Pdv:Update() ), );
, 0 }
outra coisa no menu

Code: Select all


	MENUITEM "&Relatórios"  NAME "BTN_PRINTER"
	MENU
		MENUITEM "&1 - Estoque"
        ENDMENU

o BITMAP aparece em cima das letras "axo que esta errado"

ANTONIO quero usar as atualizações mais recentes do FWH mais estou tendo dificuldades justamente na bKeydown

Tem como contornar este tipo de problema ou terei que ficar ETERNEMENTE com a FWH 7.09

Fico no aguardo
[/quote]

Posted: Thu Jan 17, 2008 7:30 am
by Antonio Linares
Jackson,

bKeyDown tiene que devolver cero si no quieres que se ejecute dos veces, ó sencillamente elimina este código del Método KeyDown() para dejarlo como estaba:

Code: Select all

   if ::bKeyDown != nil
      if ValType( uVal := Eval( ::bKeyDown, nKey, nFlags, Self ) ) == "N" .and. ;
         uVal == 0
         return 0
      endif   
   endif   
Rafa, tu código y el mio hacen lo mismo. La segunda parte de un .AND. no se ejecuta si no se cumple la primera parte.

Posted: Thu Jan 17, 2008 8:28 am
by thefull
Antonio Linares wrote: Rafa, tu código y el mio hacen lo mismo. La segunda parte de un .AND. no se ejecuta si no se cumple la primera parte.
Ummm.. tenia esa duda y por seguridad quise QUITARLO de ahi, gracias por comentarlo