26 de abril de 2016

Enlazar con el evento Valid

Artículo original: Binding to the Valid event
http://www.foxpert.com/KnowlBits_200701_1.htm
Autor: Christof Wollenhaupt
Traducido por: Ana María Bisbé York


Como otras muchas cosas en Visual FoxPro, enlazar con el evento Valid no es tan evidente como uno pudiera desear. Al enlazar a un control en un grid, Visual FoxPro llama al objeto delegado, solamente cuando el control grid contiene código definido por el usuario en el evento Valid, en algún punto de la jerarquía. Este código podría no hacer nada y puede ser solamente un comentario. Visual FoxPro necesita el código del usuario como un lugar de enlace, así que suficiente conque exista.

Si intenta enlazar un evento Valid de un textbox utilizando el objeto Text1 predeterminado o un textbox regular sin ningún código especial en el evento Valid, su código no será llamado nunca. Este comportamiento ya está documentado (bien, oculto, en la sección Remarks (Observaciones) de BindEvent: "Ciertos eventos como When y Valid necesitan que haya código en el evento para que pueda ocurrir el enlace."

El siguiente ejemplo demuestra este comportamiento. No importa cómo navegue en el grid o qué valores cambie, el único evento Valid que verá siempre es el de la columna 2:

*==========================================================
* Enlazar al evento Valid de un control grid es posible
* solamente si emplea una subclase del control con código en el evento Valid
*==========================================================

Public goForm
Create Cursor Test (cField1 C(10), cField2 C(10))
Insert into Test Values ("one","two")
Insert into Test Values ("three","four")
Go top
goForm = CreateObject("Form")
goForm.AddObject("grd","MyGrid")
goForm.grd.Visible = .T.
goForm.Left = 200
goForm.Show()

Define Class MyGrid as Grid
  ColumnCount = 2

  Procedure Init
    This.Columns(2).RemoveObject("Text1")
    This.Columns(2).AddObject("Text1","MyTextbox")
    This.Columns(2).Text1.Visible = .T.
    BindEvent( ;
      This.Columns(1).Text1, "Valid", ;
      This, "ColumnValid" )
    BindEvent( ;
      This.Columns(2).Text1, "Valid", ;
      This, "ColumnValid" )
  EndProc

  Procedure ColumnValid
    Local laSource[1]
    AEvents(laSource,0)
    Activate Screen
    ? Sys(1272,laSource[1])
  EndProc
EndDefine

Define Class MyTextbox as TextBox
  Procedure Valid
  *
  EndProc
EndDefine

No hay comentarios. :

Publicar un comentario