Está en la página 1de 26

Creacin de Proyectos en Visual FoxPro

Para poder crear un programa en visual foxpro o ejecutable es necesario definir un proyecto, el mismo estar compuesto de los formularios (Forms), cdigos (Prg), reportes (Report), clases (Class), base de datos (Databases) con sus tablas, tablas libres (Free tables) y otros componentes que forman el proyecto. Al modular un programa se lo separa en diferentes proyectos, compartiendo funciones, clases, reportes, etc; pero su vinculacin siempre debe ser un proyecto principal el que llamara a todos los dems. Veamos como se crean un proyecto para controlar asistencias de alumnos a cursos, guardando como datos los alumnos y un registro de asistencias a los cursos, para eso necesitamos adems tener cargados que cursos hay, que alumnos van a cada curso y los horarios de los mismo indicando que das semanales se dictan.

Primero comencemos por presentar el IDE (Entorno de desarrollo integrado) de visual foxpro: La pantalla de VFP (_Screen) donde podremos arrojar los resultados de los comandos ejecutados en la ventana de comandos y la vamos a poder utilizar desde los proyectos como pantalla principal.

Ventana de comandos, en este lugar se pueden ejecutar todos los comandos permitidos por VFP.

El men que se utiliza para opciones de edicin y configuracin del IDE.

Las opciones ms importantes a ser configuradas son: La carpeta de trabajo por defecto (Solapa File location). Como queremos que abran las tablas exclusivas o no (Solapa Data). Siempre al configurar tiene que apretar SET AS DEFAULT. O sino al salir y volver a ingresar los cambios no quedaran por defecto.

Entonces comencemos a crear el proyecto, para eso podemos primero definir la carpeta del proyecto y las subcarpetas as acomodamos de forma prolija y por tipo componentes, por ejemplo podra ser de la siguiente forma: Esto se encuentra dentro de la carpeta CursoFoxPro que la defin como la carpeta por defecto.

Ahora creamos el proyecto llamado como la misma carpeta, lo podemos hacer de dos formas, desde la ventana comandos escribiendo:
CREATE PROJECT Prj/CursoFoxpro

Siempre se indica la ruta donde lo queremos crear, como en este caso nuestro path ya es la carpeta por defecto, solamente escribimos en que carpeta contenida deseamos crearlo.

O sino desde una forma mas fcil es desde el men file, new elegimos proyecto y presionamos new file. No se asusten si lo crean y despus no esta, esto pasa si no le agregamos ningn componente, el VFP lo borra directamente o pregunta que queremos hacer.

Cuando tenemos el proyecto, nos muestra una pantalla con todos los componentes juntos o por categora en solapas, si creamos el componente desde esta pantalla queda directamente relacionado con el proyecto, pero si lo creamos desde la ventana de comandos, como veremos mas adelante, lo tenemos que integrar al proyecto utilizando la opcin de agregar.

Si vemos cada una de estas categoras son las solapas que vemos a continuacin.

Como en el programa vamos a necesitar guardar datos, vamos a crear la base de datos para despus poder crear las tablas (Los comandos estn descriptos en el

apuntewww.foxeando.com.ar/paginas/Comandos_y_estructuras_para_manejo_de_tablas.h tm) La base creada se llamara CursoFoxpro quedando con la siguiente estructura

En el proyecto podemos tener muchos forms, clases, prgs, pero solo uno de ellos puede ser el que inicia el programa, siempre conviene que sea un prgs, donde definimos rutas, seteos generales, configurar el screen y llamar al form o al men que ser el que maneje todo nuestro sistema. Comencemos por crear el prg inicio, lo llamaremos inicio.prg Primero hay que realizar los seteos generales, los principales son:

Especifica que no puede salir de un cuadro de texto escribiendo ms all del ltimo carcter del cuadro. Para salir del cuadro de texto, puede presionar ENTRAR, TAB o cualquiera de las teclas de direccin, para moverse de un cuadro de texto a otro control. SET CENTURY TO 19 ROLLOVER 80 Especifica un formato de ao con cuatro dgitos que ocupa 10 caracteres (incluidos los delimitadores de fecha).
SET CONFIRM ON Toh un nmero de 1 a 99 que especifica el siglo actual. Rollever n nmero de 0 a 99 que especifica el ao a partir del cual es el siglo actual. SET CENTURY ON Compatibilidad con el ao 200. SET CLASSLIB TO ... Define la librera de clases active y sin ningn

nombre,

libera todas las libreras. SET DATE TO FRENCH Define el formato de la fecha a da/mes/ao. SET DECIMALS TO 5 Define la cantidad de decimales a 5.

SET DELETED ON No ver los registros borrados lgicamente. SET ECHO OFF Desactiva la ventana de seguimiento, depuracin. SET ENGINEBEHAVIOR 70 Compatibilidad de comandos SQL con versiones

7.
SET ESCAPE OFF

Impide que al presionar la tecla Esc se cancele la

ejecucin.
ON Cuado compara cadenas de texto, estas deben ser iguales carcter a carcter para que las considere equivalentes. SET HELP OFF Desactiva la ayuda de fox. SET HEADING OFF Especifica que no se muestren los nombres de los campos en los clculos como calculate, max, etc. SET MEMOWIDTH TO 256 Determina el ancho del resultado que puede mostrar, por ejemplo de los campo memo. SET PATH TO Determina que directorios toma en cuenta vfp para bsqueda. SET PRINTER TO PRN Determina a que impresora se direcciona el resultado. SET PROCEDURE TO ... Indica archive de procedimientos. SET RESOURCE TO ... Especifica que los archivos de recurso sobre las modificaciones de vfp, se guarden en otro archive que no sea foxuser. SET SAFETY OFF Determina que no muestre ningn cuadro de dialogo antes de sobrescribir un archive. SET STATUS OFF Desactiva la barra de estados. SET TALK OFF Si vfp muestra o no los resultados de los comandos. SET STATUS BAR OFF Quita la barra de estado grafica. SET SYSMENU TO Desactiva la barra de men de vfp. SET EXCLUSIVE OFF Impide que las tablas se abran de forma exclusiva. SET EXACT

A continuacin llamaremos a un formulario llamado men, con el que manejaremos a todos los mdulos del sistema. DO FORM Forms/Menu A continuacin tenemos que ingresar el siguiente comando READ EVENTS Para que sirve este comando?, como ya sabemos un prg (cdigo secuencial) se ejecuta desde el principio paso a paso hasta el final y se cierra. Que paso con el formulario? Lo mostr y lo cerro tan rpido que ni nos dimos cuenta. El comando soluciona el problema al decirle que vfp quede escuchando eventos, dejndonos interactuar con el o los formulario y

cuando ya no queramos le diremos que limpie los eventos con el comando CLEAR EVENT (por ejemplo en un botn salir) descargando los objetos, de esta forma volver al cdigo original en la lnea del READ EVENTS terminando la aplicacin por lo comentado anteriormente.

En la prxima parte veremos que son los objetos, clases, eventos, etc., y seguiremos armando la aplicacin de asistencias.

Creacin de Proyectos en Visual FoxPro Parte 2


En el documento anterior vimos como se crea un proyecto, como se compone y un ejemplo de prg de inicio con varios seteos y una llamada a un formulario men, en este documentos veremos el prg nuevamente pero en lugar de llamar al form, generaremos un men de acceso a los distintos mdulos que iremos agregando de a poco. ****************Inicio.Prg****************
SET CONFIRM ON SET CENTURY TO 19 ROLLOVER 80 SET CENTURY ON SET DATE TO FRENCH SET DECIMALS TO 5 SET DELETED ON SET ECHO OFF SET ENGINEBEHAVIOR 70 SET ESCAPE OFF SET EXACT ON SET HELP OFF SET HEADING OFF SET MEMOWIDTH TO 256 SET PATH TO SET PRINTER TO PRN SET SAFETY OFF SET STATUS OFF SET TALK OFF SET STATUS BAR OFF SET SYSMENU TO SET EXCLUSIVE OFF SET PROCEDURE TO prg/funciones.prg (2) SET DEFAULT TO 'F:\LEO\CURSOFOXPRO' SET PATH TO 'F:\LEO\CURSOFOXPRO' _screen.Visible = .T. _screen.ForeColor = RGB(255,128,128) _screen.Picture = 'F:\LEO\CURSOFOXPRO\IMAGENES\FONDO.JPG' *Un fondo al screen _screen.WindowState = 2 *Que siempre se ejecute maximizado

DO GenMenu READ EVENTS

(1)

(1) Si nos acordamos en pseudocdigo cuando queramos ejecutar un procedimiento la sentencia se escriba hacer <nombre de procedimiento>, en vfp es parecido pero en ingles DO GenMenu si necesito pasarles parmetros van entre parntesis y separados por comas, Ej.: DO GenMenu(hola, VarCant). Si vemos arriba en la parte de seteos en el (2) vemos la definicin del prg a utilizar para guardar las funciones y procedimientos, que sern accesibles desde todos los mdulos del sistema.

Entonces tenemos dos prgs, uno llamado inicio.prg (el definido como default de arranque) y funciones.prg donde iremos guardando todos los procedimientos y funciones.

************Funciones.Prg************** PROCEDURE genmenu SET SYSMENU TO *Desactiva el men del vfp. DEFINE PAD sysuno OF _MSYSMENU PROMPT '\<Asistencias' KEY ALT+A *Define el primer men comenzando de la izquierda llamado sysuno y titulo *Asistencias. ON PAD sysuno OF _MSYSMENU ACTIVATE POPUP Asistencias *Define que pasa si se clickea en el men y dice que active un popup (como los del *botn derecho del Mouse) llamado asistencias. DEFINE POPUP Asistencias MARGIN RELATIVE FONT "MS Sans Serif, 12" *Crea el popup llamado asistencias diciendo que tome como margen el lugar donde esta *el mouse y con una determinada fuente. DEFINE BAR 1 OF Asistencias PROMPT "\<Registro de Asistencias" *Crea las opciones que tendr el popup asistencias, se llama 1 y titulo Registro *asistencias. ON SELECTION BAR 1 OF Asistencias DO form Forms/Asistencias *Define que pasa si se clickea en la opcin llamada 1, en este caso se ejecuta el form *Asistencias. DEFINE BAR 2 OF Asistencias PROMPT "Alumnos" *La segunda opcin. ON SELECTION BAR 2 OF Asistencias DO form forms/ActAlumnos *Lo que pasa si se elige la opcin 2. DEFINE PAD syssalir OF _MSYSMENU PROMPT '\<Salir' KEY ALT+S *Se define el segundo men llamado syssalir con el titulo Salir. ON SELECTION PAD syssalir OF _Msysmenu Do salir *Ac directamente dice que si se elige el men, llama al procedimiento salir (este se *encontrara en funciones .prg mas abajo). SET SYSMENU AUTOMATIC *Define que la barra de men siempre este accesible desde el programa. ENDPROC En muchas partes vimos que se utilice el \< antes de una letra, esto lo que hace es definir como atajo a la misma, le pone la marca del que vemos en los menes con el _ debajo de la tecla.

PROCEDURE Salir *Utilizamos la herramienta messagebox que nos permite emitir un mensaje, definir que *botones queremos que aparezcan y nos dice cual de ellos presionamos. *El 32 es los botones que aparecen y 4 es el icono, estos datos se los suma. *Con el if estamos validando que se haya presionado el botn si = 6. IF MESSAGEBOX("Desea Salir de la aplicacion", 32 + 4, "Pregunta") = 6 *En el inicio.prg escribimos la funciones read events y dijimos que el prg *quedaba frenado ah escuchando los eventos del sistema, con esto lo que le *decimos que no escuche mas ninguno, el prg sigue su ejecucin y al no tener *mas nada el programa se cierra. CLEAR EVENTS ENDIF ENDPROC

Hasta ac lo que pueden es ir armando las carpetas, el proyecto los dos prg copiando y pegando todo el cdigo para ver como funciona.

Antes de comenzar con la creacin de formularios, clases, objetos, etc veamos de una forma rpida que son. Una Clase esta formada por mtodos, propiedades y eventos. Tomando un ejemplo de clase como un auto las propiedadespueden ser el color, ancho, alto, cantidad de ruedas, cantidad de puertas, tipo de motor, color de tapizado y todas las propiedades que nos parezca, entonces por lo que vemos cada clase puede tener su conjunto de propiedades diferentes. Pensemos en un reloj, que propiedades puede tener, color, tamao, tipo de numeracin, digital o analgico, formato, si tiene segundero y muchas mas. Ahora veamos una clase conocida por nosotros como un botn (esos que apretamos para aceptar) que propiedades podemos tener alto, ancho, imagen, la leyenda, nombre, posicin en la pantalla, si lo queremos ver o que este oculto y otras tantas mas. Como vemos las propiedades sirven para configurar la clase. Por otro lado tenemos los eventos que lo podemos definir como las acciones que es capaz de generar la clase, veamos el auto puede arrancar, acelerar, frenar, doblar, etc. pero cuando se ejecuta una accin pasa algo o debera pasar algo, ese algo es el mtodo relacionado, por ejemplo mtodo arrancar hace que vaya nafta a los inyectores y que las bujas hagan chispa. En el botn una accin podra ser click con un mtodo asociado, en el cual indicaremos que debe hacer al presionarlo. Los objetos es la representacin real de la clase, por ejemplo la clase auto y la representacin real es mi auto.

Ahora que ya sabemos que son las clases y los objetos, nuestro prximo paso es crear un objeto basado en la clase form,llamado ActAlumnos y hacer que interactue con la
tabla alumnos, los pasos a seguir son los siguientes: 1) Ir a la solapa Docs, clickear sobre forms/formularios y presionar nuevo, al hacer esto nos muestra dos opciones asistente y nuevo formulario, elegimos la ltima opcin y nos aparece en pantalla un formulario vaco.

2) En la tabla alumnos hay 4 campos, para mostrar los valores, crearlos o

modificarlos necesitamos agregar 4 clases textbox (al agregarlas se transforman en objetos porque creamos una instancia), para indicar al usuario que dato vemos en cada uno utilizamos 4 etiquetas o clase label y por ultimo para movernos entre los registros, borrarlos, crearlos vamos a usar 8 botones o clase commandbutton. Para incorporar al formulario los objetos utilizamos la barra de herramientas llamada Controles de Formulario, en la captura siguiente la podemos ver:

Ac estn todas las clases nativas de vfp que podemos utilizar en nuestra aplicacin. Para agregarlas al formulario lo nico que debemos hacer es arrastrarla. 3) Al agregarlos quedan todos desordenados, hay una herramienta

importante que ayuda a la hora de hacer el diseo del formulario, esa se llama Barra de Herramienta de Diseo, sirve para acomodar un solo objeto o mas de uno como grupo. Es algo as:

Para seleccionar mas de un objeto lo podemos hacer con el mouse o sino presionando shift y clickeando sobre los mismos.

4) La propiedad ms importante a definir es Name, en ella indicaremos con

que nombre nos referimos al objeto, vfp pone por defecto el nombre de la clase ms el nmero de objeto agregado. Para ir a la ventana propiedades se presiona el botn derecho del mouse y se clickea propiedades. Que se ven de la siguiente forma:

En la lista aparecen los objetos para poder ir a las propiedades, eventos y mtodos de cada uno, las solapas las dividen entre distintas categoras relacionadas con su funcin y una que agrupa a todas.

5) Al agregar todos los objetos, acomodarlos e indicarle el nombre debe

quedar algo como esto:

Con la propiedad Caption podemos indicar las leyendas que queremos que se vean ( la del form, commandbutton y labels).

6) Ahora que ya tenemos todo nos falta definir los formatos de datos que

tendrn cada textbox, como interactan con la tabla y que debe hacer cada botn.
Antes de comenzar veamos en que orden se cargan los objetos en memoria y cuales eventos se accionan. Como vimos en el caso del formulario, a el le incorporamos una serie de objetos generando una relacin de padre/hijo, dado que hay objetos que tienen la caracterstica de poder contener uno o mas, a ellos se les dice padre y a los contenidos se les dice hijos. Entonces para poder tener los hijos necesitamos al padre, por lo tanto primero se carga el form y despus los dems objetos. Por otro lado los objetos tienen un evento init y el form adems tiene un load, el segundo se acciona apenas se carga el form antes de que se hayan cargado los otros objetos, luego el init de los objetos y por ultimo el init del form. Simplificando a) Load del Form, b) Init de los objetos y c) init del form. Entonces si desde el load del form queremos cambiar una propiedad de un objeto no vamos a poder hacerlo porque aun no esta creado, pero si desde el init. Como necesitamos que los objetos tengan acceso a los datos debemos abrir la tabla antes de que sean creados, para eso utilizamos la accion load del formulario agregando la lnea USE bd/alumnos ORDER id. En cada init de los objetos vamos a poner que valor por defecto debe tomar, ejemplo para fecha y texto: This.Value = {}, This.Value = "". Para vincular cada textbox con un campo de la tabla debemos utilizar la propiedad controlsource (origen de datos) completando con el nombre de la tabla y campo, ejemplo: alumnos.apellido, alumnos.nombre, etc. De esta forma los textbox arrojaran la informacin cargada en cada campo de la tabla. Para cerrar el formulario agregamos en el evento click del botn salir ThisForm.Release, eso quiere decir que me descargue de memoria el formulario y todos sus objetos, pero el men sigue estando activo. Veamos que hace cada botn:

Anterior
IF NOT BOF() &&BOF me dice si estoy en el comienzo del archive (begin of file) ** si es as me dara error si trato de seguir yendo para atrs. SKIP -1 &&Me mueve un registro hacia atrs, es lo mismo que Go Recno()1. Thisform.Refresh &&Refresco el formulario para que los objetos tomen los

** nuevos valores ENDIF

Primero
GO TOP &&Voy al primer registro Thisform.Refresh &&Siempre refresco los objetos.

Ultimo
GO BOTTOM Thisform.Refresh &&Voy al ultimo registro &&Refresco

Siguiente
IF NOT EOF() &&EOF funcin que valida si es el final del archivo **End of File. &&Si no le pongo valor toma por defecto +1, go recno() + 1

SKIP ENDIF *Para darse cuenta de porque esta puesto lo que sigue prueben sin ponerlo. IF EOF() GO BOTTOM ENDIF ThisForm.Refresh

Nuevo
SELECT Alumnos &&Selecciono la tabla CALCULATE MAX(Alumnos.id) TO UltId &&Calculo el id mas grande UltId = UltId + 1 &&Le sumo uno INSERT INTO Alumnos (Id) VALUES (UltId) &&Inserto el valor del id GO BOTTOM &&Voy al ultimo registro, el recin creado ThisForm.Refresh && Refresco los datos ThisForm.Nombre.SetFocus &&me posiciono en el nombre para comenzar la carga.

Borrar
SELECT Alumnos &&selecciono la tabla *El messagebox devuelve valores que son referidos a la tecla presionada, en este caso la *tecla yes = 6. IF MESSAGEBOX("Desea borrar este dato", 36, "Atencin") = 6 &valido si dijo si. DELETE &&borro el dato en el que estoy posicionado GO TOP &&como el dato ya no existe voy al primero Thisform.Refresh &&refresco ENDIF

Hojear
SELECT alumnos BROWSE NORMAL &&Selecciono la tabla &&Hago un brow

Salir
SELECT Alumnos USE ThisForm.Release &&Selecciono la tabla &&La cierro &&Descargo de memoria todos los objetos.

Creacin de Proyectos en Visual FoxPro Parte 3


Hasta el momento vimos como se crean los proyectos, como se genera un prg para guardar funciones y procedimientos, otro de arranque con los seteos principales y un formulario de ABM bsico. En este documento veremos como se definen las clases propias y como se las utiliza, como se agregan los objetos por cdigo y por ltimo como podemos utilizar un solo formulario ABM para todas las tablas. La imagen muestra el DER (diagrama de entidad-relacin) de la base de datos que usamos para el proyecto CursoFoxpro.

Los pasos a seguir van a ser los siguientes: 1) Creacin de clase para seleccin de sexos. 2) Creacin de clase para relacin de tablas. (ejemplo: en alumnos guardar en el campo id_loc el id de la localidad que seleccionamos). 3) Crear plantillas de carga. 4) Modificar el form ActAlumnos por el Actualiza genrico.

Clase Sexo: Las clases se almacenan dentro de libreras de clases, permitiendo agruparlas por funcionalidad. Ejemplo:

Hay dos libreras abm y herramientas, cada una de ellas tienen clases relacionada con la funcionalidad. Para crear una clase nueva presionamos new y nos aparece el siguiente formulario:

Entonces vamos a crear una clase llamada sexo, basada en combobox y la guardamos dentro de abm. Nos va a aparecer algo as:

El objeto combobox nos sirve para mostrar una lista de opciones posibles a seleccionar, por ejemplo masculino y femenino. Esta clase la podemos utilizar en cualquier lugar donde haya seleccin de sexo, eso es lo bueno de las clases propias, ahorramos cdigo y si mas tarde queremos agregar una nueva opcin no tenemos que rastrear todos los lados sino solo modificamos la clase. El combobox tiene mucha similitud con el listbox, la nica diferencia es que el listbox siempre aparece como lista y el combo aparece solo lo que seleccionamos. Por lo tanto las propiedades y mtodos que vamos a explicar sirven para cualquiera de las dos clases. Las propiedades que vamos a utilizar son:

ColumnCount = 2 **Define la cantidad de columnas a mostrar en la lista. ColumnWidths = 100, 50 **El ancho de cada columna para mostrar el valor. Style = 2 **Como se comporta visualmente. SelectOnEntry = .T. **Despliega automticamente la lista al tomar foco. Value = Nos da el valor del dato que seleccionamos, de la columna que seteamos en la propiedad siguiente. BoundColumn = 2 **Por defecto es 1, esto nos dice la propiedad value que valor de columna nos devuelve. Por ultimo en el mtodo init vamos a realizar la carga del combobox:
This.AddListItem("Masculino", 1, 1) This.AddListItem("M",1,2) This.AddListItem("Femenino", 2, 1) This.AddListItem("F", 2, 2)

El mtodo AddlistItem tiene como parmetros el texto a mostrar, la identificacin del elemento y la columna donde se mostrara. Si queremos agregar mas de una columna para un mismo elemento lo nico que tenemos que hacer es definir la misma identificacin para todas las columnas. La propiedad controlsource, tanto en este como en otros objetos, nos dice cual es el origen de datos para la propiedad value, en la mayora de los casos va a ser una campo de una tabla. No la definimos en la clase porque la podemos usar en mas de una tabla distinta. Clase Relacin: La finalidad de esta clase es poder definirle que datos necesitamos, de que tabla son y en que campo los queremos grabar. Ella sola abrir la tabla, configurara todas las propiedades necesarias para establecer el vnculo. Vamos a crear una clase nueva llamada relacin y la guardamos dentro de abm, basada en combobox, igual que la anterior, y definimos las mismas 4 propiedades. Otra propiedad a definir es RowSourceType = 2, en ella le indicamos que el tipo de origen de datos es una tabla. En los formularios y las clases podemos crear propiedades y mtodos adems de los que ya vienen por herencia, para hacer eso vamos al men form o class y clickeamos en New property o en New method. Los mtodos sirven para guardar procedimientos o funciones dentro de la clase y las propiedades para guardar ciertos valores a los que podrn acceder todos los objetos. Necesitamos crear dos propiedades: a) Campos Vamos a obtener la tabla y los campos que queremos mostrar. b) Destino Va a ser nuestro valor para el ControlSource.

En el mtodo init vamos a agregar el siguiente cdigo:


(Las funciones utilizadas a continuacin estn en el apunte: www.foxeando.com.ar/paginas/funciones_vfp.htm)

Los ejemplo de los valores que se cargan en las propiedades son:


*campos = "alumnocat.id, nombre" *destino = "alumnos.id_cat TabOri = "bd/" + LEFT(this.campos,AT(".",this.campos)-1) *La tabla que necesitamos abrir la vamos a obtener del string campos. SELECT 0 USE (tabOri) ORDER id *abrimos la tabla para que la propiedad siguiente encuentre el alias This.RowSource = This.campos This.ControlSource = This.Destino

De esta forma ya tenemos la clase genrica relacin, a la hora de usarla solo debemos cargar en las propiedades campos y destino los valores para que se configure sola al ejecutarse el cdigo.

En la prxima parte veremos los puntos que quedan.

Creacin de Proyectos en Visual FoxPro Parte 4


En la parte 3 nos quedaron por resolver los siguientes puntos 3) Crear plantillas de carga. 4) Modificar el form ActAlumnos por el Actualiza genrico. El objetivo de los dos puntos es poder crear un formulario genrico ABM que nos sirva para cualquier tabla y no tengamos uno por cada una. Plantillas de carga Por cada tabla crearemos un contenedor con el mismo nombre, guardado en una librera llamada plantillas y lo nico que vamos a hacer es agregar todos los objetos e indicarles el controlsource. A continuacin veremos dos capturas de ejemplo.

En la captura dos vemos que utilizamos las clases sexo y relacin.

Formulario genrico Para hacerlo genrico lo nico que le vamos a dejar es la botonera, crearemos una propiedad llamada tablaorigen y le cambiamos el nombre por Act. El cdigo del mtodo init del formulario quedara como el que veremos a continuacin: *Los dos parmetros vienen dados desde el procedimiento men, al hacer click y llamar *al formulario ah agregamos los parmetros para que el formulario sepa el caption del *formulario y que tabla tenemos que usar. Al saber que tabla tenemos que usar adems *sabemos que clase agregamos, ya que la llamamos de la misma forma. LPARAMETERS TablaOrigen, titulo *En la propiedad que agregamos guardamos la tabla que usamos. This.tablaorigen = ALLTRIM(TablaOrigen) *El caption es un parmetro que viene desde el men. This.Caption = ALLTRIM(titulo) *Armamos la cadena de tabla para luego poder abrirla. CadTabla = "bd/"+This.tablaorigen *Abrimos la tabla. SELECT 0 USE (CadTabla) CadObj = This.tablaorigen *La variable que vamos a utilizar para saber que clase tenemos que agregar. SET CLASSLIB TO clases/plantillas *Lo que hacemos ac definimos por defecto la librera de clases a plantillas que es *donde tenemos los contenedores con los objetos para cada tabla. This.AddObject("ActDatos", CadObj) *AddObject es un mtodo que nos permite agregar un objeto por cdigo (es lo mismo *que cuando lo agregamos desde diseo con el Mouse), le debemos indicar que clase queremos agregar y como se llamara el objeto en el form (en este caso el objeto se llama ActDatos y la clase es la variable CadObj que la cargamos mas arriba en el cdigo). SET CLASSLIB TO *Estos son tres seteos que le hacemos al objeto luego de agregarlos. This.Actdatos.Visible = .T. this.Actdatos.Top = 1 this.Actdatos.Left = 1 En los botones lo nico que debemos cambiar o agregar es la sentencia SELECT (ThisForm.TablaOrigen) *Lo debemos hacer as porque no sabemos nunca que tabla vamos a utilizar ya que viene dada por parmetro. En el men debemos agregar los parmetros de la tabla y el titulo, un ejemplo es el siguiente:

ON SELECTION BAR 3 OF Asistencias DO form forms/Actualiza with "alumnos",

"Actualizacion de alumnos"
*Con with y separados entre comas le pasamos los parmetros que debe recibir el *formulario.