Forzar salida del get con ACTION

Forzar salida del get con ACTION

Postby Andrés González » 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: Select all  Expand view


                   
              @ 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
User avatar
Andrés González
 
Posts: 627
Joined: Thu Jan 19, 2006 10:45 am
Location: Mallorca

Re: Forzar salida del get con ACTION

Postby Willi Quintana » Wed Jul 22, 2009 2:39 pm

Prueba asi;
Code: Select all  Expand view

 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


 
User avatar
Willi Quintana
 
Posts: 1002
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú

Re: Forzar salida del get con ACTION

Postby Andrés González » Thu Jul 23, 2009 5: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
User avatar
Andrés González
 
Posts: 627
Joined: Thu Jan 19, 2006 10:45 am
Location: Mallorca

Re: Forzar salida del get con ACTION

Postby Andrés González » 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: Select all  Expand view

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
User avatar
Andrés González
 
Posts: 627
Joined: Thu Jan 19, 2006 10:45 am
Location: Mallorca

Re: Forzar salida del get con ACTION

Postby Daniel Garcia-Gil » Thu Jul 23, 2009 1:14 pm

Saludos Andres...

Prueba hacer esto....

Code: Select all  Expand view
  @ nX, nY GET oGet VAR nVar picture "999.999" ;
   ACTION( If( oGet:lValid, ( Mi_Accion(), PostMessage( oGet:hWnd, WM_KEYDOWN, 13 ) ), )  ) ;
   VALID( nVar > 100 )
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: Forzar salida del get con ACTION

Postby ADBLANCO » Thu Jul 23, 2009 1:17 pm

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

Angel, Valencia, Venezuela

xH .997 - FW 7.9 - BCC55 - WorkShop - MySql
User avatar
ADBLANCO
 
Posts: 299
Joined: Mon Oct 22, 2007 3:03 pm
Location: Valencia - Venezuela

Re: Forzar salida del get con ACTION

Postby Willi Quintana » Thu Jul 23, 2009 3:10 pm

Prueba con ON CHANGE (.....) en vez de ACTION,,
Salu2
User avatar
Willi Quintana
 
Posts: 1002
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú

Re: Forzar salida del get con ACTION

Postby Andrés González » Fri Jul 24, 2009 6: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: Select all  Expand view


  @ 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
User avatar
Andrés González
 
Posts: 627
Joined: Thu Jan 19, 2006 10:45 am
Location: Mallorca

Re: Forzar salida del get con ACTION

Postby acuellar » Fri Jul 24, 2009 1: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.
User avatar
acuellar
 
Posts: 1593
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

Re: Forzar salida del get con ACTION

Postby antolin » 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...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: Forzar salida del get con ACTION

Postby Andrés González » Wed Jul 29, 2009 6: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
User avatar
Andrés González
 
Posts: 627
Joined: Thu Jan 19, 2006 10:45 am
Location: Mallorca


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 74 guests