FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Forzar salida del get con ACTION
Posts: 632
Joined: Thu Jan 19, 2006 10:45 AM
Forzar salida del get con ACTION
Posted: Wed Jul 22, 2009 12:30 PM
Hola de nuevo, estoy probando la clausula ACTION del get y me preguntaba si hay forma de forzar la salida del campo una vez se ha ejecutado el ACTION. Con VALID va estupendo cuando pulso intro en el campo que tiene el foco me hace la comprobación del campo me lo actualiza si cambio los datos y me pasa al get siguiente. Si lo hago con el botón que activa el ACTION me hace lo mismo pero no me pasa al get siguiente, me actualiza el campo pero con el cursor le tengo que volver a pulsar intro de nuevo para que ejecute valid y pase a la linea siguiente. Los dos procesos tanto la clausula VALID como ACTION ejecuta la misma función solo que la VALID pulsas antes un intro y el ACTION solo es una pulsación de ratón. Hay alguna forma de forzar la salida al campo siguiente, lo he intentado mandando un CHR(13) osea un intro pero no funciona, alguno tiene una solución.
Code (fw): Select all Collapse
                    
              @ f_px[n] - nInicio + 0.3 , f_py[n] - 2  GET &oGet VAR &v_temp OF      oDlgAlta        ;
                                                                             SIZE    v_long , v_high ;
                                                                             PICTURE &p              ; 
                                                                             VALID   &v_fval         ;
                                                                             ACTION  ( &v_fval, chr(13))    ;
                                                                             UPDATE
Saludos



Andrés González desde Mallorca
Posts: 1054
Joined: Sun Oct 09, 2005 10:41 PM
Re: Forzar salida del get con ACTION
Posted: Wed Jul 22, 2009 02:39 PM
Prueba asi;
Code (fw): Select all Collapse
 f_px[n] - nInicio + 0.3 , f_py[n] - 2 ;
      GET &oGet VAR &v_temp OF      oDlgAlta        ;
             SIZE    v_long , v_high ;
             PICTURE &p              ; 
             VALID   &v_fval         ;
             ACTION  ( &v_fval, chr(13), .t. )    ;   // al final va un .t. 
             UPDATE
Posts: 632
Joined: Thu Jan 19, 2006 10:45 AM
Re: Forzar salida del get con ACTION
Posted: Thu Jul 23, 2009 05:41 AM

Gracias Willi, ayer ya había hecho esta prueba y no, no funciona. Incluso hice el inverso primero el chr(13) y luego la función, pero no se entera del chr(13). Supongo que debe haber una forma de decirle al get que estoy editando que pierda el foco y pase al siguiente, pero no se me ocurre como. No se como hacer referencia al get que estoy editando. He provado con todo lo que se me ocurre SELF:killfocus(), ::oget:killfocus, y no funciona.

Saludos



Andrés González desde Mallorca
Posts: 632
Joined: Thu Jan 19, 2006 10:45 AM
Re: Forzar salida del get con ACTION
Posted: Thu Jul 23, 2009 12:43 PM
Antonio se te ocurre alguna solución para este tema, resulta que esta forzado al mismo get cuando se declara el boton. Se tendría que poder pasar al siguiente Get o a otro determinado. De la manera que esta implementado, cuando pulsas el boton te ejecuta el codeblock y te vuelve el control al mismo get, lo que te obliga a pulsar de nuevo el intro para que se ejecute el valid y poder seguir. oThis:SetFocus() fuerza que siempre se quede con el foco aunque tu antes le digas que vaya a otro get. Debería permitir el desplazamiento del foco o incluso que si el codeblock devuelve .t. deje ir al siguiente objeto. Vamos son ideas !!!

Code (fw): Select all Collapse
METHOD CreateButton() CLASS TGet

   local oThis := Self

   if ValType( ::bAction ) == "B" .and. Upper( ::ClassName() ) == "TGET"
      if Empty( ::cBmpName )
         @ 0, ::nWidth - ::nHeight BUTTONBMP ::oBtn OF Self ;
            ACTION ( Eval( oThis:bAction, oThis ), oThis:SetFocus() ) ;
            SIZE ::nHeight - 4, ::nHeight - 4 PIXEL
         if Empty( ::oBtn:hBitmap )
            ::oBtn:SetText( "..." )
         endif
      else
         @ 0, ::nWidth - ::nHeight BUTTONBMP ::oBtn OF Self ;
            ACTION ( Eval( oThis:bAction, oThis ), oThis:SetFocus() ) ;
            SIZE ::nHeight - 4, ::nHeight - 4 PIXEL BITMAP ::cBmpName
      endif
      ::oBtn:lCancel = .T. // so the GET VALID is not fired when the button is focused

      /*
      // We force a WM_NCCALCSIZE msg to be sent to the GET
      SetWindowPos( ::hWnd, 0, 0, 0, 0, 0,;
                    nOr( SWP_NOMOVE, SWP_NOSIZE, SWP_NOZORDER, SWP_FRAMECHANGED ) )
      */
   endif

return nil
Saludos



Andrés González desde Mallorca
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Forzar salida del get con ACTION
Posted: Thu Jul 23, 2009 01:14 PM
Saludos Andres...

Prueba hacer esto....

Code (fw): Select all Collapse
   @ nX, nY GET oGet VAR nVar picture "999.999" ;
   ACTION( If( oGet:lValid, ( Mi_Accion(), PostMessage( oGet:hWnd, WM_KEYDOWN, 13 ) ), )  ) ;
   VALID( nVar > 100 )
Posts: 299
Joined: Mon Oct 22, 2007 03:03 PM
Re: Forzar salida del get con ACTION
Posted: Thu Jul 23, 2009 01:17 PM

sustituye el chr(13) por __Keyboard(CHR(13))

Saludos



Angel, Valencia, Venezuela



xH .997 - FW 7.9 - BCC55 - WorkShop - MySql
Posts: 1054
Joined: Sun Oct 09, 2005 10:41 PM
Re: Forzar salida del get con ACTION
Posted: Thu Jul 23, 2009 03:10 PM

Prueba con ON CHANGE (.....) en vez de ACTION,,
Salu2

Posts: 632
Joined: Thu Jan 19, 2006 10:45 AM
Re: Forzar salida del get con ACTION
Posted: Fri Jul 24, 2009 06:55 AM
Gracias a todos, unos comentarios y os digo como lo he solucionado.

ADBLANCO: Ya habíamos deducido que el chr(13) no hacia nada ya que no ejecuta ninguna acción lo que aporta es un carácter, pero si empleo el __keyboard() lo que me hace es quedarse el get sin el cursor y no me pasa al siguiente get.

Daniel Garcia: Perfecto, me ha ido de maravilla pero he tenido que hacer una pequeña variante. Nunca había empleado esta función. Mil gracias.

Willi: Gracias ya no hizo falta, ya que el aporte de Daniel lo solucionó de forma elegante.

Finalmente ha quedado funcionando de la siguiente manera:
Code (fw): Select all Collapse
  @ f_px[n] - nInicio + 0.3 , f_py[n] - 2  GET &oGet VAR &v_temp OF  oDlgAlta ;
                                                            SIZE    v_long , v_high ;
                                                            PICTURE &p               ;
                                                            VALID   &v_fval          ;
                                                            ACTION  ( &v_fval, PostMessage( ::hWnd, WM_KEYDOWN, 13 ) ) ;
                                                            UPDATE



Questión: Si se decide desde ACTION mandar el foco a otro get, como comenté anteriormente, se podría hacer? Por ejemplo cuando tu seleccionas un dato de una lista que actualiza tu get, te puede interesar que en función de dato seleccionado te pueda dirigir a otro get para rellenar datos. De esta manera solo hemos conseguido pasar al get siguiente.
Saludos



Andrés González desde Mallorca
Posts: 1710
Joined: Tue Oct 28, 2008 06:26 PM
Re: Forzar salida del get con ACTION
Posted: Fri Jul 24, 2009 01:08 PM

Hola a todos

Yo en esto del Get y BITMAP cuando llama la función donde muestra el Browse para seleccionar, cuando se pulsa doble click,
sale error

Para solucionarlo he tenido que ponerle una pausa

oBrw:bLDblClick:={ || ( MsgRun(""),lOk:=.T.,oDlg:End() ) }

Cuando finaliza el Dialogo

VALID ( iif( lOk, ( oGet:VarPUT(CN_RUC),oGet:Refresh() ), ), .T. )

Quizas alguien ha tenido el problema, y me pueda dar una ayuda

Saludos

Adhemar

Saludos,



Adhemar C.
Posts: 498
Joined: Thu May 10, 2007 08:30 PM
Re: Forzar salida del get con ACTION
Posted: Wed Jul 29, 2009 11:07 AM
Andrés, prueba a sustituir PostMessage( ::hWnd, WM_KEYDOWN, 13 ) por: PostMessage( oCtrl:hWnd, WM_SETFOCUS )

Si no funciona prueba con: PostMessage( oCtrl:hWnd, FM_CHANGEFOCUS )

En ambos casos, oCtrl sería el control que quieres que tome el foco.
Peaaaaaso de foro...

FWH 2007 - xHarbour - BCC55
Posts: 632
Joined: Thu Jan 19, 2006 10:45 AM
Re: Forzar salida del get con ACTION
Posted: Wed Jul 29, 2009 06:44 PM

Antolín, gracias pero tal cual lo he puesto me funciona perfectamente. ::hWhn hace referencia al handle que estas editando en ese momento y lo que hace es mandarle el intro una vez ejecutado el codeblock para que pase al siguente, pero claro, igual si lo ejecuto tal como lo pones tu, puedo ir a otro get determinado. Tengo que revisar esta función pues veo que da mucho juego. Mil gracias.

Saludos



Andrés González desde Mallorca

Continue the discussion