Page 1 of 1

Forzar salida del get con ACTION

Posted: Wed Jul 22, 2009 12:30 pm
by Andrés González
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


                    
              @ 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

 

Re: Forzar salida del get con ACTION

Posted: Wed Jul 22, 2009 2:39 pm
by Willi Quintana
Prueba asi;

Code: Select all

 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


 

Re: Forzar salida del get con ACTION

Posted: Thu Jul 23, 2009 5:41 am
by Andrés González
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.

Re: Forzar salida del get con ACTION

Posted: Thu Jul 23, 2009 12:43 pm
by Andrés González
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

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


 

Re: Forzar salida del get con ACTION

Posted: Thu Jul 23, 2009 1:14 pm
by Daniel Garcia-Gil
Saludos Andres...

Prueba hacer esto....

Code: Select all

   @ nX, nY GET oGet VAR nVar picture "999.999" ;
   ACTION( If( oGet:lValid, ( Mi_Accion(), PostMessage( oGet:hWnd, WM_KEYDOWN, 13 ) ), )  ) ;
   VALID( nVar > 100 )

Re: Forzar salida del get con ACTION

Posted: Thu Jul 23, 2009 1:17 pm
by ADBLANCO
sustituye el chr(13) por __Keyboard(CHR(13))

Re: Forzar salida del get con ACTION

Posted: Thu Jul 23, 2009 3:10 pm
by Willi Quintana
Prueba con ON CHANGE (.....) en vez de ACTION,,
Salu2

Re: Forzar salida del get con ACTION

Posted: Fri Jul 24, 2009 6:55 am
by Andrés González
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


  @ 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.

Re: Forzar salida del get con ACTION

Posted: Fri Jul 24, 2009 1:08 pm
by acuellar
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

Re: Forzar salida del get con ACTION

Posted: Wed Jul 29, 2009 11:07 am
by antolin
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 _, oCtrl sería el control que quieres que tome el foco.

Re: Forzar salida del get con ACTION

Posted: Wed Jul 29, 2009 6:44 pm
by Andrés González
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.