Вы находитесь на странице: 1из 14

VISUAL FOX PRO 9.

0
CLASES VISUALES (VCX) Y ALGO MAS
VERSION 0.1
ULTIMA MODIFICACION: 24/06/2013
POR: ANTONIO MEZA PEREZ

El tema principal de este documento es poder manejar clases basadas en Formularios compiladas en un ejecutable y
poder hacer uso de estas dentro de otro ejecutable, sin que este segundo tenga compiladas las clases.
Para llegar a ello primero voy a explicar de forma bsica como uso las clases y funciones para que les sirva de referencia
a algunos y posteriormente puedan entender las clases de formularios dentro de otro ejecutable, as como sus ventajas
y desventajas. De igual forma me ayuden explicando si estoy utilizando de forma incorrecta algo.

Ventajas que se me ocurren de momento, pueden existir ms que desconozco:
Un Ejecutable conteniendo las clase base de los proyectos
Uno o ms ejecutables si lo desean conteniendo subclases de la clase base
Si existe un error en la clase base, este se corrige, se compila y solo se remplaza el ejecutable sin necesidad de
recompilar los dems mdulos o ejecutables.
Ejecutables con menor tamao, porque uno contiene los controles comunes que se usan o que se hicieron
generales para la clase base.
Mejor control del cdigo definitivamente
Control de versiones ms fcilmente a partir de clases base y uso de subclases.
Etc.

Desventajas
Desconocimiento del uso de clases en vfp

NOTA: Es importante que si alguien de la comunidad detecta el ms mnimo error en definiciones, uso, aplicacin u
otra informacin, me ayude a corregir este documento, la idea es que sirva de base para otros compaeros y a su vez
aprender de este.

Observaciones: Con las contribuciones ya realizadas de otros compaero sobre el tema de Clases, no voy a
profundizar mucho, solo un repaso inicial y luego ms avanzado, si alguien desea profundizar ms en alguna parte del
tema con gusto lo apoyo, ms bien s que con gusto se le apoyara en la comunidad.

Como comente ser una introduccin breve, para aquellos que se inician y ya despus entrare de lleno en el tema
principal de las clases a partir de un formulario, pero por lo extenso del tema ir modificando este mismo
documentos con las recomendaciones y correcciones de los que puedan ayudar a elaborarlo.



Voy a documentar un proyecto muy simple de inicio a fin donde se muestra la ventaja del uso de las clases visuales (VCX)
compiladas dentro de un ejecutable en especial las clases basadas en Formularios y utilizar estas sin compilar dentro de
otro ejecutable haciendo referencia al primero, luego ir generando ms subproyectos para que puedan ir viendo los
beneficios que encontr, adems de pequeos trucos que eh usado en mis desarrollos y que a muchos les pueden
servidor, algunos de los trucos aprendidos de otros compaeros, en www.portalfox.com y el foro de la comunidad de
visual fox pro: as que comenzamos.
Crearemos un proyecto nuevo llamado ampvcx.pjx ustedes pueden usar el nombre que deseen, normalmente nombro a
mis programas con mis iniciales, pasos:
1.- Abrimos VFP 9.0, seleccionamos el men FILE y la opcin NEW, nos muestra la siguiente ventana, en la cual por
default aparece seleccionado PROJECT y solo damos click en el botn NEW FILE.


2.- Nos pide indiquemos el nombre del proyecto nuevo y la ubicacin donde se va a guardar este.

3.- En mi caso cree una nueva carpeta llamada ProyectoVcx, y dentro de ella voy a guardar el nuevo proyecto, para ello
cambiamos el nombre por default que es proj1.pjx por ampvcx.pjx (No es necesario especificar la extensin al cambiar el
nombre) y presionamos el botn Guardar.

4.- Si todo va bien nos debe mostrar la siguiente pantalla ya con el proyecto limpio creado.

5.- Ahora vamos a crear primero nuestra clase base principal, para ellos seleccionamos la pestaa CLASES, oprimimos el
botn NEW, el cual nos muestra una ventana donde vamos a especificar 3 datos importantes:

1. (CLASS NAME) Nombre de la primera clase objeto base (aqu vamos a tener infinidad de clases de objetos) al
cual iniciamos con ENTORNO. Mas a bajo explico porque Entorno, puede ser cualquiera para crear el archivo
.vcx.
2. (BASED ON) Debemos indicar a partir de que objeto se va a basar nuestra nueva clase, puede ser de los que VFP
trae por defecto o uno contenido en otra clase nuestra previamente ya hecha, sin embargo estamos creando las
clases base por lo que vamos a usar solo clases a partir de las que trae VFP por defecto. Para ellos seleccionamos
del listado CUSTOM.
3. (STORE IN) Debemos especificar la ruta y nombre del archivo vcx, que en mi caso cree una nueva carpeta dentro
de ProyectoVcx con el nombre de CLASES, el nombre del archivo que contendr una o varias clases de objetos, el
cual puede tener el nombre que gusten, usare el mismo del proyecto solo se diferencian por la extensin del
archivo, que dara as: ampvcx.vcx,
6.- Una vez especificados los datos de la ventana presionamos el botn OK, y nos mostrara una nueva ventana donde ya
est nuestra nueva clase objeto CUSTOM al cual ya le podemos modificar a nuestro gusto agregando cdigo.

7.- Para que sirva de ejemplo voy a crear un Mtodo dentro de la clase CUSTOM llamada ahora ENTORNO para generar
impresin de archivos PDF, como indique en un principio la idea es ir poniendo pequeos trucos que les puedan servir a
los dems, cabe mencionar que este ejemplo quedara mejor dentro de un ejecutable de funciones que ms adelante
comentare.

8.- Teniendo la ventana activa de la clase ENTORNO, damos click en el men CLASS y seleccionamos NEW METOTHOD..,
es importante aclarar que si no est activa la ventana que contiene la clase Entorno, no mostrara la opcin CLASS el
men principal de VFP.



9.- Presionamos el botn ADD para que se agregue el nuevo mtodo y limpiara los datos que habamos escrito para
permitirnos crear un mtodo ms, vamos a presionar ESC o el botn CLOSE para cerrar la ventana y vamos a darle
DOBLE CLICK sobre en la clase ENTORNO (Como se muestra en la siguiente imagen donde est pintado en color rojo un
circulo) para que nos muestre sus mtodos o procedimientos para agregarle cdigo al recin creado PdfBullzip.

10.- Nos abrir otra ventana donde buscaremos en el listado de PROCEDURE: pdfbullzip, y copiamos el siguiente cdigo
LPARAMETERS cFrx,cArchivo
* Donde
* cFrx = La ruta del formato de impresin .FRX
* cArchivo = La ruta y nombre destino donde se guarda el archivo PDF
* Debe estar instalado el programa bulzzip
* Descargar de www.bullzip.com
loPdf = CREATEOBJECT('Bullzip.PDFPrinterSettings')
IF TYPE('loPdf')='O'
loPdf.SetValue('output', cArchivo)
loPdf.SetValue('DisableOptionDialog', 'no')
loPdf.SetValue('ConfirmOverwrite', 'no')
*loPdf.SetValue("WatermarkColor","#FF9900")
loPdf.SetValue('Showsettings', 'never')
loPdf.SetValue('ShowSaveAS', 'nofile')
loPdf.SetValue('ShowPdf', 'no')
loPdf.WriteSettings(.t.)
SET CONSOLE OFF
SET PRINTER TO NAME ("Bullzip PDF Printer")
REPORT FORM &cFrx TO PRINTER
SET PRINT OFF
SET PRINTER TO DEFAULT
SET CONSOLE ON
* WAIT windows "PDF GENERADO EN: " + cArchivo
ELSE
* WAIT windows "ERROR DE OBJETO PDF"
ENDIF

11.- Nos debe aparecer algo asi en la ventana de vfp, presionamos CTRL+S para guardar o damos click en la X de la
ventana entorno.pdfbullzip para que nos indique que si deseamos guardar los cambios y le decimos que SI.



12.- Segn como hayamos guardado, Debemos cerrar la ventana entorno.pdfbullzip y la ventana de la clase ampvcx.vcx
(entorno) porque vamos agregar el PRG principal del proyecto para posteriormente compilar la clase.

13.- Dentro de la ventana del Proyecto seleccionamos la pantalla CODE, luego presionamos el botn NEW y nos
mostrara una ventana limpia con ttulo PROGRAM1, en el cual copiamos el siguiente cdigo.

* Librera de Clases Base
* Versin 0.1
* ltima Revisin: 24/06/2013
* Autor: Por todos!
* * * * * * * * * * * * * * *

SET CLASSLIB TO clases\ampvcx.vcx ADDITIVE

PUBLIC oAmp
oAmp = CREATEOBJECT("ENTORNO")

* FIN

14.- Ver la siguiente imagen

15.- En pantalla debemos ver algo como la imagen anterior, no olvidemos guardar con CTRL+ S o cerrando la ventana de
PROGRAM1 y nos enviara el mensaje de confirmacin, le presionamos que SI y le vamos a poner el nombre ampvcx.prg,
recuerden que puede ser cualquier nombre, pero de esta forma identifico que me refiero al prg principal de la clase base
ampvcx.vcx.
16.- En mi caso creo nuevamente una carpeta llamada PRG contenida dentro de ProyectoVCX, esto solo para organizar el
cdigo, por lo tanto el nuevo archivo ampvcx.prg quedara contenido dentro de PRG\ampvcx.prg. Ustedes pueden
guardarlos como les sea ms fcil.


17.- Ahora vamos a marcar como SET MAIN al recin creado archivo PRG es decir como principal del proyecto, para que
sea el primero que se ejecute al correr el programa compilado. No puedo capturar la ventana mostrando las opciones,
por lo que comento como hacerlo.

18.- Estando en la pestaa CODE del proyecto desplegamos la lista de PROGRAMS dando click en el smbolo de MAS del
rbol de opciones, y nos mostrara ampvcx, posicionamos el cursor encima de ampvcx que es nuestro archivo prg, y
presionamos click derecho del mouse, en el men de opciones solo seleccionamos SET MAIN dando click izquierdo, con
esto se pone en letras negritas el nombre ampvcx por lo que ya quedo listo.



19.- Ahora vamos a compilar el proyecto para tener nuestra librera dentro del ejecutable y luego utilizarla desde otro
ejecutable. Para ello no necesitamos estar en alguna pestaa en especial, puede ser cualquiera del proyecto, el botn
BUILD est disponible siempre, por lo que solo tenemos que presionarlo.

20.- Nos muestra varias opciones, seleccionamos de Build Action la tercera que es Win32 executable / COM server (exe)
y de OPTIONS la segunda que dice Display Errors, le comento que son las que siempre eh usado, si alguien recomienda
marcas ms seria bueno indiquen el porqu de usarlas.

21.- Presionamos el botn OK, y nos muestra una ventana para que indiquemos donde deseamos guardar el ejecutable y
con qu nombre, por default utiliza el nombre del prg principal, as que en mi caso lo dejo como esta y que se guarde en
raz de la carpeta del PROYECTOVCX.

23.- Si no hay ningn error se ha generado nuestro nuevo archivo ejecutable de clases base, que por ahora solo tiene
una funcin. Ahora pueden probarlo desde cualquier ejecutable de ustedes copindolo en la ruta que gusten y llamarlo
as:
Do ampvcx.exe
Si lo copian dentro de una carpeta llamada libreras
Do libreras\ampvcx.exe
24.- Antes de que me regaen por qu uso variables pblicas, le comento que solo uso una variable pblica declarada en
mis sistemas, la cual apunta siempre a mi clase base ENTORNO en la cual configuro infinidad de cosas que comnmente
uso en todos mis desarrollos, de esta forma solo manejo una librera clase base para todos mis sistema adecuando a los
requerimientos de mis clientes, ya sea modificando o agregando funciones, aunque es raro que toque este cdigo,
normalmente tengo otro ejecutable con funciones que ms tarde comentare.
25.- Detallando el cdigo dentro de ampvcx.prg
La siguiente lnea es para abrir la librera ampvcx.vcx que creamos al principio, la opcin ADDITIVE es para que se
adicione a las ya existentes.
SET CLASSLIB TO clases\ampvcx.vcx ADDITIVE

La siguiente lnea es para crear una variable pblica que podr verse desde cualquier formulario, funcin,
cdigo, que este dentro de cualquier ejecutable que previamente haya llamado a ampvcx.exe,
PUBLIC oAmp

La ltima lnea de cdigo es para crear un objeto llamado oAmp de la clase base ampvcx.vcx que agregamos
lneas atrs con el nombre ENTORNO.

oAmp = CREATEOBJECT("ENTORNO")

NOTA: Las dos ltimas lnea de cdigo la podemos eliminar y crearlas posterior a ejecutar ampvcx.exe, es decir
estn de ms para algunos casos y se evitara usar la variable publica oAmp. Pero mi intencin es que sirva de
referencia de la infinidad de cosas que podemos hacer y muchos nos saben, ya algunos comentara cual es la
forma correcta.
26.- Dentro de los proyectos de ustedes pueden agregar el siguiente cdigo para enviar a imprimir un PDF una vez claro,
llamando a ampvcx.exe, solo una vez desde cualquier parte de sus desarrollo de preferencia en su prg inicial o alguna
funcin nueva que agreguen.
Do ampvcx.exe
oAmp.PdfBullzip("MiArchivo.pdf","miformato.frx")

Si queremos usar variables que es lo ms recomendable seria as

oAmp.PdfBullzip(cArchivoPdf,cArchivoFrx)

27.- De lo que comentaba eliminado las lneas de cdigo Public oAmp, y quitando el createobject haramos algo as
Do ampvcx.exe
LOCAL lprintPDf
lprintPDf = CREATEOBJECT("ENTORNO")
lprintPDf.PdfBullzip("MiArchivo.pdf","miformato.frx")

28.- Como sabemos el cdigo es nuestro y conocemos los nombres de las clases contenidas en ampvcx, por lo tanto del
primer ejemplo me ahorro ms cdigo al ya estar declarado el objeto oAmp y poder utilizarlo dentro de todo mi sistema
sin tener que estar declarndolo a cada rato.
29.- Ya vimos cmo se crea un ejecutable a partir de un proyecto nuevo que nos servir para utilizarlo desde otros
ejecutables o programas desarrollados en VFP.
30.- Espero Comentarios de la Comunidad al respecto para corregir o ampliar algn punto.

31.- Ahora vamos hacer otro proyecto donde usaremos Funciones en vez de usar mtodos dentro de clases, las ventajas
en cuanto a cdigo podran ser las mismas, pero en cuanto a prctico es mejor en funciones que en mtodos, vamos al
ejemplo.

32.- Creamos un nuevo proyecto llamado ampFunciones.pjx como vimos en el punto No. 1 de este documento,
agregamos en la pestaa CODE un nuevo Programa PRG llamada FuncionesGenerales.prg con el siguiente cdigo y lo
guardamos dentro de la carpeta PRG.

FUNCTION PdfBullzip
LPARAMETERS cFrx,cArchivo
* Donde
* cFrx = La ruta del formato de impresion .FRX
* cArchivo = La ruta y nombre destino donde se guarda el archivo PDF
* Debe estar instalado el programa bulzzip
* Descargar de www.bullzip.com
loPdf = CREATEOBJECT('Bullzip.PDFPrinterSettings')
IF TYPE('loPdf')='O'
loPdf.SetValue('output', cArchivo)
loPdf.SetValue('DisableOptionDialog', 'no')
loPdf.SetValue('ConfirmOverwrite', 'no')
*loPdf.SetValue("WatermarkColor","#FF9900")
loPdf.SetValue('Showsettings', 'never')
loPdf.SetValue('ShowSaveAS', 'nofile')
loPdf.SetValue('ShowPdf', 'no')
loPdf.WriteSettings(.t.)
SET CONSOLE OFF
SET PRINTER TO NAME ("Bullzip PDF Printer")
REPORT FORM &cFrx TO PRINTER
SET PRINT OFF
SET PRINTER TO DEFAULT
SET CONSOLE ON
* WAIT windows "PDF GENERADO EN: " + cArchivo
ELSE
* WAIT windows "ERROR DE OBJETO PDF"
ENDIF
ENDFUNC

33.- Ahora vamos a crear otro Programa PRG con el nombre ampFunciones.prg al cual debemos marcar como SET MAIN
es decir principal despus de guardado y que contenga el siguiente cdigo y lo guardamos dentro de la carpeta PRG

* Librera de Funciones Generales
* Versin 0.1
* Ultima Revisin: 24/06/2013
* Autor: Por todos!!
* * * * * * * * * * * * * * *

SET PROCEDURE TO prg\FuncionesGenerales.prg ADDITIVE

* FIN

34.- Realizados los pasos anteriores compilamos el nuevo proyecto para que nos genere el ejecutable ampfunciones.exe
35.- Al igual que ampvcx.exe el uso de ampfunciones.exe es el mismo, para ejecutarlo desde otro programa lo llamamos
simplemente as:
DO ampfunciones.exe
36.- Como sabemos solo contiene una funcin, ya que esto solo es un ejemplo pero puede contener todas las que
queramos, y la usaremos simplemente llamndola desde cualquier parte del programa, mtodo, funcin, etc. de la
siguiente forma.
PdfBullzip("MiArchivo.pdf","miformato.frx")

De igual forma con variables quedara as

PdfBullzip(cArchivoPdf,cFormatoFrx)

37.- Como pueden observar es ms sencillo llamar directamente la funcin por su nombre que un objeto creado que
contenga mtodos, el cdigo es el mismo pero la forma de llamarlo es diferente, adems que es ms fcil y rpido
corregir cdigo dentro de un prg que entrar a buscar la clase, luego buscar en que objeto est contenida y buscar el
nombre del mtodo y modificarla, sin embargo esto son experiencias que s que muchos no saben y me han servido de
mucha ayuda para codificar mejor mis programas o simplificar. Si hay un error solo se corrige la funcin, se compila y se
reemplaza el ejecutable y no hay que recompilar todo el proyecto que hace uso de esta funcin o en su defecto todos
los proyectos que hacen uso de la funcin.
38.- Ahora veremos una versin mejorada de nuestra librera ampvcx para que muestre un mensaje si alguien curioso la
ejecuta desde Windows, actualmente solo abre una ventana y se cierra, adems otra persona la copia y quiere hacer uso
de ella desde vfp, no quiere decir que es seguridad simplemente cosas que eh realizado y funcionan sin problema y les
pueden servir como ideas.
39.- Cierren todo y vamos a crear un nuevo proyecto, deberamos usar el mismo pero como voy a enviarles el cdigo
fuente y si lo van hacer paso a paso pues es mejor ir por partes, este nuevo proyecto lo llamaremos ampvcx1.pjx, al cual
le vamos agregar la clase ya creada ampvcx.vcx de la siguiente forma, nos vamos a la pestaa CLASS del proyecto nuevo
ampvcx1, luego presionamos el botn ADD y nos abrir una ventana para permitirnos buscar la clase que vamos a
agregar, dentro de la carpeta CLASES est contenida, as que la agregamos como se muestra en la imagen siguiente.


40.- Una vez agregada la clase, vamos a crear un nuevo Programa PRG, para ello nos vamos a la pestaa CODE del
proyecto, damos click en el botn NEW y en la ventana PROGRAM1 escribimos el siguiente cdigo:
* Libreria de Clases Base
* Version 0.1a
* Ultima Revision: 24/06/2013
* Autor: Por todos!!
* * * * * * * * * * * * * * *

LPARAMETERS ampModo

_screen.Visible = .f.
IF ampModo
SET CLASSLIB TO clases\ampvcx.vcx ADDITIVE
PUBLIC oAmp
oAmp = CREATEOBJECT("ENTORNO")
ELSE
MESSAGEBOX("Librerias Base" + CHR(13) + CHR(13) +;
"Versin: " + "2013" + CHR(13) + ;
"Revisin: " + "24.06.2013" + CHR(13) + ;
"Estado " + "Beta 2" + CHR(13) + ;
CHR(13) + ;
"Mas Informacin visite: " + "www.portalfox.com" + CHR(13) ;
,(0+64),"FrameWork VFP")
ENDIF
* FIN
41.- Guardamos con el nombre de ampvcx1.prg dentro de la carpeta PRG, luego no se les olvide marcarlo como SET
MAIN, es decir como principal y compilamos el proyecto, luego desde Windows buscamos la carpeta donde est el
programa ampvcx1.exe y lo ejecutamos, nos mostrara un mensaje como el siguiente:



42.- Para ejecutarlo desde nuestros programas debemos usarlo as
DO ampvcx1.exe WITH .t.
43.- En este ejemplo realizamos una mejora que requiere modificar el cdigo donde hacemos la llanada a Do
ampvcx.exe dentro de nuestros dems proyectos por lo que es necesario recompilar, sin embargo si no fuera una
mejora si no correccin posiblemente no sea necesario y es lo que realmente hace practico usar las cosas separadas
hasta donde sea permitido por el lenguaje.
44.- Al proyecto de ampfunciones.exe le puede agregar este mismo cdigo dentro del prg principal ampfunciones.prg
para que tenga esta misma utilidad de mostrar el mensaje.
45.- Termino con esta primera parte para ver si lo que comente es correcto si no para modificarlo.