Sunteți pe pagina 1din 41

CLASES EN VISUAL FOXPRO 9 SP2

SEGUNDA PARTE: CREANDO CONTROLES

Walter R. Ojeda Valiente

Abril de 2017

Asuncin Paraguay
Walter R. Ojeda Valiente

INDICE

Introduccin -------------------------- 2
Repaso de clases ---------------------- 3
Creando controles --------------------- 5
Control MiLabel1 ---------------------- 6
Control MiLabel2 ---------------------- 11
Control MiLabel3 ---------------------- 13
Control MiText1 ----------------------- 15
Control MiText2 ----------------------- 17
Control MiText3 ----------------------- 24
Control MiCombo1 ---------------------- 33
Control MiGrid1 ----------------------- 37
Conclusin ---------------------------- 39

1
Walter R. Ojeda Valiente

INTRODUCCIN
Ya habamos visto en el primer documento que compone esta serie: CLASES EN
VISUAL FOXPRO 9 como crear y usar clases en Visual FoxPro 9, en este nuevo documento
nos enfocaremos a la creacin de controles, pero antes de ello, haremos un repaso de
conceptos para tenerlos bien claros antes de iniciar la tarea.

Todo lo aqu escrito ha sido comprobado y verificado con Visual FoxPro 9 SP 2, la


mayora o quizs todo debera funcionar tambin con versiones anteriores, pero eso no lo
he comprobado, as que si algo no te funciona, verifica cual versin ests usando.

Espero que las siguientes pginas te sean tiles, con ese propsito fueron escritas,
si tienes algunas dudas o comentarios, puedes contactarte conmigo a travs del e-mail:

wrov@hotmail.com

2
Walter R. Ojeda Valiente

REPASO DE CLASES
Qu es una clase?
Es una porcin de cdigo fuente que se utiliza como un modelo del cual se
derivarn objetos que tendrn todas y cada una de las caractersticas de la clase.

De qu se compone una clase?


Se compone de propiedades y de mtodos. Una propiedad es similar a una
variable, o sea que pueden guardarse valores en ella. Un mtodo es similar a una rutina o
a una funcin, o sea que pueden ejecutarse varias lneas de cdigo.

A qu se llama definir una clase?


A determinar cuales sern las propiedades y los mtodos que tendr esa clase y a
escribir el cdigo fuente de sus mtodos.

Qu es un objeto?
Una clase es un concepto abstracto, es la determinacin de lo que se quiere hacer
con ella, para qu servir, cual ser su utilidad. Pero mientras no existan objetos de esa
clase de nada sirve, porque una clase sin objetos es como tener el plano de una casa pero
no la casa: no puedes vivir en el plano de una casa, debes construir la casa para vivir ah.

A qu se llama instanciar un objeto?


A crear un objeto que tenga todas las caractersticas de una clase. En el ejemplo
anterior, sera construir la casa. Solamente despus de instanciar un objeto todas las
caractersticas y funcionalidades de esa clase estarn a tu disposicin.

Qu es una clase contenedora?


Una clase que puede contener a objetos de otras clases dentro suyo. Un ejemplo
de clase contenedora es un formulario. Dentro de un formulario puedes tener objetos de
la clase Label, objetos de la clase TextBox, objetos de la clase ComboBox, objetos de la
clase Grid, etc.

3
Walter R. Ojeda Valiente

Qu es una clase de control?


Una clase visual (o sea que puede verse en un formulario) y que no puede
contener a objetos de otras clases dentro suyo. Ejemplos de clases de control son: Label,
TextBox, ComboBox, List, Edit, Grid, etc.

Cundo una clase es visible?


Cuando los objetos instanciados de esa clase pueden verse en el monitor de la
computadora, tambin se la llama clase visual. Ejemplos: form, label, textbox, combobox,
grid, etc.

Cundo una clase no es visible?


Cuando no hay forma de ver a los objetos de esa clase en el monitor de la
computadora. Ejemplos: custom, timer.

Cundo es una clase del usuario?


Cuando est basada en custom. Custom es una clase especial, en ella podemos
definir clases propias y que no estn basadas en otras clases.

Cundo no es una clase del usuario?


Cuando est basada en cualquiera de las clases predeterminadas, o sea las clases
que ya vienen con el Visual FoxPro. Ejemplos: form, timer, label, textbox, combobox, grid,
etc.

Qu significa subclasar una clase?


Crear una nueva clase, basada en una clase ya existente. La nueva clase tendr
todas las caractersticas de la clase ya existente y adems algunas caractersticas nuevas.
De esta manera, ser ms poderosa.

Qu es una biblioteca de clases?


Un archivo que tiene la extensin .VCX y que contiene a muchas definiciones de
clases visuales dentro suyo.

4
Walter R. Ojeda Valiente

CREANDO CONTROLES
Como ya hemos visto, un control es una instancia de una clase que es visible
dentro de un formulario y que no puede contener a otros objetos dentro suyo.

Esa es la defi i i , si e argo

Sin embargo, lo aconsejable y lo recomendable es no usar a los controles que trae


nativamente el Visual FoxPro sino crear controles propios.

Por qu es recomendable usar controles propios?


Porque con ellos podremos mejorar muchsimo el aspecto visual y tambin la
programacin de nuestras aplicaciones. Podremos hacer programas mejores y ms rpido
y por lo tanto ganar dinero ms fcilmente.

Cmo se crean los controles propios?


Se crea una biblioteca de clases y dentro de esa biblioteca de clases se colocan
todas las clases que reemplazarn a los controles nativos del Visual FoxPro. A partir de
ese momento cada vez que necesitamos usar un control usamos un control de nuestra
propia biblioteca de clases, ya nunca ms usamos un control nativo del Visual FoxPro.

Normalmente cada uno de nuestros controles es una subclase de uno de los


controles nativos del Visual FoxPro.

5
Walter R. Ojeda Valiente

Control MiLabel1
CREATE CLASS MILABEL1 OF CONTROLES AS LABEL

Qu hicimos aqu?
1. Creamos una clase llamada MiLabel1 basada en la clase Label, o sea que
es una subclase de la clase Label. Podramos pensar en ella como una
hija de Label.
2. Colocamos a la clase MiLabel1 en una biblioteca de clases llamada
CONTROLES. Como no exista la biblioteca de clases CONTROLES.VCX la
hemos creado automticamente.

La clase MiLabel1 posee todas las propiedades y todos los mtodos de la


clase Label. Y aqu viene lo bueno: podemos cambiar esas propiedades y
esos mtodos y todos los objetos que instanciemos tendrn esos cambios.

Captura 1. La clase MiLabel1

Captura 2. Las propiedades BackStyle y ForeColor

6
Walter R. Ojeda Valiente

En la Captura 1. vemos el efecto de crear la clase MiLabel1. En la barra de


ttulos vemos el nombre de la biblioteca de clases (CONTROLES.VCX en este
ejemplo) y el nombre de la clase (MiLabel1 en este ejemplo).

En la Captura 2. hemos cambiado el valor que tena la propiedad BackStyle


para que la etiqueta sea transparente y la propiedad ForeColor a 0, 0, 128.
Por lo tanto a partir de ahora todos los controles MiLabel1 que insertemos
en nuestros formularios sern transparentes y tendrn el color azul oscuro.

Captura 3. Los controles estndar del Visual FoxPro

En la Captura 3. hemos creado un nuevo formulario, llamado Prueba1.scx y


cuando queremos insertar un control vemos los controles estndar del
Visual FoxPro. Pero no queremos insertar una etiqueta Label sino que
queremos insertar una etiqueta MiLabel.

Cmo lo conseguimos?

7
Walter R. Ojeda Valiente

Captura 4. Agregando una biblioteca de clases

Haciendo clic sobre el icono View Classes y luego haciendo clic en la opcin
Add del men contextual que aparece, tal como podemos ver en la
Captura 4.

Captura 5.Eligiendo la biblioteca de clases que nos interesa

8
Walter R. Ojeda Valiente

En la Captura 5. vemos todas las bibliotecas de clases que tenemos en esa


carpeta. En este caso hay solamente una biblioteca de clases, en otros
casos podramos tener varias.

Al elegir una biblioteca de clases, todas las clases que contiene estarn a
nuestra disposicin para que las usemos.

Como recin estamos empezando, tenemos una sola clase. Ya iremos


agregando otras ms.

Captura 6. El control MiLabel1

Nuestra biblioteca de clases CONTROLES.VCX solamente tiene una clase


ahora, tal y como podemos ver en la Captura 6. Si nos fijamos veremos que
parece ser un control Label, pero realmente no es un control Label sino que
es un control MiLabel1. Para comprobarlo, insertaremos ese control en el
formulario.

9
Walter R. Ojeda Valiente

Captura 7. Insertando un control MiLabel1 en el formulario

Tal y como podemos ver en la Captura 7. al insertar un control MiLabel1


obtenemos una etiqueta transparente y de color azul oscuro.

As como hemos definido que las etiquetas MiLabel1 sean transparentes y


de color azul oscuro, as tambin podramos haber cambiado cualquiera de
las otras propiedades del control Label, para que se adecue a nuestros
gustos y necesidades.

10
Walter R. Ojeda Valiente

Control MiLabel2
CREATE CLASS MILABEL2 OF CONTROLES AS LABEL

Qu hicimos aqu?
1. Creamos una clase llamada MiLabel2 basada en la clase Label, o sea que
es una subclase de la clase Label. Podramos pensar en ella como una
hija de Label.
2. Colocamos a la clase MiLabel2 en una biblioteca de clases llamada
CONTROLES. Como ya exista la biblioteca de clases CONTROLES.VCX
entonces nuestra clase se insert all.

Como ya sabemos, la clase MiLabel2 posee todas las propiedades y todos


los mtodos de la clase Label.

Captura 8. Las propiedades cambiadas del control MiLabel2

11
Walter R. Ojeda Valiente

En la Captura 8. podemos ver que las propiedades originales del control


Label han sido cambiadas. Por qu? Porque queremos tener una etiqueta
que usaremos para delimitar grupos o subgrupos dentro de nuestros
formularios.

Captura 9. El control MiLabel2

Al insertar el control MiLabel2 en un formulario, veramos algo como:

Captura 10. El control MiLabel2 dentro de un formulario

12
Walter R. Ojeda Valiente

Control MiLabel3
CREATE CLASS MILABEL3 OF CONTROLES AS LABEL

Qu hicimos aqu?
1. Creamos una clase llamada MiLabel3 basada en la clase Label, o sea que
es una subclase de la clase Label. Podramos pensar en ella como una
hija de Label.
2. Colocamos a la clase MiLabel3 en una biblioteca de clases llamada
CONTROLES. Como ya exista la biblioteca de clases CONTROLES.VCX
entonces nuestra clase se insert all.

Como ya sabemos, la clase MiLabel3 posee todas las propiedades y todos


los mtodos de la clase Label.

Captura 11. Las propiedades del control MiLabel3

13
Walter R. Ojeda Valiente

En la Captura 11. podemos ver cuales fueron las propiedades que se


cambiaron. Para qu? Porque queremos tener un asterisco de color rojo
que colocaremos a la derecha de los campos que son obligatorios. Algo
como esto:

Captura 12. El control MiLabel3 en un formulario

Entonces, cada vez que necesitemos colocar un asterisco rojo, simplemente


insertamos un control MiLabel3 y listo, ya est.

14
Walter R. Ojeda Valiente

Control MiText1
CREATE CLASS MITEXT1 OF CONTROLES AS TEXTBOX

Qu hicimos aqu?
1. Creamos una clase llamada MiText1 basada en la clase TextBox, o sea
que es una subclase de la clase TextBox. Podramos pensar en ella como
una hija de TextBox.
2. Colocamos a la clase MiText1 en una biblioteca de clases llamada
CONTROLES. Como ya exista la biblioteca de clases CONTROLES.VCX
entonces nuestra clase se insert all.

Como ya sabemos, la clase MiText1 posee todas las propiedades y todos los
mtodos de la clase TextBox.

Captura 13. Las propiedades del control MiText1

15
Walter R. Ojeda Valiente

En la Captura 13. podemos ver las propiedades que se cambiaron.

Captura 14. El control MiText1 dentro de un formulario

Y en la Captura 14. podemos ver a un control MiText1 dentro de un


formulario.

Captura 15. Varios controles MiText1 dentro de un formulario

Y en la Captura 15. podemos ver a varios controles MiText1 dentro de un


formulario.

16
Walter R. Ojeda Valiente

Control MiText2
CREATE CLASS MITEXT2 OF CONTROLES AS MITEXT1 FROM CONTROLES

Qu hicimos aqu?
1. Creamos una clase llamada MiText2 basada en la clase MiText1 que
previamente habamos creado, o sea que es una subclase de la clase
MiText1. Podramos pensar en ella como una hija de MiText1. Como la
clase MiText1 no es una clase nativa de Visual FoxPro entonces
debemos decirle en cual archivo .VCX se encuentra la clase MiText1, por
eso al final de CREATE CLASS escribimos FROM CONTROLES. Si el archivo
CONTROLES.VCX no se encuentra en el path de bsqueda entonces
debemos escribir la ruta completa, ejemplo: FROM E:\VFP\CONTROLES
2. Colocamos a la clase MiText2 en una biblioteca de clases llamada
CONTROLES. Como ya exista la biblioteca de clases CONTROLES.VCX
entonces nuestra clase se insert all.

Como ya sabemos, la clase MiText2 posee todas las propiedades y todos los
mtodos de la clase MiText1.

Propiedades de la clase MiText2

InputMask = 99/99/9999

Value = {}

Width = 91

Lo que hemos hecho es crear un TextBox especializado en fechas. De esta


manera, cada vez que necesitemos una fecha podemos insertar un control
MiText2 y listo.

Pero esto no termina aqu, si queremos an podemos mejorar a nuestro


control especializado en fechas.

Para ello, le agregaremos dos propiedades: una para guardar la fecha inicial
aceptable y la otra para guardar la fecha final aceptable.

Hacemos clic en Clases y luego en New Property

17
Walter R. Ojeda Valiente

Captura 16. Agregando una nueva propiedad a la clase MiText2

Captura 17. Agregando la propiedad FechaIni a la clase MiText2

18
Walter R. Ojeda Valiente

Si ahora hacemos clic en la pestaa Other de la ventana Properties,


veremos algo como:

Captura 18. Verificando que se agreg la propiedad FechaIni

En la Captura 18. podemos verificar que la clase MiText2 tiene una


propiedad llamada FechaIni y que el valor de esa propiedad es 01/01/2000

Anlogamente, podramos crear una propiedad llamada FechaFin y cuyo


valor sea 31/12/2099. Mirando las capturas 16 y 17, vemos como se hace
para agregar propiedades a una clase visual.

19
Walter R. Ojeda Valiente

Captura 19. Las propiedades FechaIni y FechaFin de la clase MiText2

Y ahora viene lo interesante, para evitar que el usuario introduzca fechas


fuera del rango admitido, en el mtodo LostFocus() de nuestra clase
MiText2 escribimos:

Captura 20. Solamente las fechas en el rango son admitidas

20
Walter R. Ojeda Valiente

Lo que hemos conseguido es validar que todas las fechas ingresadas por el
usuario estn siempre entre el 01/01/2000 y el 31/12/2099.

Si las fechas que el usuario debe introducir siempre estarn en ese rango,
pues al insertar un control MiText2 ya nos aseguraremos de que nunca
introduzca una fecha incorrecta.

Captura 21. Si la fecha est fuera de rango, muestra un error

Como puedes ver en la Captura 21., cuando el usuario introduzco una fecha
no admitida, se mostr un mensaje de error.

Y si el rango de fechas es distinto?

Supongamos que el rango de fechas puede ser distinto, por ejemplo


necesitamos guardar la fecha de nacimiento de una persona, y la gran
mayora ha nacido antes del 01/01/2000, entonces simplemente en el
mtodo INIT() de nuestro formulario (o en algn otro mtodo, depende del
caso) escribimos:

Captura 22. Cambiando el valor de la propiedad FechaIni

21
Walter R. Ojeda Valiente

Y a partir de ese momento la Fecha Inicial admitida ser el da 01/01/1940.

Captura 23. La fecha 01/01/1940 es aceptada

Captura 24. La fecha 01/01/1939 es rechazada

Por supuesto que lo mismo podramos hacer para cambiar el valor de la


propiedad FechaFin.

Entonces, qu tenemos aqu?

Un control especializado en fechas, al cual le podemos asignar valores para


la menor fecha y para la mayor fecha que puede aceptar.

Como nuestro control MiText2 est basado en el control MiText1, si


cambiamos algo en MiText1 ese cambio tambin afectar a MiText2. Por
ejemplo, supongamos que queremos cambiar el color del fondo de MiText1
y que el texto sea mostrado en negritas, algo as:
MODIFY CLASS MITEXT1 OF CONTROLES

22
Walter R. Ojeda Valiente

Propiedades de MiText1

BackColor = 255, 255, 0

FontBold = .T.

Si ahora ejecutamos nuestro formulario veremos esto:

Captura 25. MiText2 heredando las propiedades de MiText1

Como puedes comprobar si observas la Captura 24. y la Captura 25., el


color del fondo ha cambiado y los nmeros ahora estn en bold (negritas).

O sea que al cambiar algo en MiText1 ese algo tambin se cambia en


MiText2 y eso est buensimo!!! Porque nos ahorrar un montn de
trabajo.

23
Walter R. Ojeda Valiente

Control MiText3
CREATE CLASS MITEXT3 OF CONTROLES AS MITEXT1 FROM CONTROLES

Qu hicimos aqu?
1. Creamos una clase llamada MiText3 basada en la clase MiText1 que
previamente habamos creado, o sea que es una subclase de la clase
MiText1. Podramos pensar en ella como una hija de MiText1. Como la
clase MiText1 no es una clase nativa de Visual FoxPro entonces
debemos decirle en cual archivo .VCX se encuentra la clase MiText1, por
eso al final de CREATE CLASS escribimos FROM CONTROLES. Si el archivo
CONTROLES.VCX no se encuentra en el path de bsqueda entonces
debemos escribir la ruta completa, ejemplo: FROM E:\VFP\CONTROLES
2. Colocamos a la clase MiText3 en una biblioteca de clases llamada
CONTROLES. Como ya exista la biblioteca de clases CONTROLES.VCX
entonces nuestra clase se insert all.

Como ya sabemos, la clase MiText3 posee todas las propiedades y todos los
mtodos de la clase MiText1.

Propiedades de la clase MiText3

InputMask = 999,999,999,999

Value = 0

Width = 131

Al asignarles esos valores a las propiedades, estamos creando un control


especializado en nmeros.

Al igual que hicimos con la clase MiText2 tambin aqu podemos tener
propiedades que marquen el rango de valores admitidos. En este caso a
esas propiedades las llamaremos NumeroIni y NumeroFin e inicialmente les
asignaremos los valores 0 y 999999999999.

24
Walter R. Ojeda Valiente

En el mtodo INIT() escribimos:

Captura 26. Colocando automticamente el ancho

Para qu hicimos eso? Para que el ancho (el Width) de nuestro control
MiText3 sea colocado automticamente por el Visual FoxPro, de esa
manera no tendremos que estar preocupndonos por ese detalle y as
ahorraremos algo de tiempo. Esto funcionar siempre que el valor de la
propiedad InputMask sea colocado en tiempo de diseo.

Por ejemplo, si en el formulario a la propiedad InputMask le asignamos el


valor 999,99,999 veremos esto:

Captura 27. Cuando la propiedad InputMask es 999,999,999

25
Walter R. Ojeda Valiente

En cambio, si a la propiedad InputMask le asignamos el valor 99.99 veremos


esto:

Captura 28. Cuando la propiedad InputMask es 99.99

Como habrs notado, el ancho ha cambiado, y ha cambiado de forma


automtica.

Sin embargo, esta tcnica solamente funciona si el valor de la propiedad


I putMask es puesto e tie po de diseo. Pero Y si es puesto e tie po
de ejecucin?

En ese caso se complica un poco, pero tampoco es algo difcil de realizar.


Abrimos nuestra clase MiText3 y luego en la opcin Class elegimos la
op i Edit Property/Method

Captura 29. Editando una propiedad o un mtodo

26
Walter R. Ojeda Valiente

A continuacin buscamos la propiedad InputMask y hacemos clic en la


casilla Assign Method y luego en el botn Apply.

Para qu?

Para crear un nuevo mtodo que se ejecutar automticamente cada vez


que se le asigne un valor a la propiedad InputMask.

Captura 30. Creando el mtodo InputMask_Assign

Captura 31. Verificando el mtodo InputMask_Assign

27
Walter R. Ojeda Valiente

En la Captura 31. podemos verificar que el mtodo InputMask_Assign ha


sido creado.

Ahora, podemos escribir cdigo dentro de este mtodo.

Captura 32. Escribiendo en el mtodo InputMask_Assign

Entonces, si en nuestro formulario escribimos algo como esto:

Captura 33. Asignando un valor a la propiedad InputMask

Veremos algo como esto:

Captura 34. Cuando el valor de InputMask es 999

28
Walter R. Ojeda Valiente

Y si en nuestro formulario escribimos algo como esto:

Captura 35. Asignando un valor a la propiedad InputMask

Entonces veremos algo como esto:

Captura 36. Cuando el valor de InputMask es 999,999,999.99

Como puedes notar si miras la Captura 34. y la Captura 36., el ancho del
control MiText3 ha cambiado de forma automtica.

29
Walter R. Ojeda Valiente

En el mtodo LOSTFOCUS() escribimos:

Captura 37. Solamente se aceptan nmeros en el rango

Para qu?

Para que solamente se acepten nmeros que estn dentro del rango
admitido, cualquier nmero menor o mayor a los admitidos ser rechazado.

De esta manera, hemos creado un control que automticamente:

Acepta o rechaza los nmeros introducidos por el usuario


Pone el ancho (el Width) que necesita

Pero eso no es todo, podemos mejorarlo bastante ms. Una caracterstica


interesante es que cuando los usuarios introducen un nmero no se vean
los puntos de separacin de los miles, y que solamente despus de haber
introducido el nmero se vean los puntos de separacin. Eso mejora la
usabilidad del control.

Para hacerlo:

Le agregamos la propiedad cOldInputMask

30
Walter R. Ojeda Valiente

En el mtodo GOTFOCUS() escribimos:

Captura 38. El mtodo GotFocus() del control MiText3

Y en el mtodo LOSTFOCUS() escribimos:

Captura 39. El mtodo LostFocus() del control MiText3

31
Walter R. Ojeda Valiente

Entonces, cuando el usuario est introduciendo un nmero el control se


ver as:

Captura 40. El usuario ingresa un nmero en el control MiText3

Pero cuando sale del control se ver as:

Captura 41. El usuario sali del control MiText3

As como hemos creado controles para la introduccin de fechas y de


nmeros tambin podramos crear controles para la introduccin de otros
datos. La gran ventaja de hacerlo as es que todas nuestras aplicaciones
sern consistentes, todas tendrn el mismo aspecto visual y eso facilitar el
uso.

32
Walter R. Ojeda Valiente

Control MiCombo1
CREATE CLASS MICOMBO1 OF CONTROLES AS COMBOBOX

Qu hicimos aqu?
1. Creamos una clase llamada MiCombo1 basada en la clase ComboBox, o
sea que es una subclase de la clase ComboBox. Podramos pensar en
ella como una hija de ComboBox.
2. Colocamos a la clase MiCombo1 en una biblioteca de clases llamada
CONTROLES. Como ya exista la biblioteca de clases CONTROLES.VCX
entonces nuestra clase se insert all.

Como ya sabemos, la clase MiCombo1 posee todas las propiedades y todos


los mtodos de la clase ComboBox.

Propiedades de la clase MiCombo1

BackColor = 255, 255, 0

FontBold = .T.

FontName = Courier New

FontSize = 10

ForeColor = 255, 0, 0

ItemForeColor = 128, 0, 0

Style = 2 (Dropdown List)

33
Walter R. Ojeda Valiente

Captura 42. El mtodo Init() del control MiCombo1

Lo que hemos hecho en la Captura 42. es asegurarnos de que MiCombo1


siempre tendr un ancho (Width) adecuado para que se vea la fila ms larga
de todas las que tiene. Entonces, si tiene estos tems:

Captura 43. Items de MiCombo1

34
Walter R. Ojeda Valiente

Lo que veremos ser:

Captura 44. El tem ms largo cabe perfectamente en el Combo

Donde como puedes observar, el tem ms largo (en este caso: Ciudad del
Este) es totalmente visible. En cambio, si los tems fueran los siguientes:

Captura 45. Los tems de MiCombo1

35
Walter R. Ojeda Valiente

Lo que veramos sera esto:

Captura 46. El tem ms largo cabe perfectamente en el Combo

El ancho del Combo fue puesto automticamente por el mtodo Init()

Esta forma de trabajar nos ahorra tiempo porque cuando insertamos un


Combo en un formulario solamente debemos ubicar sus propiedades Top y
Left, no debemos preocuparnos por la propiedad Width ya que de eso se
encarga el mtodo Init() de nuestro Combo.

36
Walter R. Ojeda Valiente

Control MiGrid1
CREATE CLASS MIGRID1 OF CONTROLES AS GRID

Qu hicimos aqu?
1. Creamos una clase llamada MiGrid1 basada en la clase Grid, o sea que
es una subclase de la clase Grid. Podramos pensar en ella como una
hija de Grid.
2. Colocamos a la clase MiGrid1 en una biblioteca de clases llamada
CONTROLES. Como ya exista la biblioteca de clases CONTROLES.VCX
entonces nuestra clase se insert all.

Como ya sabemos, la clase MiGrid1 posee todas las propiedades y todos los
mtodos de la clase Grid.

Propiedades de la clase MiGrid1

BackColor = 255, 255, 224

ColumnCount = 2

DeleteMark = .F.

FontName = Courier New

ForeColor = 0, 0, 255

RecordMark = .F.

ScrollBars = 2 Vertical

37
Walter R. Ojeda Valiente

Ahora, insertamos un control MiGrid1 a nuestro formulario.

Captura 47. El control MiGrid1 en el formulario

Y ya tenemos a nuestro grid, con todas las propiedades tales y cuales nos
gustan.

38
Walter R. Ojeda Valiente

CONCLUSIN
Crear nuestra propia biblioteca de clases es de una gran utilidad, porque nos
permite personalizar nuestras aplicaciones y adems ahorrar muchsimo tiempo. Si ya
tenemos controles preparados para realizar las tareas ms comunes, no tendremos que
volver a programar esas tareas.

En este documento hemos creado unos pocos controles, para que se entienda la
idea, en la vida real subclasearamos a todos y cada uno de los controles nativos del
Visual FoxPro: List, CheckBox, OptionGroup, Picture, Shape, etc.

Tambin, para que sea ms fcil de entender, a los controles los hemos llamado
MiLabel1, MiLabel2, MiLabel3, etc. En la vida real sera ms til llamarlos: MiLabelNormal,
MiLabelTitulo, MiLabelAsterisco, etc.

Podras preguntarte, para qu necesito clases, si todo esto puedo hacerlo sin
crear clases?

Las ventajas de usar clases son:

Cuando necesitas un determinado control lo buscas en la biblioteca


de clases CONTROLES.VCX, no debes estar haciendo memoria para
recordar en cual formulario de cual aplicacin est el control que
necesitas ahora.
Cuando necesitas modificar un control, lo haces una sola vez y en un
solo lugar. Supongamos que a tus etiquetas en lugar del color azul
oscuro quieres ponerles el color marrn oscuro. Cambias el color de
tu etiqueta en CONTROLES.VCX, una sola vez y listo, todas las
etiquetas heredarn ese color. Si el cambio debes hacerlo en slo
uno o dos formularios la ganancia de tiempo no ser muy grande,
pero si debes hacerlo en 20, 30, ms formularios, all s que
agradecers haber usado un control personalizado.
Te aseguras que haya consistencia visual y programtica. Si lo que
has hecho fue simplemente copiar y pegar los controles nativos
del Visual FoxPro en tus formularios entonces cuando necesites
cambiarlos puedes encontrarte con el problema de que no los has
cambiado a todos. Quizs porque te olvidaste que tambin estaban
en otro formulario o quizs porque te distrajiste, te llamaron, hiciste
algo ms, y ya no los cambiaste. La consecuencia es que el aspecto
visual de tu aplicacin deja mucho que desear, en algunos lugares

39
Walter R. Ojeda Valiente

pones un color azul oscuro y en otros lugares pones un color marrn


oscuro cuando lo correcto hubiera sido que en todos los lugares
haya un solo color.

En el siguiente documento de esta serie veremos algo muy interesante: como crear
controles que descienden no solamente de una clase sino de dos o ms clases. Con eso
conseguiremos que nuestros controles sean ms lindos visualmente y tambin que sean
ms poderosos porque tendrn ms prestaciones.

Las clases de Visual FoxPro son una maravilla, porque nos permiten hacer
cualquier cosa que se nos ocurra, es solamente cuestin de tener la idea y de dedicarle un
poco de tiempo para llevarla a cabo.

Si an no has ledo el primer documento de esta serie, puedes descargarlo desde:

http://www.mediafire.com/file/yi41z0y7z1fnol6/CLASES_EN_VISUAL_FOXPRO_9.ZIP

Y si tienes alguna duda, consulta, o comentario, puedes enviarme un e-mail a:

wrov@hotmail.com

Saludos desde Asuncin, Paraguay

40

S-ar putea să vă placă și