19 de abril de 2016

Enlazar Eventos en Tiempo de Ejecución, uso de BINDEVENT

A partir de VFP8 ya puedes enlazar eventos en tiempo de ejecución, de que nos servirá esto?... Exploraremos un ejemplo práctico.

PUBLIC oForm
oHandler = CREATEOBJECT("myHandler")
oForm = CREATEOBJECT("MyForm",oHandler)
oForm.Show()
DEFINE CLASS myForm as Form 
  Width = 400
  Height = 225
  ADD OBJECT myGrid as Grid WITH Width=400, HEIGHT=180, TOP=5
  ADD OBJECT myCmdButton AS CommandButton ;
          WITH Top=190, Left=40,Caption="Bind",;
               Height=30              
  PROCEDURE INIT
  LPARAMETERS toHandler
     This.AddProperty("oHandler",toHandler)
  ENDPROC                
  PROCEDURE LOAD
     OPEN DATABASE (HOME(2)+"\Data\TestData")
     USE customer 
  ENDPROC
  PROCEDURE UNLOAD
     USE IN "Customer"
     CLOSE DATABASES ALL
  ENDPROC
  PROCEDURE myCmdButton.Click
     Thisform.EnlazaEvento() 
  ENDPROC
  PROCEDURE EnlazaEvento      
  * Recorremos los Objetos contenidos en el Grid
  FOR EACH loObjects IN Thisform.myGrid.Objects       
    FOR EACH loControls IN loObjects.Controls
      DO CASE 
       CASE UPPER(loControls.BaseClass)="HEADER"
       ** Enlazamos el evento Doble Click de los Headers
       ** Hacia un metodo del objeto Handler                                  
          BINDEVENT(loControls,"DblClick",this.oHandler,"DobleClick")
       CASE UPPER(loControls.BaseClass)="TEXTBOX"
       ** Enlazamos el evento Doble Click de los textbox
       ** Hacia otro metodo del objeto Handler                                                                                         
          BINDEVENT(loControls,"DblClick",this.oHandler,"MuestraValor")   
       ENDCASE
    ENDFOR   
  ENDFOR      
  ENDPROC
ENDDEFINE
DEFINE CLASS myHandler as Custom
   PROCEDURE DobleClick
       AEVENTS(laEventos,0)
       MESSAGEBOX("Lllamado desde:"+laEventos[1].Parent.ControlSource)
   ENDPROC
   PROCEDURE MuestraValor
      AEVENTS(laEventos,0)
      MESSAGEBOX(EVALUATE(laEventos[1].ControlSource))
   ENDPROC
ENDDEFINE

Con lo anterior hemos enlazado los eventos tanto de los Headers, como de los TextBox (en lo respectivo al evento Doble Click) del Grid, estos no ejecutaban ninguna acción en una primera instancia, pero cuando ejecutamos el botón "Bind" pudimos (en tiempo real) modificar el comportamiento de los eventos Doble Click sin necesidad de haberles agregado al Grid como clases personalizadas (único modo en versiones anteriores a VFP8).

En entregas posteriores veremos otras cosas interesantes sobre esta nueva función de Visual FoxPro 8, espero les sea de utilidad.

Esparta Palma

No hay comentarios. :

Publicar un comentario