18 de agosto de 2001

Los métodos Access y Assign

Métodos Access y Assign

Se ha mejorado Visual FoxPro para que admita los métodos Access y Assign. Estos métodos definidos por el usuario permiten ejecutar código cuando se consulta el valor de una propiedad o cuando se intenta modificar el valor de una propiedad.

El código del método Access se ejecuta cuando se consulta el valor de una propiedad, normalmente con la propiedad en una referencia de objeto, al almacenar el valor de la propiedad en una variable o al mostrar el valor de la propiedad con un signo de interrogación (?).

El código del método Assign se ejecuta cuando se intenta modificar el valor de una propiedad, normalmente mediante los comandos STORE o = para asignar un nuevo valor a la propiedad.

Los métodos Access y Assign sólo se ejecutan cuando se consultan o modifican los valores de las propiedades en tiempo de ejecución. La consulta o modificación de los valores de las propiedades en tiempo de diseño no hace que se ejecuten los métodos Access y Assign.

Nota: Como el valor que intenta asignar a la propiedad se pasa al método Assign, debe incluir una instrucción PARAMETERS o LPARAMETERS en el método Assign para aceptar el valor.

Puede crear independientemente los métodos Access y Assign (puede crear un método Access sin un método Assign o un método Assign sin un método Access).

Puede crear métodos Access y Assign para propiedades creadas mediante programación en una instrucción DEFINE CLASS o de forma interactiva para un formulario o una clase con el Diseñador de formularios y el Diseñador de clases.

Nota: También se pueden crear métodos Access y Assign para todas las propiedades nativas de Visual FoxPro. Por ejemplo, puede crear un método Access para la propiedad Left de un formulario, lo que le permitirá ejecutar código siempre que se consulte la propiedad Left del formulario. Puede crear un método Assign para una propiedad nativa de sólo lectura de Visual FoxPro (por ejemplo, la propiedad ParentClass), pero el método nunca se ejecutará.

Ventajas de los métodos Access y Assign

Los métodos Access y Assign proporcionan las ventajas siguientes:
  • Puede crear una interfaz pública para una clase o un objeto que separe la interfaz de la implementación.
  • Puede implementar fácilmente la validación de las propiedades.
  • Puede proteger fácilmente las propiedades en controles ActiveX que derivan de clases.
Crear métodos Access y Assign

Las mejoras del comando DEFINE CLASS y de los Diseñadores de formularios y de clases le permiten crear métodos Access y Assign mediante programación y de forma interactiva.

Nuevos sufijos para DEFINE CLASS

Se han agregado dos sufijos, _ACCESS y _ASSIGN, al comando DEFINE CLASS para crear métodos Access y Assign. Si anexa una de estas palabras clave al nombre de una función o un procedimiento, se creará un método Access o Assign para una propiedad que tenga el mismo nombre que la función o el procedimiento.

Por ejemplo, el siguiente ejemplo de código utiliza DEFINE CLASS para crear una clase personalizada llamada MiClase. Se crea una propiedad definida por el usuario, MiPropiedad, para la clase. A continuación se crea un método Access para MiPropiedad con la instrucción PROCEDURE.
Cuando se consulta el valor de la propiedad, se ejecuta el código del procedimiento (WAIT WINDOW 'Éste es el método Access'). También se crea un método Assign para MiPropiedad, de nuevo con una instrucción PROCEDURE. Cuando se intente modificar el valor de la propiedad, se ejecutará el código del procedimiento (WAIT WINDOW 'Éste es el método Assign').

Observe el uso de la instrucción LPARAMETERS para aceptar el valor pasado al método Assign. Este ejemplo también muestra cómo puede crear propiedades de sólo lectura.

DEFINE CLASS MiClase AS Custom
   MiPropiedad = 100 && Propiedad definida por el usuario

   PROCEDURE MiPropiedad_ACCESS && Método Access
      WAIT WINDOW 'Éste es el método Access';
          +  ' ' + PROGRAM( )
      RETURN THIS.MiPropiedad
   ENDPROC

   PROCEDURE MiPropiedad_ASSIGN && Método Assign
      LPARAMETERS tAssign  && Necesario para aceptar el valor
      WAIT WINDOW 'Éste es el método Assign';
          + ' ' + PROGRAM( )
   ENDPROC
ENDDEFINE

El ejemplo siguiente muestra cómo puede agregar un método Assign a una propiedad nativa de Visual FoxPro y realizar una sencilla validación del valor de la propiedad que intenta establecer. Observe que en este ejemplo se crea un método Assign sin un método Access correspondiente.

Se usa DEFINE CLASS para crear una clase Form llamada frmMiForm. Se crea un método Assign llamado Left_ASSIGN con una instrucción PROCEDURE. El código del método Assign se ejecuta siempre que se intente asignar un valor a la propiedad Left del formulario.

Si intenta asignar un valor negativo a la propiedad Left, se muestra un mensaje y no se modifica el valor de la propiedad Left. Si intenta asignar un valor no negativo a la propiedad Left, la propiedad Left del formulario queda establecida a dicho valor.

DEFINE CLASS frmMiForm AS Form
   PROCEDURE Left_ASSIGN && Método Assign
      LPARAMETERS tAssign  && Necesario para aceptar el valor
      
      DO CASE
         CASE tAssign < 0 && valor de Left negativo
            WAIT WINDOW 'El valor tiene que ser mayor que 0'
         OTHERWISE  && valor de Left no negativo
            THIS.Left = tAssign
      ENDCASE
   ENDPROC
ENDDEFINE
Los Diseñadores de clases y de formularios
Para crear un método Access o Assign en el Diseñador de formularios
  1. Elija Nueva propiedad en el menú Formulario.Se muestra el cuadro de diálogo Nueva propiedad.
  2. Escriba el nombre de la propiedad que va a crear en el cuadro de texto Nombre y, a continuación, seleccione la casilla de verificación Método Access o la casilla de verificación Método Assign (o ambas).
  3. Elija Agregar para crear la propiedad del formulario y para crear los métodos Access y Assign de la propiedad.
Para crear un método Access o Assign para una propiedad intrínseca de Visual FoxPro en el Diseñador de formularios
  1. Elija Nuevo método en el menú Formulario.Se muestra el cuadro de diálogo Nuevo método.
  2. Escriba el nombre de la propiedad intrínseca seguido de _Access o _Assign en el cuadro de texto Nombre. Por ejemplo, para crear un método Access para la propiedad Left, escriba Left_Access en el cuadro de texto Nombre.
  3. Elija Agregar para crear métodos Access o Assign para la propiedad intrínseca.
Nota En el Diseñador de formularios sólo puede crear propiedades con métodos Access y Assign para un formulario o un conjunto de formularios. Para crear propiedades con métodos Access y Assign para un control o un objeto, utilice el Diseñador de clases para crear la clase de control o de objeto. En el Diseñador de clases, agregue propiedades con métodos Access y Assign al control o al objeto y después agregue la clase de control u objeto al formulario en el Diseñador de formularios.

Para crear un método Access o Assign para una clase en el Diseñador de clases
  1. Elija Nueva propiedad en el menú Clase.Se muestra el cuadro de diálogo Nueva propiedad.
  2. Escriba el nombre de la propiedad que va a crear en el cuadro de texto Nombre y, a continuación, seleccione la casilla de verificación Método Access o la casilla de verificación Método Assign (o ambas).
  3. Elija Agregar para crear una propiedad para la clase y crear los métodos Access o Assign de la propiedad.
Método THIS_ACCESS

Se ha agregado a Visual FoxPro 6.0 un nuevo método global de clase, THIS_ACCESS. El código de un método THIS_ACCESS se ejecuta siempre que se intente modificar el valor de un miembro de un objeto o siempre que se intente consultar un miembro de un objeto.

El método THIS_ACCESS se crea en el código en un comando DEFINE CLASS o en los cuadros de diálogo Nuevo método o Modificar propiedades de las bibliotecas de clases visuales .vcx. Un método THIS_ACCESS siempre debe devolver una referencia de objeto; si no es así, se generará un error. Normalmente se devuelve la referencia de objeto THIS. El método THIS_ACCESS también debe incluir un parámetro para aceptar el nombre del miembro del objeto que se modifica o consulta.

El siguiente ejemplo muestra cómo crear un método THIS_ACCESS en el código de un comando DEFINE CLASS. Cuando este ejemplo se ejecuta como programa, 'Caption' se muestra dos veces, la primera cuando se le asigna un valor a la propiedad Caption y la segunda cuando se consulta el valor de la propiedad Caption. Después se muestra el valor de la propiedad Caption ('abc').

CLEAR
oTempObj = CREATEOBJECT('MiForm')  && Crea una instancia del formulario
oTempObj.Caption = 'abc'  && Asigna un valor y desencadena THIS_ACCESS
? oTempObj.Caption  && Consulta un valor y desencadena THIS_ACCESS

DEFINE CLASS MiForm AS Form
   PROCEDURE THIS_ACCESS
      LPARAMETER cMemberName  && Nombre del miembro del objeto

      IF cMemberName = 'caption'
         ? cMemberName  && Muestra el nombre del miembro del objeto
      ENDIF
      RETURN THIS
   ENDPROC
ENDDEFINE
Observe que THIS_ACCESS no pretende ser un sustituto global de los métodos Access y Assign (sólo proporciona información acerca del miembro del objeto al que se tiene acceso o se consulta). A diferencia de los métodos Access y Assign, THIS_ACCESS no proporciona control sobre los valores devueltos a miembros de objeto específicos.

Notas de programación de Access y Assign

Las secciones siguientes describen la información de programación para métodos Access y Assign.

Alcance

Los métodos Access y Assign están protegidos de forma predeterminada (no puede tener acceso a un método Access o Assign ni modificarlo desde fuera de la clase en la que se cree el método Access o Assign).

Incluya la palabra clave HIDDEN cuando cree un método Access o Assign para impedir el acceso y las modificaciones a las propiedades desde fuera de la definición de clase. Sólo los métodos y los eventos de la definición de la clase pueden tener acceso a las propiedades ocultas. Mientras que las subclases de la definición de clase pueden tener acceso a las propiedades protegidas, sólo la definición de la clase puede tener acceso a las propiedades ocultas.

Nota Si no incluye la palabra clave HIDDEN, puede crear subclases con los métodos Access y Assign.

Depuración

Puede ver el código de los métodos Access y Assign en la ventana Seguimiento de la ventana Depurador. Sin embargo, los métodos Access y Assign no se pueden ejecutar en las ventanas Inspección y Locales de la ventana Depurador.

Pasar matrices a los métodos Assign

Se pasan matrices a los métodos Access y Assign de la misma forma en que se pasan a procedimientos estándar de Visual FoxPro.

Si ejecuta SET UDFPARMS TO REFERENCE o se antepone @ al nombre de la matriz, se pasa la matriz completa al método Access o Assign. Si ejecuta SET UDFPARMS TO VALUE o escribe el nombre de la matriz entre paréntesis, se pasa por valor el primer elemento de la matriz. Los elementos de matriz siempre se pasan por valor. Para obtener más información acerca de cómo pasar valores y matrices, vea SET UDFPARMS.

Controles ActiveX

Las propiedades, los eventos o los métodos nativos de los controles ActiveX no admiten las propiedades Access y Assign. Sin embargo, las propiedades, los eventos y los métodos del Contenedor OLE que contiene al control ActiveX sí admite los métodos Access y Assign.

Método ResetToDefault

Si ejecuta el método ResetToDefault para un método Access o Assign se modifica el código del método Access o Assign al miniprograma predeterminado. El resultado es que el código heredado del método, si lo hubiera, no se ejecuta. La técnica utilizada para asegurar que el código heredado de la clase primaria se ejecuta varía según el tipo de método.

Coloque el código siguiente en la subclase de un método Access para ejecutar el código en la clase primaria:
RETURN DODEFAULT( )
Coloque el código siguiente en la subclase de un método Access para ejecutar el código de la clase primaria:
LPARAMETERS vnewval
DODEFAULT(vnewval)
THIS.<propiedad> = vnewval
Coloque el código siguiente en la subclase de un método THIS_ACCESS para ejecutar el código de la clase primaria:
LPARAMETERS cmember 
RETURN DODEFAULT(cmember)

Luis María Guayán

No hay comentarios. :

Publicar un comentario