3 de noviembre de 2015

Crear y manipular objetos en tiempo de ejecucion

Debes crear una serie de objetos (quizás páginas en un PageFrame) en tiempo de ejecución, el manejarlos representa un poco de trabajo, pero Visual FoxPro nos permite hacerlo de una manera fácil...

Es realmente fácil crear objetos en tiempo de ejecución, sólo basta utilizar el método AddObject() de el objeto contenedor (Thisform, Pageframe, Page, etc), pero no tiene mucha utilidad si éstos no tienen integrada una codificación para que realice cierta operación...

1.- Usando clases personalizadas

THISFORM::CrearBotones
LPARAMETERS nBotones
WITH THIS
  FOR lnCounter = 1 TO nBotones
    lcButtonName = "cmdProc" + TRANSFORM(lnCounter, "@L 99")
    .AddObject(lcButtonName, "myButtonClass")
    WITH  EVALUATE("This." + lcButtonName)
      .Caption = "Mi boton #" + TRANSFORM(lnCounter)
      .Top = << Calculo de Posicion Superior>>
      .Left = << Calculo de Posicion a partir de la izquierda >>
      .Height = << El Alto >>
      .Width = << El Ancho >>
      .Visible = .T.  && Muy importante ponerlo visible, por default no lo estan
      **** Podrias tener una propiedad a la cual hacer referencia en el procedimiento
      **** Click del mismo, en este caso lo he llamado idToProcess
      .idToProcess = lnCounter
    ENDWITH
  ENDFOR
ENDWITH

Con el ejemplo anterior debemos entender que se crearan "n" cantidad de objetos CommandButton, los cuales se comportarán según se hayan programado la clase "MyButtonClass", la cual deberá estar disponible dentro de SET CLASSLIB (si fue hecho en alguna clase visual .VCX) o SET PROCEDURE (si se hiciera en clase contenida en un .PRG).

A partir de VFP8 (y revisado en VFP9) podemos evitar la creación de clases enlazando los métodos en tiempo de ejecución, esto por medio de BindEvent.

2.- Usando BindEvents

THISFORM::CrearBotones
LPARAMETERS nBotones
WITH THIS
  FOR lnCounter = 1 TO nBotones
    lcButtonName = "cmdProc" + TRANSFORM(lnCounter, ";@L 99")
    .AddObject(lcButtonName, "CommandButton")
   loButton = EVALUATE("This."+lcButtonName)
    WITH  loButton
      .Top = << Calculo de Posicion Superior>>
      .Left = << Calculo de Posicion a partir de la izquierda >>
      .Height = << El Alto >>
      .Width = << El Ancho >>
      .Visible = .T.  && Muy importante ponerlo visible, por default no lo estan    
    ENDWITH
   *** Enlazar loButton.Click a This.MyClick
   BindEvent(loButton,"Click",This, "myClik")
  ENDFOR
ENDWITH

********************************
* Evento a enlace de los botones creados en Runtime
********************************
THISFORM::MyClick
   IF AEVENTS(laObjeto,0) > 0
      Messagebox("Ha hecho click en :"+laObjeto[1].Name)
  ENDIF

La parte importante de cualquiera de los métodos a utilizar será siempre en el uso de la función EVALUATE(), la cual, según el nombre esperado (o adivinado) nos devolverá una referencia hacia el objeto creado recientemente.

Espero que esta información les sea de utilidad.

Espartaco Palma Martínez

No hay comentarios. :

Publicar un comentario