Erro em bKeyDown

Erro em bKeyDown

Postby miragerr » Sun Dec 30, 2007 11:09 pm

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  Expand view  RUN
// 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
miragerr
 
Posts: 140
Joined: Tue Oct 11, 2005 2:36 am
Location: Brasil

Postby Antonio Linares » Mon Dec 31, 2007 1:17 am

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

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

Postby Antonio Linares » Mon Dec 31, 2007 1:20 am

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
Antonio Linares
Site Admin
 
Posts: 42107
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby miragerr » Mon Dec 31, 2007 1:30 pm

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

Postby miragerr » Thu Jan 03, 2008 4:43 pm

Ola amigo Antonio


como fazer numa situação desta:

Code: Select all  Expand view  RUN
   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
miragerr
 
Posts: 140
Joined: Tue Oct 11, 2005 2:36 am
Location: Brasil

Postby thefull » Mon Jan 14, 2008 9:02 am

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  Expand view  RUN
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
thefull
 
Posts: 731
Joined: Fri Oct 07, 2005 7:42 am
Location: Barcelona

Postby pymsoft » Mon Jan 14, 2008 1:59 pm

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  Expand view  RUN
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
pymsoft
 
Posts: 383
Joined: Tue Oct 11, 2005 1:01 pm
Location: Savona - Italia

Postby thefull » Mon Jan 14, 2008 3:29 pm

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  Expand view  RUN
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  Expand view  RUN
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
thefull
 
Posts: 731
Joined: Fri Oct 07, 2005 7:42 am
Location: Barcelona

Postby pymsoft » Mon Jan 14, 2008 3:44 pm

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
pymsoft
 
Posts: 383
Joined: Tue Oct 11, 2005 1:01 pm
Location: Savona - Italia

Postby Antonio Linares » Mon Jan 14, 2008 8:39 pm

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  Expand view  RUN
   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
Antonio Linares
Site Admin
 
Posts: 42107
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby thefull » Tue Jan 15, 2008 9:27 am

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  Expand view  RUN
   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
thefull
 
Posts: 731
Joined: Fri Oct 07, 2005 7:42 am
Location: Barcelona

Postby pymsoft » Tue Jan 15, 2008 9:29 am

Antonio,


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

Muchas de este tipo:

Code: Select all  Expand view  RUN
    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
pymsoft
 
Posts: 383
Joined: Tue Oct 11, 2005 1:01 pm
Location: Savona - Italia

Postby miragerr » Thu Jan 17, 2008 3:29 am

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  Expand view  RUN

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

Postby Antonio Linares » Thu Jan 17, 2008 7:30 am

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  Expand view  RUN
   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
Antonio Linares
Site Admin
 
Posts: 42107
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby thefull » Thu Jan 17, 2008 8:28 am

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__)
User avatar
thefull
 
Posts: 731
Joined: Fri Oct 07, 2005 7:42 am
Location: Barcelona

Next

Return to Bugs report & fixes / Informe de errores y arreglos

Who is online

Users browsing this forum: No registered users and 0 guests