Page 1 of 1

Ayuda con REDEFINE GET ... BITMAP ... ACTION (Solucionado)

PostPosted: Sun Aug 02, 2009 4:40 pm
by Blessed
Buen dia amigos del foro:

Estoy haciendo uso de Gets con Boton (No se si llamarlo BTNGet) y no esta funcionando adecuadamente.
Cuando se pulsa el boton se desencadena la accion correctamente, pero al retorno no se refresca el contenido del Get y tampoco se evalua el Get como tal.
Lo del refrescamiento lo solucionaba forzando un oGet:Refresh() pero con la FWH 9.06 ya ni esto puedo hacer.
Pero y como solucionar lo del VALID? Ya que el foco al parecer queda en el BOTON del GET.
Este es mi codigo :
Code: Select all  Expand view
  REDEFINE GET oGet VAR cAct_Codig ;
            ID 795 OF oDlg UPDATE PICTURE "###-##-##" ;
          BITMAP "lista" ACTION Consulta @cAct_Codig ) ;
            VALID ValCTA( @cAct_Codig, oGet, @cDescr )
 


Busque en el foro y halle una falla similar.

http://forums.fivetechsupport.com/viewtopic.php?f=6&t=12467&p=62781&hilit=hotkey#p62781

Pero con la clase BUTTON.

Saludos desde Honduras.

Re: Ayuda con REDEFINE GET ... BITMAP ... ACTION .. FWH 9.06

PostPosted: Mon Aug 03, 2009 9:17 am
by Andrés González
No te puedo comentar nada si en la versión fwh 9.06 han modificado algo o no, puesto que aun no lo tengo. Pero si efectivamente ese es el funcionamiento de ACTION del get. Te obliga a pulsar un nuevo intro para salir del get, lo cual evalua de nuevo el VALID. Plantee la misma pregunta hace muy poco y la respuesta ha sido en cierto modo elegante. Fijate en este hilo sobre lo mismo:

http://forums.fivetechsupport.com/viewtopic.php?f=6&t=16188&p=83926&hilit=forzar+salida#p83926

Por otra parte que no te refresque es porque deberias poner UPDATE como clausula final (no se si influye que la tengas al principio), siempre y cuando pases las variables por referencia (@variable,....) que veo que lo haces, ya que al ser modificadas tendría que actualizarse, lo que tu haces con oGet:Refresh() es volver a pintar-refrescar todo el objeto, que en cierto modo es lo mismo. La clausula update me funciona perfectamente con la 8.11.

Re: Ayuda con REDEFINE GET ... BITMAP ... ACTION .. FWH 9.06

PostPosted: Mon Aug 03, 2009 2:49 pm
by Blessed
Andrés Gracias por tu respuesta,

Ordene el codigo como lo indica FIvewin.ch, y no resulto.
Tambien aplique la sugeriancia de Daniel del Post al que me referiste y tampoco me funciona.

Creo que no puedo esperar ya que el cliente se habia acostumbrado a ese gadget, asi que tendre que implementar una solucion no sofisticada, un Get comun y corriente con un BtnBMP al lado, no muy elegante, pero bueno que mas... de esa manera lo tenia adelante andes de inclinarme por una elegante REDEFINE GET...BITMAP...ACTION

Saludos :?

Re: Ayuda con REDEFINE GET ... BITMAP ... ACTION .. FWH 9.06

PostPosted: Mon Aug 03, 2009 3:15 pm
by Andrés González
Estas seguro de que pones correctamente la función postmessage:
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
 


La funcion &v_fval guarda una funcion igual que la tuya pero ejecuta una diferente para cada objeto get. El mio forma parte de un FOR ... NEXT, ya que cojo los get de forma dinámica. En tu caso al ser un objeto conocido basta que pongas el handle oGet:hWnd en vez de ::hWnd. Fijate en el codigo tget que en mi caso es de la version 8.11 pero seguro que no debe haber cambiado mucho. Si te fijas la clausa ACTION ejecuta el codeblock y hagas lo que hagas siempre termina dándole el foco al get y por lo tanto tras el codeblock siempre vuelve al get que estas editando. Con el postmessage obligas a ejecutar la pulsación en ultimo lugar, después de recibir el foco de nuevo. Hice mil pruebas hasta que BIEL MORAGUES me abrió los ojos ya que hagas lo que hagas siempre vuelve a dar el foco al propio objeto y por lo tanto es difícil de que lo consigas sin cambiar ese trozo de código. Pero como has leído en el hilo, postmessage envía un mensaje a ese objeto que se ejecuta siempre en ultimo lugar y por lo tanto fuera del bucle que obliga siempe el a coger el propio foco.

Re: Ayuda con REDEFINE GET ... BITMAP ... ACTION .. FWH 9.06

PostPosted: Tue Feb 09, 2010 11:06 pm
by Blessed
Amigos del foro:

Una pregunta, acerca del GET...BITMAP...ACTION, en la 9.06 no funcionaba correctamente; lo hace bien en las versiones posteriores.

Saludos desde Honduras :)

Re: Ayuda con REDEFINE GET ... BITMAP ... ACTION .. FWH 9.06

PostPosted: Tue Feb 09, 2010 11:54 pm
by Antonio Linares
Oscar,

Este código parece funcionar correctamente aqui. Puedes probarlo y ver si te funciona bien a ti ? gracias

Code: Select all  Expand view
#include "FiveWin.ch"

function Main()

   local oWnd, oGet, cTest := Space( 20 ), cAnother := "Another Get"

   DEFINE WINDOW oWnd COLOR "N/W*"

   @ 2, 2 GET oGet VAR cTest SIZE 110, 22 ;
      ACTION ( cTest := "A test", oGet:Refresh(), oGet:SetFocus() ) BITMAP "..\bitmaps\16x16\find.bmp" ;
      VALID ! Empty( cTest )
     
   @ 4, 2 GET cAnother SIZE 110, 22  

   ACTIVATE WINDOW oWnd

return nil
 

Re: Ayuda con REDEFINE GET ... BITMAP ... ACTION .. FWH 9.06

PostPosted: Wed Feb 10, 2010 3:51 pm
by Blessed
Antonio, Gracias por atender

Ya habia usado una recomendacion similar lo use tanto en el codigo donde me funciona y al querer intentar colocarlo en la clase TGET, no lo he hecho funcionar; por lo cual he engordado el codigo.
Code: Select all  Expand view

METHOD CreateButton() CLASS TGet

   local oThis := Self
   local hBitmap
   local nBmpWidth := 1
   local lFileBmp := .t.
   
   if ValType( ::bAction ) == "B" .and. Upper( ::ClassName() ) == "TGET"
      if Empty( ::cBmpName )
         @ 0, ::nWidth - ::nHeight BUTTONBMP ::oBtn OF Self ;
         ACTION ( Eval( oThis:bAction, oThis ), oThis:Refresh(), oThis:SetFocus() ) ;
 


Y como no he usado la ribbonbar estoy queriendo actualizar;

Saludos

Re: Ayuda con REDEFINE GET ... BITMAP ... ACTION .. FWH 9.06

PostPosted: Wed Feb 10, 2010 4:11 pm
by Antonio Linares
Oscar,

Lo has modificado tambien en el "else" de ese último "if" ?

Re: Ayuda con REDEFINE GET ... BITMAP ... ACTION .. FWH 9.06

PostPosted: Wed Feb 10, 2010 7:55 pm
by Blessed
Antonio, Gracias

Veo que me falta mucho por aprender, hice omision de ello, he hecho la correccion y funciona correctamente.

Saludos desde Honduras :)

Re: Ayuda con REDEFINE GET ... BITMAP ... ACTION (Solucionado)

PostPosted: Thu Feb 11, 2010 11:18 am
by Blessed
Saludos a todos dejo aqui me funciono, no se si es prudente el uso de la funcion __Keyboard(), en este punto veremos los resultados :)
El cambio ha sido en PostMessage( oThis:Refresh, oThis:SetFocus(), WM_KEYDOWN, __Keyboard( Chr( 13 ) ) ) )

Code: Select all  Expand view

   if Empty( ::cBmpName )
      @ 0, ::nWidth - ::nHeight BUTTONBMP ::oBtn OF Self ;
      ACTION ( Eval( oThis:bAction, oThis ), PostMessage( oThis:Refresh, oThis:SetFocus(), WM_KEYDOWN, __Keyboard( Chr( 13 ) ) ) ) ;
      SIZE ::nHeight - 4, ::nHeight - 4 PIXEL

      if Empty( ::oBtn:hBitmap )
         ::oBtn:SetText( "..." )
      endif      
   else

      hBitmap   = If( ( lFileBmp := File( ::cBmpName ) ), ReadBitmap( 0, ::cBmpName ),;
                  LoadBitmap( GetResources(), ::cBmpName ) )        

      if ::lAdjustBtn
         nBmpWidth := nBmpWidth( hBitmap ) + 5
         ::SetMargins( 1, nBmpWidth )
      else
         nBmpWidth := ::nHeight - 4
      endif
     
      if ::lBtnTransparent
         ::oBtn := TBtnBmp():New(0, ::nWidth - nBmpWidth - 4, nBmpWidth, ::nHeight - 4,;
         if ( !lFileBmp, ::cBmpName, ),,if ( lFileBmp, ::cBmpName, ),,{|| Eval( oThis:bAction, oThis ), PostMessage( oThis:Refresh, oThis:SetFocus(), WM_KEYDOWN, __Keyboard( Chr( 13 ) ) ) },;
         Self,,,,,,,,,.f.)
         ::oBtn:lTransparent := ::lBtnTransparent
      else
         ::oBtn := TButtonBmp():New(0, ::nWidth - nBmpWidth - 4, , Self, {|| Eval( oThis:bAction, oThis ), PostMessage( oThis:Refresh, oThis:SetFocus(), WM_KEYDOWN, __Keyboard( Chr( 13 ) ) ) }, ;
         nBmpWidth, ::nHeight - 4,,,,.t.,,,,,,,::cBmpName )
      endif

      DeleteObject( hBitmap )          

   endif  
 


Saludos desde Honduras