Erro em bKeyDown

User avatar
miragerr
Posts: 140
Joined: Tue Oct 11, 2005 2:36 am
Location: Brasil

Erro em bKeyDown

Post 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
Jackson Douglas C. Brito
Boa Vista - RR - Brasil
FWH 12.09 Last Build
xHarbour Free
UESTUDIO
SQLRDD
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

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

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post 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 ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
miragerr
Posts: 140
Joined: Tue Oct 11, 2005 2:36 am
Location: Brasil

Post 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:
Jackson Douglas C. Brito
Boa Vista - RR - Brasil
FWH 12.09 Last Build
xHarbour Free
UESTUDIO
SQLRDD
User avatar
miragerr
Posts: 140
Joined: Tue Oct 11, 2005 2:36 am
Location: Brasil

Post 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 ??
Jackson Douglas C. Brito
Boa Vista - RR - Brasil
FWH 12.09 Last Build
xHarbour Free
UESTUDIO
SQLRDD
User avatar
thefull
Posts: 720
Joined: Fri Oct 07, 2005 7:42 am
Location: Barcelona
Contact:

Post 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
Saludos
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
User avatar
pymsoft
Posts: 383
Joined: Tue Oct 11, 2005 1:01 pm
Location: Savona - Italia
Contact:

Post 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...
Pedro Gonzalez
User avatar
thefull
Posts: 720
Joined: Fri Oct 07, 2005 7:42 am
Location: Barcelona
Contact:

Post 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 }
Saludos
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
User avatar
pymsoft
Posts: 383
Joined: Tue Oct 11, 2005 1:01 pm
Location: Savona - Italia
Contact:

Post 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
Pedro Gonzalez
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post 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   
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
thefull
Posts: 720
Joined: Fri Oct 07, 2005 7:42 am
Location: Barcelona
Contact:

Post 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.
Saludos
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
User avatar
pymsoft
Posts: 383
Joined: Tue Oct 11, 2005 1:01 pm
Location: Savona - Italia
Contact:

Post 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
Pedro Gonzalez
User avatar
miragerr
Posts: 140
Joined: Tue Oct 11, 2005 2:36 am
Location: Brasil

Post 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]
Jackson Douglas C. Brito
Boa Vista - RR - Brasil
FWH 12.09 Last Build
xHarbour Free
UESTUDIO
SQLRDD
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post 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.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
thefull
Posts: 720
Joined: Fri Oct 07, 2005 7:42 am
Location: Barcelona
Contact:

Post 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
Saludos
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
Post Reply