Share via


Crear un conjunto de botones de desplazamiento por tablas

Una característica común de muchas aplicaciones es una serie de botones de desplazamiento que permiten a los usuarios moverse por una tabla. Suelen incluir botones para mover el puntero de registro al registro siguiente o anterior de la tabla, así como al registro superior o inferior de la tabla.

Diseño de los botones de desplazamiento

Todos los botones tendrán algunas características y funciones comunes, por lo que es conveniente crear una clase de botones de desplazamiento. A continuación, los botones individuales pueden aprovechar fácilmente esta apariencia y funcionalidad comunes. Esta clase primaria es la clase Navbutton que se definirá posteriormente en esta sección.

Una vez definida la clase primaria, las subclases siguientes definen la funcionalidad y apariencia específicas de cada uno de los cuatro botones de desplazamiento: navTop, navPrior, navNext, navBottom.

Por último se crea una clase de contenedor vcr, a la que se agregan todos los botones de desplazamiento. El contenedor puede agregarse a un formulario o una barra de herramientas para proporcionar funcionalidad de desplazamiento por tablas.

Definición de la clase NAVBUTTON

Para crear Navbutton, guarde las seis definiciones de clase siguientes (Navbutton, navTop, navBottom, navPrior, navNext y vcr) en un archivo de programa como Navclass.prg.

Definición de la clase genérica botón de comando de desplazamiento

Código Comentarios
DEFINE CLASS Navbutton AS
COMMANDBUTTON
  Height = 25
  Width = 25
  TableAlias = ""
Define la clase primaria de los botones de desplazamiento.

Asigna dimensiones a la clase.

Incluye una propiedad personalizada, TableAlias, que contiene el nombre del alias por el que desplazarse.

PROCEDURE Click
  IF NOT EMPTY(This.TableAlias)
   SELECT (This.TableAlias)
  ENDIF
ENDPROC
Si se ha establecido TableAlias, este procedimiento de clase primaria selecciona el alias antes de ejecutar el código real de desplazamiento en las subclases. De lo contrario, se supondrá que el usuario desea desplazarse por la tabla del área de trabajo seleccionada actualmente.
PROCEDURE RefreshForm
  _SCREEN.ActiveForm.Refresh
ENDPROC
Al emplear _SCREEN.ActiveForm.Refresh en lugar de THISFORM.Refresh puede agregar la clase a un formulario o una barra de herramientas y hacer que funcione perfectamente también.
ENDDEFINE
Finaliza la definición de clase.

Los botones de desplazamiento específicos se basan en la clase Navbutton. El código siguiente define el botón Superior para el conjunto de botones de desplazamiento. Los tres botones de desplazamiento restantes se definen en la tabla siguiente. Las cuatro definiciones de clase son similares. Por ello, sólo se ofrecen comentarios extensos para la primera definición.

Definición de la clase botón de desplazamiento Superior

Código Comentarios
DEFINE CLASS navTop AS Navbutton
  Caption = "|<"
Define la clase botón de desplazamiento Superior y establece la propiedad Caption.
PROCEDURE Click
Crea código de método que se ejecutará cuando se produzca el evento Click para el control.
  DODEFAULT( )
  GO TOP
  THIS.RefreshForm
Llama al código de evento Click de la clase primaria, Navbutton, de modo que se pueda seleccionar el alias adecuado si se ha establecido la propiedad TableAlias.

Incluye el código para establecer el puntero de registro en el primer registro de la tabla: GO TOP.

Llama al método RefreshForm de la clase primaria. No es necesario utilizar el operador de resolución de alcance (::) en este caso porque no hay ningún método en la subclase que tenga el mismo nombre que el método de la clase primaria. Por otra parte, tanto la clase primaria como la subclase tienen código de método para el evento Click.
ENDPROC
Termina el procedimiento Click.
ENDDEFINE
Finaliza la definición de clase.

Los restantes botones de desplazamiento tienen definiciones de clase similares.

Definición de las demás clases de botones de desplazamiento

Código Comentarios
DEFINE CLASS navNext AS Navbutton
  Caption = ">"
Define la clase de botón de desplazamiento Siguiente y establece la propiedad Caption.
PROCEDURE Click
  DODEFAULT( )
  SKIP 1
  IF EOF( )
   GO BOTTOM
  ENDIF
  THIS.RefreshForm
ENDPROC
ENDDEFINE



Incluye el código para establecer el puntero de registro en el siguiente registro de la tabla.



Finaliza la definición de clase.
DEFINE CLASS navPrior AS Navbutton
  Caption = "<"
Define la clase de botón de desplazamiento Anterior y establece la propiedad Caption.
PROCEDURE Click
  DODEFAULT( )
  SKIP –1
  IF BOF( )
   GO TOP
  ENDIF
  THIS.RefreshForm
ENDPROC
ENDDEFINE



Incluye el código para establecer el puntero de registro en el registro anterior de la tabla.



Finaliza la definición de clase.
DEFINE CLASS navBottom AS
Navbutton
  Caption = ">|"
Define la clase de botón de desplazamiento Inferior y establece la propiedad Caption.
PROCEDURE Click
  DODEFAULT( )
  GO BOTTOM
  THIS.RefreshForm
ENDPROC
ENDDEFINE


Incluye el código para establecer el puntero de registro en el último registro de la tabla.

Finaliza la definición de clase.

La siguiente definición de clase contiene los cuatro botones de desplazamiento para poder agregarlos como una unidad a un formulario. La clase también incluye un método para establecer la propiedad TableAlias de los botones.

Definición de una clase de controles de desplazamiento por tabla

Código Comentarios
DEFINE CLASS vcr AS CONTAINER
   Height = 25
   Width = 100
   Left = 3
   Top = 3
Comienza la definición de clase. La propiedad Height se establece en el mismo alto que los botones de comando que contendrá.
   ADD OBJECT cmdTop AS navTop ;
      WITH Left = 0
   ADD OBJECT cmdPrior AS navPrior ;
      WITH Left = 25
   ADD OBJECT cmdNext AS navNext ;
      WITH Left = 50
   ADD OBJECT cmdBot AS navBottom ;
      WITH Left = 75
Agrega los botones de desplazamiento.
PROCEDURE SetTable(cTableAlias)
   IF TYPE("cTableAlias") = 'C'
      THIS.cmdTop.TableAlias = ;
         cTableAlias
      THIS.cmdPrior.TableAlias = ;
         cTableAlias
      THIS.cmdNext.TableAlias = ;
         cTableAlias
      THIS.cmdBot.TableAlias = ;
         cTableAlias
   ENDIF
ENDPROC
Este método se utiliza para establecer la propiedad TableAlias de los botones. TableAlias se define en la clase primaria Navbutton.

También podría utilizar el método SetAll para establecer esta propiedad:
IF TYPE ("cTableAlias") = 'C'
This.SetAll("TableAlias", "cTableAlias")
ENDIF
Sin embargo, esto produciría un error si se agregara a la clase un objeto que no tuviera la propiedad TableAlias.
ENDDEFINE
Termina la definición de clase.

Una vez definida la clase, puede dividirla en subclases o agregarla a un formulario.

Crear una subclase basada en la nueva clase

También puede crear subclases basadas en vcr que tengan botones adicionales como Buscar, Modificar, Guardar y Salir. Por ejemplo, vcr2 incluye un botón Salir:

Definición de una subclase de control de desplazamiento por tablas

Código Comentarios
DEFINE CLASS vcr2 AS vcr
ADD OBJECT cmdQuit AS
COMMANDBUTTON WITH ;
   Caption = "Quit",;
   Height = 25, ;
   Width = 50
Width = THIS.Width + THIS.cmdQuit.Width
cmdQuit.Left = THIS.Width - ; 
   THIS.cmdQuit.Width
Define una clase basada en vcr y le agrega un botón de comando.
PROCEDURE cmdQuit.CLICK
   RELEASE THISFORM
ENDPROC
Cuando el usuario haga clic en cmdQuit, este código liberará el formulario.
ENDDEFINE
Termina la definición de clase.

Vcr2 tiene todo lo de vcr más el nuevo botón de comando y no es necesario volver a escribir ninguna parte del código.

Cambios en VCR reflejados en la subclase

A causa de la herencia, los cambios realizados en la clase primaria se reflejan en todas las subclases que se basan en ella. Por ejemplo, puede informar al usuario de que se ha llegado al final de la tabla si cambia la instrucción IF EOF( ) de navNext.Click por la siguiente:

IF EOF( )
   GO BOTTOM
   SET MESSAGE TO "Bottom of the table"
ELSE
   SET MESSAGE TO
ENDIF

Puede indicar al usuario que ha llegado al principio de la tabla, cambiando la instrucción IF BOF( ) de navPrior.Click por la siguiente:

IF BOF()
   GO TOP
   SET MESSAGE TO "Top of the table"
ELSE
   SET MESSAGE TO
ENDIF

Si se realizan estos cambios en las clases navNext y navPrior, también se aplicarán automáticamente a los botones apropiados de vcr y vcr2.

Agregar VCR a una clase de formulario

Una vez definido vcr como un control, el control puede agregarse a la definición de un contenedor. Por ejemplo, el código siguiente agregado a Navclass.prg define un formulario al que se han agregado botones de desplazamiento:

DEFINE CLASS NavForm AS Form
   ADD OBJECT oVCR AS vcr
ENDDEFINE

Ejecutar el formulario que contiene VCR

Una vez definida la subclase de formulario, podrá mostrarla fácilmente con los comandos apropiados.

Para mostrar el formulario

  1. Cargue la definición de clase:

    SET PROCEDURE TO navclass ADDITIVE
    
  2. Cree un objeto basado en la clase navform:

    frmTest = CREATEOBJECT("navform")
    
  3. Llame al método Show del formulario:

    frmTest.Show
    

Si no llama al método SetTable de oVCR (el objeto VCR de NavForm), cuando el usuario haga clic en los botones de desplazamiento el puntero de registro se moverá por la tabla del área de trabajo seleccionada actualmente. Puede llamar al método SetTable para especificar en qué tabla se va a desplazar.

frmTest.oVCR.SetTable("customer")

Nota   Cuando el usuario cierre el formulario, frmTest se establecerá en un valor NULL (.NULL.). Para liberar de la memoria la variable de objeto, utilice el comando RELEASE. Las variables de objeto creadas en los archivos de programa se liberan de la memoria cuando se completa el programa.

Vea también

Escribir definiciones de clases mediante programación | Directrices para el código de métodos y eventos | Definir un control Grid | Propiedad Caption | Propiedad Height | Método SetAll | Programación orientada a objetos