FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Problema en la clase button
Posts: 694
Joined: Fri Oct 07, 2005 06:58 AM
Problema en la clase button
Posted: Fri Aug 29, 2008 11:04 AM
En el siguiente ejemplo:
#include 'Fivewin.ch' 

function Main()

LOCAL oDlg
LOCAL oGet1, oGet2, oGet3, oBtn 
LOCAL cVar1 := 'ABCDEF ' 
LOCAL cVar2 := SPACE( 8 ) 
LOCAL cVar3 := SPACE( 8 ) 

DEFINE DIALOG oDlg FROM 0, 0 TO 10, 30

@ 1, 1 GET oGet1 VAR cVar1 SIZE 30,12 PIXEL Valid ( MsgInfo('1'), .T. ) 

@ 40,50 BUTTON oBtn PROMPT '&Test' SIZE 30, 20 PIXEL

ACTIVATE DIALOG oDlg CENTER

return NIL


Al pulsar intro en el get debe pasar por el valid del mismo, osea ejecutar msgInfo('1').

Sin embargo, si pulsamos en el bot贸n y luego volvemos al get ya no ejecuta el valid.

Comprobando el c贸digo he visto que el m茅todo "FWLostFocus" de la clase control llama a lValid en el caso de que ::lValidating sea nil o falso
METHOD FWLostFocus( hCtlFocus ) CLASS TControl

   local oWnd, oCtl

   if ::oWnd:lValidating == nil .or. ! ::oWnd:lValidating // FW++ lValidating nil sometimes
      ::oWnd:lValidating = .t.
...


Pero en el m茅todo "Click" de la clase button se iguala lValidating a true y no se vuelve a pasar a nil o a falso
METHOD Click() CLASS TButton

   if ! ::lProcessing
   
      ::lProcessing = .t.
      
      if ::bWhen != nil .and. ! Eval( ::bWhen ) 
         ::lProcessing = .f.
         return nil 
      endif    

      ::oWnd:lValidating = .T.
...

Por lo que es normal que no se vuelva a ejecutar los valid's
Un saludo

Fernando Gonz谩lez Diez

ALSIS Sistemas Inform谩ticos
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Problema en la clase button
Posted: Sat Aug 30, 2008 06:21 PM
Fernando,

Tienes toda la raz贸n :-) Es un bug que se ha introducido en 8.08 al arreglar las diferencias entre pulsar un bot贸n y pulsar su acelerador (hotkey).

El c贸digo correcto ser铆a en Class TButton Method Click():
METHOD Click() CLASS TButton 

   if ! ::lProcessing 
    
      ::lProcessing = .t. 
      
      if ::bWhen != nil .and. ! Eval( ::bWhen ) 
         ::lProcessing = .f. 
         return nil 
      endif    

      if GetFocus() != ::hWnd
         ::oWnd:lValidating = .T.
         SetFocus( ::hWnd )
         ::oWnd:lValidating = .F.   
      endif
      ...


Asi tu ejemplo ya funciona correctamente. Muchas gracias por detectarlo y coment谩rnoslo :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com

Continue the discussion