Monografias | Controles y clases en Visual BasicControles y clases en Visual BasicResumen: Introducción a los controles. Propiedades, métodos, Funciones y Eventos. Creación de un control. Manos a la obra. Creación de las propiedades del control textbox especial. Creación de los eventos. Creación de las propiedades y funciones personalizadas. Finalización de un Control. Conclusión. Introducción a las Clases. Propiedades, Funciones y Eventos. Diseño de clase en Visual Basic. Creación de la Clase "ASISTENTE". Indice 1. Introducción a los controles Este manual esta dirigido a programadores que posean los
conocimientos básicos del Lenguaje de programación Visual Basic, se requiere
conocimientos sobre, funciones, métodos, propiedades y todo lo que un manual o
libro de Referencia pueda enseñar, aunque en realidad el diseño de controles y
clases no es tan complicado este documento lo que trata o su finalidad es de
explicar de la manera más fácil la creación de los mismo, con ejemplos que
ustedes podrán emplear en sus propios proyectos. Esta ventana la cual se encuentra en el lado izquierdo de la
pantalla cuando se inicia Visual Basic, es donde se encuentran todos los
controles, los predeterminados y los que usted añada para el desarrollo de su
proyecto, los controles se pueden definir como una herramienta la cual presenta
ciertas características y funciones las cuales ayudan a resolver un problema,
por ejemplo, el TEXBOX nos ayuda a introducir información, la cual será
mostrada en pantalla. Ahora donde esta la ventaja de un control, bueno imagínese,
que no hubiera un control TEXBOX y ustedes como programadores tuvieran que diseñar
una forma de mostrarle la información al cliente de manera presentable, bueno
desde una perspectiva, lo que haríamos seria PINTAR una parte de la pantalla de
color blanco (o cualquier otro) y cuando mostremos el TEXTO ubicarlo en la
posición donde fue pintada la pantalla, esto se asemejaría a una programación
en DOS, pero como queremos darle presentación, imagínense que dibujamos líneas
alrededor, para que pareciera un cuadro, pero como no convence o se sigue viendo
como un programa de DOS, tratamos de hacerlo 3D, pintando dos líneas de GRIS y
dos de NEGRO lo que simularía un efecto de sombra, y tendríamos que codificar
muchas veces lo mismo, porque imagínense que necesitáramos alrededor de 20
TEXTBOX en un formulario, UHY no me gustaría ver ese código. 2. Propiedades, métodos, Funciones y Eventos. Cuándo nace la programación orientada a objetos una de los
principios más importantes era la reutilización de código, es decir,
codificando una sola vez, podríamos usar ese control en cualquiera de nuestros
proyectos sin volver a codificarlos, IMPRESIONANTE NO!!!, pero los controles
tienen 4 características importantes que son: PROPIEDADES, METODOS, FUNCIONES y
EVENTOS, las propiedades son como las partes que constituyen al objeto, (Como
por ejemplo, una persona se podría decir que presenta propiedades como sus:
ojos, oreja, labios, pies, color, etc), estas propiedades constituyen al control
ya que ellas presentan valores, que le dan forma al mismo control, que quiero
decir, si seguimos con el ejemplo de la persona las propiedades mencionadas
tienen valores cuando nosotros nacemos (por ejemplo Ojos = Verdes, Orejas =
Grandes, PIES = Planos, etc), como pueden ver estos valores no dan a nosotros
nuestra forma, igual es con un control los valores de las propiedades son la que
definen su forma. Otra ventaja de la programación orientada a objetos es lo
que se llama ENCAPSULACION, esto significa que podemos tener un control 50 veces
en un formulario, y si le cambiamos una propiedad a un control solamente se
cambia en él y no en los 49 controles restantes, es decir, cada control
mantiene encapsulado sus propiedades, con este ejemplo se entenderá mejor: Cuando nos referimos a una propiedad de un control tenemos
que colocar su nombre y el nombre de la propiedad, ejemplo: Nombre_de_Control.Propiedad = Valor Si continuamos con el ejemplo de una persona sería algo
parecido: Maria.Ojos = Castaños En un programa de Visual Basic seria de la siguiente manera: Text1.text = "HOLA" Donde Text1 es un control TEXTBOX, Text es una propiedad del
control TEXTBOX, y "HOLA" es una cadena String que se le pasa a la
propiedad (Text) de Text1 (CONTROL). Perfecto, entonces un ejemplo de Encapsulación seria el
siguiente supongamos que tenemos 2 TEXTBOX en un formulario Text1 y Text2 si
hacemos lo siguiente: Text1.text = "HOLA MUNDO" Este texto nada mas es para el Text1, no se modifica la
propiedad "Text" del Text2 (ESO ES ENCAPSULAMIENTO) Ahora, ya entendido de lo que son las propiedades vamos a ver
los métodos y Funciones, los métodos y las funciones son muy similares la
diferencia radica en que los métodos (NO RETORNAN VALOR), y las funciones
(SIEMPRE RETORNAN UN SOLO VALOR). Ejemplo en código de visual basic es: Método: Sub Nombre_del_Metodo (Parámetros_Requeridos) .. (líneas de código) End sub Funciones: Function Nombre_de_la_Funcion (Parámetros_Requeridos) as
Valor_a_devolver . .(líneas de código) Nombre_de_la_funcion = Valor End function Como ya supongo que ustedes saben ya de esto, ahora vamos a
explicar los Eventos, los eventos son aquellas reacciones de un control sobre
algo que sucede a su alrededor, es decir, cuando se pulsa una tecla en un
control se produce un evento que se llama Keypress, nosotros podemos ahí
codificar como va reaccionar el control cuando se presione una determinada
tecla, los eventos son muchos (MOUSEDOWN, MOUESUP, GETFOCUS, etc) dependiendo
del tipo de control, cuando nosotros creamos un control podemos utilizar eventos
ya creados o crear nuestros propios eventos. 3. Creación de un control Ahora vamos a lo que en realidad queremos, CREAR UN CONTROL,
antes de crearlo un control tiene un ciclo de vida el cual se compone de la
siguiente manera: Al nacer: Initialize, InitProperties, ReadProperties, Resize. Al morir: WriteProperties, Terminate. Ahora, que es todo eso que escribir arriba, bueno esos son
eventos de un control cuando se esta diseñando (OJO: estos eventos nada mas se
ven cuando se diseña el control, no cuando usamos el control en algunos de
nuestros proyectos), lo que quiero decir que para que un control funcione
adecuadamente hay que añadir unas líneas de código en estos eventos para el
buen funcionamiento del mismo, no se preocupen que eso le vemos mas adelante. Vamos a diseñar un TEXTBOX pero especial, ahora que tiene de
especial, bueno lo especial es que este TEXTBOX_ESPECIAL, lo vamos a diseñar
para que acepte los caracteres del teclado que nosotros queremos que acepte, es
decir, si han usado un TEXTBOX normal verán que si quieren que el TEXBOX
solamente acepte números tienen que codificar las restricciones en cada
TEXTBOX, con este TEXTBOX_ESPECIAL las restricciones solamente las codificamos
una sola vez para TODOS LOS PROGRAMAS que vayamos a diseñar. Para empezar ejecutemos el programa Visual Basic y cuando le
aparezca la ventana "NUEVO PROYECTO" igual a la figura n.2,
seleccionen el icono "Control Activex", y le dan Doble Click. Ahora vemos una pantalla gris parecida a un formulario, con
la diferencia que no tiene ni marco, ni los botones de minimizar, maximizar, y
cerrar, esto es por que un control no es un Formulario. Ahora, como vamos a diseñar
un control TEXTBOX_ESPECIAL; en la ventana propiedades donde dice UserControl1
(Propiedad "NAME"), borre eso y coloque TEXTBOX_ESPECIAL, luego añadimos
un TEXBOX común y silvestre en el fondo gris no importa donde, ni el tamaño,
ya que eso lo arreglaremos a nivel de código, pueden notar que en la ventana
controles aparece una figura desactivada como la que se muestra en la figura
N.3: Esta figura es nuestro control, pero como no hay ningún
formulario para añadirlo no se activa. Ahora vamos a añadir un formulario a
nuestro proyecto, denle click al segundo botón de la barra de herramienta de
Visual Basic la cual al posicionar el mouse en él le indicara que es para añadir
un nuevo formulario, cuando le aparezca la ventana de "Añadir un
Formulario", seleccione el formulario Normal y le dan al botón Aceptar. Repasemos, debemos de tener un proyecto con un control
llamado TEXTBOX_ESPECIAL y un formulario llamado Form1. Continuemos, ahora vamos a ver nuestro control en el
formulario, para habilitar el control en la ventana de controles, dele
doble-click al control TEXTBOX_ESPECIAL en la ventana Proyecto, verán el
control con un textbox normal, ahora cierre la ventana dándole click al botón
cerrar ("X") el cual se encuentra al lado derecho del menú, verán
que se cierra el control y se ve el formulario y se habilita el control en la
barra de controles, ahora sigua estos pasos:
Ahora es aquí donde vamos a CODIFICAR NUESTRO CONTROL, denle
doble-click al control TEXTBOX-ESPECIAL en la ventana "PROYECTO",
cuando vean el control le dan doble-click en él para meternos en el código y
ahora siga con estos pasos:
Private Sub UserControl_Resize() Text1.Top = 0 Text1.Left = 0 Text1.Height = Height Text1.Width = Width End Sub Con esto lo que estamos haciendo es adaptando al TEXTBOX de
nuestro control al tamaño que el control presenta, ahora cierre otra vez la
ventana de diseño del control, y cuando vea habilitado el control en la
ventanas de controles, seleccione el formulario borre el control antiguo que
inserto y vuélvale a dar doble-click a nuestro control notara que ahora tiene
una presentación mas aceptable e intente de aumentar y disminuir su tamaño
para que vea como el control TEXTBOX se adapta a nuestra exigencia. Y notara que
si ve las propiedades de nuestro control no aparece ni el BACKCOLOR, FONT,
PASSSORDCHAR, entre muchos otros, y que en los eventos no aparece ni KEYPRESS,
MOUSEDOWN, etc, esto se debe a que todo eso hay que codificarlos nosotros
mismos, pero no se preocupen eso es mas fácil de lo que ustedes se imaginan. 5. Creación de las propiedades del control
textbox especial Ahora vamos adaptar algunas de las propiedades mas
importantes o la que mas utilizamos del TEXTBOX (OJO: no es obligatoria colocar
todas), en nuestro control nada mas habilitaremos o mostraremos las propiedades:
FONT, FORECOLOR, BACKCOLOR, TEXT, ALINEACIÓN, ENABLED, LOCKED, MAXLENGHT y
PASSWORDCHAR, para hacer esto introduzca en la ventana de código del control lo
siguiente: Public Property Get Font() As Font Set Font = text1.Font End Property Public Property Get ForeColor() As OLE_COLOR ForeColor = text1.ForeColor End Property Public Property Get BackColor() As OLE_COLOR BackColor = text1.BackColor End Property Public Property Get Text() As String Text = text1.Text End Property Public Property Get Enabled() As Boolean Enabled = text1.Enabled End Property Public Property Get Locked() As Boolean Locked = text1.Locked End Property Public Property Get MaxLenght() As Integer MaxLenght = text1.MaxLength End Property Public Property Get PasswordChar() As String PasswordChar = text1.PasswordChar End Property Public Property Set Font(ByVal NuevoValor As Font) Set text1.Font = NuevoValor PropertyChanged "Font" End Property Public Property Let ForeColor(ByVal NuevoValor As OLE_COLOR) text1.ForeColor() = NuevoValor PropertyChanged "ForeColor" End Property Public Property Let BackColor(ByVal NuevoValor As OLE_COLOR) text1.BackColor() = NuevoValor PropertyChanged "BackColor" End Property Public Property Let Text(ByVal NuevoValor As String) text1.Text = NuevoValor PropertyChanged "Text" End Property Public Property Let Enabled(ByVal NuevoValor As Boolean) text1.Enabled = NuevoValor PropertyChanged "Enabled" End Property Public Property Let Locked(ByVal NuevoValor As Boolean) text1.Locked = NuevoValor PropertyChanged "Locked" End Property Public Property Let MaxLenght(ByVal NuevoValor As Integer) text1.MaxLength = NuevoValor PropertyChanged "MaxLenght" End Property Public Property Let PasswordChar(ByVal NuevoValor As String) text1.PasswordChar = NuevoValor PropertyChanged "PasswordChar" End Property NOTA: le recomendaría que guardaran el proyecto no vaya ser
que se vaya la luz y perdamos todo el tiempo invertido (NO QUEREMOS ESO) Se deben de estar preguntando ("QUE ES TODO ESTO"),
bueno empecemos la explicación: Cuando se crean propiedades, se deben de utilizar lo
siguiente: Property Let Property Get Property Let se ejecutara cada vez que nosotros cambiamos
alguna de las propiedades del control en el formulario del proyecto ya sea a
nivel de diseño o de código. Property Get se ejecutara cada vez que solicitemos
alguna información de nuestras propiedades por ejemplo que una variable quiera
tomar una propiedad: Nombre_Variable = TEXTBOX_ESPECIAL.Text Por ejemplo voy a explicar una propiedad y la explicación es
lo mismo para todas las propiedades: Public Property Get Text() As String Text = text1.Text End Property Public Property Let Text(ByVal NuevoValor As String) text1.Text = NuevoValor PropertyChanged "Text" End Property En Property Get lo que hacemos es que cuando
solicitamos información del texto que esta introducido en el TEXTBOX_ESPECIAL
hacemos Text que es nuestra propiedad igual a Text1.Text, siendo text1 el
control que nosotros colocamos en nuestro control. Por ejemplo: Variable = TEXTBOX_ESPECIAL.text Cuando hacemos esto, sin darnos cuenta nuestro control invoca
Property get de la propiedad Text y tomamos el valor el cual seria Text =
text1.Text , y ese valor se le asigna a la variable que lo invoco en este caso
"Variable" En Property Let lo que hacemos es que cuando le asignamos un
nuevo valor a nuestra propiedad Text (OJO "NUESTRA PROPIEDAD"),
ejemplo: TEXTBOX_ESPECIAL.text = "HOLA" Sin darnos cuenta se ejecuta el código que adentro se
encuentre, en este caso le asignamos al Text1.text = NuevoValor siendo
"nuevoValor" el texto que aparecerá en el control. El ByVal se debe a
que el valor se pasa por copia y no por Referencia, léanse la ayuda sobre métodos
y Funciones. Cuando dije (OJO "NUESTRA PROPIEDAD") quise decir,
que nosotros pudimos haber llamado esa propiedad como nosotros queramos, es
decir, que en ves de llamarlo Text, lo pudiésemos haber llamado
"TEXTO", "CADENA", "PEPE", "PEPITO",
como nosotros queramos, lo que sucede que para no confundir a los usuarios que
usen el control, respeto ya el estándar del Textbox existente. Recuerden no
estamos creando desde cero un TEXTBOX, lo que estamos haciendo es un control que
posee un control TEXTBOX común y silvestre, pero que se adaptara a nuestra
exigencias (En este caso lo que mencione al principio, un Textbox_Especial que
acepte los caracteres del teclado que nosotros queramos, ya que el Textbox
normal no lo hace de manera automática) Si ahora insertan nuestro control en el formulario con esta
modificaciones van a notar en la ventana propiedades que ahora aparecen MAS
PROPIEDADES QUE ANTES, y que se pueden modificar "MAGNIFICO NO!!!!"
poco a poco aprendemos mas. Anda cambia la propiedad Text de nuestro control a
nivel de diseño para que vea como cambia en el formulario. Ahora vamos a aprender algo más, para empezar inserten un
control TEXTBOX común y corriente (ES DECIR EL DE VISUAL BASIC) en el
formulario donde estamos trabajando, y en la ventana propiedades denle Click a
la propiedad "Alignment", verán que se habilita un botón con una
flecha hacia abajo y si le dan click le mostrara una lista de las opciones
posibles; a lo que quiero llegar es que ustedes se deben de estar preguntando
"COMO SE HACE ESO?" , bueno es fácil primero en la sección de
"Declaraciones", en la ventana de código (de nuestro control),
insertaremos la declaración de la siguiente variable: Enum Tipo_Alineacion Izquierda = 0 Derecha = 1 Centro = 2 End Enum Ahora vamos a crear la propiedad de la manera siguiente: Public Property Get Alineacion() As Tipo_Alineacion Alineacion = Text1.Alignment End Property Public Property Let Alineacion(ByVal NuevoValor As
Tipo_Alineacion) Text1.Alignment = NuevoValor PropertyChanged "Alineacion" End Property Si ahora insertan nuestro control con las modificaciones
hechas, en el formulario podrán notar que añadió una nueva propiedad que se
llama "ALINEACION", y si le dan click verán el botón de al lado con
la flecha hacia abajo, y si dan click al botón verán una lista con las
opciones disponibles "INCREÍBLE NO!!!", siempre cuando ustedes desean
mostrar una lista en alguna de las propiedades usen la declaración ENUM (VEASE
EN LA AYUDA las variables de tipo ENUM). Algo que se me ha olvidado explicar es el PropertyChanged,
esto se tiene que escribir cuando una propiedad cambia su estado Abran notado que todavía no hemos ejecutado el proyecto, es
decir solamente hemos visto nuestro control a nivel de diseño y no a nivel de
ejecución, bueno ahora vamos a ejecutarlo, pero primero cambien el color de
nuestro control, al color que ustedes quieran, y en la alineación coloquen la
opción de "CENTRO", muy bien para ejecutar el proyecto primero
debemos de hacer los siguientes paso dele click a "PROYECTO" en el menú,
luego a "Propiedades del Proyecto1", en el cuadro de "TIPO DE
PROYECTO", seleccionen "Exe estándar" y en "OBJETO
INICIAL", seleccionen Form1 y luego le dan aceptar. Bueno, debemos de tener un control con un fondo que ustedes
hayan elegido, con el texto Centrado, ahora ejecuten el
proyecto......................................, podrán haber notado que tanto
el fondo como la alineación no esta como nosotros la colocamos en el diseño,
es decir, estamos viendo un fondo blanco, con la alineación a la izquierda,
bueno esto en realidad fue intencional, por que todavía nos falta echar unas
pocas líneas de código para que funcione. Cierren el programa en ejecución, y metanse en el código de
nuestro control y añadan las siguientes líneas: Private Sub UserControl_WriteProperties(PropBag As
PropertyBag) On Error Resume Next Call PropBag.WriteProperty("BackColor",
Text1.BackColor, &H80000005) Call PropBag.WriteProperty("Font", Font,
Ambient.Font) Call PropBag.WriteProperty("ForeColor",
Text1.ForeColor, &H80000008) Call PropBag.WriteProperty("Alineacion",
Text1.Alignment, 0) Call PropBag.WriteProperty("Enabled",
Text1.Enabled, True) Call PropBag.WriteProperty("Locked", Text1.Locked,
False) Call PropBag.WriteProperty("MaxLenght",
Text1.MaxLength, "") Call PropBag.WriteProperty("PasswordChar",
Text1.PasswordChar, "") Call PropBag.WriteProperty("Text", Text1.Text,
"") End Sub Private Sub UserControl_ReadProperties(PropBag As
PropertyBag) On Error Resume Next Set Font = PropBag.ReadProperty("Font",
Ambient.Font) Text1.ForeColor = PropBag.ReadProperty("ForeColor",
&H80000008) Text1.BackColor = PropBag.ReadProperty("BackColor",
&H80000005) Text1.Alignment =
PropBag.ReadProperty("Alineacion", 0) Text1.Enabled = PropBag.ReadProperty("Enabled",
True) Text1.Locked = PropBag.ReadProperty("Locked",
False) Text1.MaxLength = PropBag.ReadProperty("MaxLenght",
"") Text1.PasswordChar =
PropBag.ReadProperty("PasswordChar", "") Text1.Text = PropBag.ReadProperty("Text",
"") End Sub En estos momentos si ustedes estaban confundidos, o le
costaba entender el cómo se hace un control, deben de estar peor al ver este
poco de líneas que seguro ni entienden por que la escribieron; bueno para
empezar con estos dos métodos se deben de "MECANIZAR" que quiero
decir con esto, todo control cualquiera fuera su tipo siempre va a tener estos
dos Eventos, y se usan igual para todos los controles que ustedes diseñen. WriteProperties: en este método o evento declaramos líneas
como esta Call PropBag.WriteProperty("BackColor",
Text1.BackColor, &H80000005) Donde: Siempre y esto que quede claro cuando ustedes crean una
propiedad tienen que meterla en WritePropery, no se preocupen por entender
"Call PropBag.WriteProperty", esto no importa lo que si es importa es
que sepan que tienen que poner como primer valor el nombre de la propiedad,
luego el nombre de la propiedad original, y por ultimo el valor por defecto. ReadProperty: en este método o evento declaramos líneas
como esta: Text1.BackColor = PropBag.ReadProperty("BackColor",
&H80000005) Donde:
Al igual que WriteProperty, no se preocupen de buscar el
"POR QUE HACEMOS ESTO", lo que importa es que cuando añadan una nueva
propiedad en Readproperty tienes que poner el nombre de la propiedad a utilizar
(En este caso Text1.BackColor) igual a Propbag.ReadProperty(Nombre_de_la
propiedad_nuestra, valor original o por defecto). Esta parte reconozco que es un poco complicada de entender,
por eso mencione que para estos dos métodos MECANÍCENSE, no lo busquen el por
que, tan sencillamente háganlo de esa manera, si desean averiguar sobre estos
Eventos (Vean en la ayuda de MSDN de Microsoft) Ahora, vamos al formulario del proyecto, quiten el control
viejo y vuelvan a insertar nuestro control con los nuevos cambios, verán que
tanto físicamente como en las propiedades no ha cambiado, pero ahora, cámbienle
el color y la alineación póngala centrada y
ejecuten............................... habrán notado que ya el color y la
alineación se mantienen ¡QUE BUENO!, pera que vean lo poderosas con son esas
instrucciones. Ya pasamos lo mas difícil que era la declaración de
propiedades, ahora viene lo mas fácil, si ustedes se meten en el código del
formulario e intentan ver los eventos del TEXTBOX_ESPECIAL, verán que no ven
todos lo eventos, sino unos pocos; ahora nuestra misión es hacer que se vean
los eventos que nosotros usamos en un TEXBOX. Para eso inserten las siguientes líneas de código en la
declaración de variables (DE NUESTRO CONTROL): Public Event Changed() Public Event MouseMove(Button As Integer, Shift As Integer, X
As Single, Y As Single) Public Event MouseUp(Button As Integer, Shift As Integer, X
As Single, Y As Single) Public Event MouseDown(Button As Integer, Shift As Integer, X
As Single, Y As Single) Public Event Keypress(KeyAscii As Integer) Public Event KeyDown(KeyCode As Integer, Shift As Integer) Public Event KeyUP(KeyCode As Integer, Shift As Integer) Public Event Click() Public Event DbClick() NOTA: ustedes pueden añadir mas eventos, yo solamente añadí
los mas usados. Ahora, lo que acabamos de hacer es declarar los eventos, ¡pero
como lo invocamos!, bueno lo que hacemos es que en cada evento del TEXBOX que
tenemos un nuestro control, añadimos lo siguiente: RaiseEvent Nombre_del_Evento Por ejemplo en el Evento KeyPress de Text1 (Este TextBox es
el que esta adentro de nuestro control) añadimos lo siguiente: Private Sub Text1_KeyPress(KeyAscii As Integer) RaiseEvent Keypress(KeyAscii) End Sub En keyup: Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer) RaiseEvent KeyUP(KeyCode, Shift) End Sub En MouseMove: Private Sub Text1_MouseMove(Button As Integer, Shift As
Integer, X As Single, Y As Single) RaiseEvent MouseMove(Button, Shift, X, Y) End Sub Y así sucesivamente...... (Háganlo en todos los eventos que
declare arriba) Con esto nuestro control tiene algunos de los eventos del
TEXTBOX original y su misma funcionalidad. NOTA: todos los eventos que invocan con RaiseEvent deben de
estar declarados previamente. Vieron que era mas simple, ahora vayamos al formulario de
nuestro proyecto, quitemos el control viejo e insertemos un nuevo control con
las modificaciones hechas, ahora si se meten en el código del formulario y
seleccionan a nuestro control, y verifican los eventos notaran que aparecen los
eventos que ya venían por defecto y los que nosotros añadimos, cada vez
hacemos un control mas REAL. Bueno ya tenemos un control DECENTE, pero ustedes se estarán
preguntando que carrizo estoy haciendo, este control es igualito al TEXTBOX
normal, y peor por que tiene menos propiedades y eventos que el original,
HAAAAA!!!! lo que sucede es que ahora es que vamos a codificar lo bueno. 7. Creación de las propiedades y funciones
personalizadas Muy bien, el objetivo de este control es que el usuario elija
que quiere que el TEXTBOX_ESPECIAL acepte al escribir sobre él, (por ejemplo
NUMEROS, LETRAS, FECHA, etc), bueno pera eso tenemos que declarar otra variable
ENUM en la ventana de código del control en la parte de declaraciones y una
variables: Enum Tipo_Text Texto = 0 Letras = 1 Numérico = 2 Fecha = 3 Monetario = 4 Mayúsculas = 5 Custom = 6 End Enum Dim mTipo As Integer Y añadimos otro propiedad la cual se va a llamar
"TIPO": Public Property Get Tipo() As Tipo_Text Tipo = mTipo End Property Public Property Let Tipo(ByVal NuevoValor As Tipo_Text) mTipo = NuevoValor PropertyChanged "Tipo" End Property Ahora, por que uso una variable "mTipo", si en las
otras propiedades uso Text1.propiedad = "valor", bueno por la simple
razón que el TEXBOX original no tiene esta propiedad, aquí es donde esta el
poder del diseño de controles, estamos utilizando un control que ya existe
(TEXTBOX) pero adaptándolo a nuestras exigencias, uso una variable
"mTipo", por que esta es una propiedad exclusiva de nuestro control, y
no existe en el TEXTBOX original. No se les olvide colocar en: WriteProperty: Call PropBag.WriteProperty("Tipo", mTipo,
Tipo_Text.Texto) Dense cuenta que como segundo parámetro esta mTipo, por lo
que dije, esta es una propiedad exclusiva de nosotros y no del TextBox. ReadProperty: mTipo = PropBag.ReadProperty("Tipo",
Tipo_Text.Texto) Donde el valor por defecto, es Tipo_Text.Texto, (Por esta razón
cuando ustedes insertan un control, en la propiedad "Tipo" van a haber
que se encuentra ubicado en la opción 0.- Texto) Muy bien, ahora vamos al formulario quitemos nuestro control
viejo, y coloquemos el nuevo, vera que en las propiedades esta "Tipo",
ahí le aparecerá una lista desplegadle, en la cual usted señalara que quieres
que acepte el TEXTBOX_ESPECIAL, si quiere que sea numero, texto, etc. Seleccione
Numero, y ejecute el proyecto, e intente escribir, notara que puede escribir
cualquier cosa ¡PERO HOMBRE ESO ES OBVIO TODAVÍA NO HEMOS HECHO EL CODIGO DE
LAS RESTRICCIONES!, sal del programa en ejecución, y metete en el código de
nuestro control y añade las siguientes Funciones: Public Function Numeros (Tecla As Integer) As Integer Dim strValido As String strValido = "0123456789" If Tecla > 26 Then If InStr(strValido, Chr(Tecla)) = 0 Then Tecla = 0 End If End If Numeros = Tecla End Function Public Function VLetras(Tecla As Integer) As Integer Dim strValido As String strValido =
"qwertyuioplkjhgfdsazxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM,.*-}¿'!%&/()=?¡]¨*[Ñ;:_" If Tecla > 26 Then If InStr(strValido, Chr(Tecla)) = 0 Then Tecla = 0 End If End If VLetras = Tecla End Function Public Function VFecha(Tecla As Integer) As Integer Dim strValido As String strValido = "0123456789/" If Tecla > 26 Then If InStr(strValido, Chr(Tecla)) = 0 Then Tecla = 0 End If End If VFecha = Tecla End Function Public Function VDinero(Tecla As Integer) As Integer Dim strValido As String strValido = "0123456789,-" If Tecla > 26 Then If InStr(strValido, Chr(Tecla)) = 0 Then Tecla = 0 End If End If VDinero = Tecla End Function Public Function VCadenas_Mayusculas(Tecla As Integer) As
Integer VCadenas_Mayusculas = Asc(UCase(Chr(Tecla))) End Function Public Function VPersonalizado(Tecla As Integer) As Integer Dim strValido As String strValido = mPersonalizado If Tecla > 26 Then If InStr(strValido, Chr(Tecla)) = 0 Then Tecla = 0 End If End If VPersonalizado = Tecla End Function No voy a explicar cada una de las funciones tan sencillamente
por que ustedes ya deben de poseer los conocimientos necesarios para entender
este código, lo único que dijo es que las funciones reciben el Carácter en
ASCII, y verifican si se encuentra en el parámetro que se acepta en este caso
es la variable "strValido", la función retorna, el mismo código
ASCII si es valido o retorna un 0 si no es valido.. Ahora, como o en que parte se llaman las funciones, bueno
cuando nosotros apretamos una tecla en nuestro control, se ejecuta el Evento
KeyPress (del TextBox que esta en nuestro control), lo que tenemos que hacer es
invocar la validación desde el evento, es decir, copie este código en el
evento keyPress (del Text1 de nuestro control) , el cual quedaría de esta
manera: Private Sub Text1_KeyPress(KeyAscii As Integer) Select Case mTipo Case 1 KeyAscii = VLetras(KeyAscii) Case 2 KeyAscii = Numeros(KeyAscii) Case 3 KeyAscii = VFecha(KeyAscii) Case 4 KeyAscii = VDinero(KeyAscii) Case 5 KeyAscii = VCadenas_Mayusculas(KeyAscii) Case 6 KeyAscii = VPersonalizado(KeyAscii) End Select RaiseEvent Keypress(KeyAscii) End Sub Vamonos al formulario y quitemos nuestro control viejo y añadimos
uno nuevo, en la propiedad "Tipo", coloca numérico, y ejecuta el
programa veras que si te colocas en nuestro control e intentas escribir no podrás
escribir ninguna letra, carácter especial y nada sino solamente números, AHHH
ahora si se esta poniendo mejor la cosa, pero tenemos un defecto; salgan del
programa en ejecución podrán ver que nosotros colocamos en tipo numero, pero
si intentan cambiar el Text a nivel de diseño el le acepta cualquier tecla, es
solamente a nivel de ejecución donde se valida la entrada, para solucionar esto
hacemos lo siguiente: Bueno, voy a explicar como hacer la opción 2, si quieren
desarrollar la opción 1, quedara en su cuenta ya que tampoco voy a dar 10
paginas de puro código cuando lo que estamos explicando es como crear un
control, mas no las mil y un funciones, que debería de tener un control. Como lo opción 2 es una tontería, la voy a explicar ya que
es importante saber como hacer que una propiedad trabaje nada mas a nivel de
ejecución, para esto añadan el siguiente código en Property Let de la
propiedad Text de nuestro control: Public Property Let Text(ByVal NuevoValor As String) If Ambient.UserMode = False Then MsgBox "No se puede editar este control a nivel de diseño",
vbInformation + vbOKOnly, "TextBox Especial" Else Text1.Text = NuevoValor PropertyChanged "Text" End If End Property Puede notar que añadimos un par de líneas la primera e
importante Ambient.UserMode esta es la propiedad que determina si el control se
esta ejecutando a nivel de código o Diseño, cuando inserten esto, AH, se me
había olvidado, dele doble-click al control TEXBOX_ESPECIAL en la ventana de
proyecto, cuando vean nuestro control asegúrense que la propiedad Text, del
Textbox que nosotros insertamos este en blanco, es decir, que no muestre nada;
continuamos, cuando hayan insertado el código nuevo, váyanse al formulario
borren el viejo control, inserten uno nuevo e intenten cambiar la propiedad Text
a nivel de diseño vera que cuando presione ENTER le aparecerá un Msgbox, indicándole
que no puede editar este control a nivel de diseño. Variable_T = "HOLA" Y en cualquier parte del código hacemos: TextBox_Especial1.text = Variable_T Y tenemos a la propiedad "Tipo" como Numero, verán
que acepta a la variable_T y mostrara "HOLA", pero bueno nada es
perfecto, es decir, la validación nada mas se hará cuando escribamos en el
TEXTBOX_ESPECIAL, no cuando le asignemos otra variable como el ejemplo anterior.
Bueno pero ese es un ejercicio para ustedes, recuerden con los controles se
puede hacer lo que quiera. Ahora, si colocamos a tipo como numero (Sabemos que el
TEXTBOX_ESPECIAL nada mas aceptara números), Texto (aceptara todo tipo de
letra), Monetario (Aceptara números y una coma), si ponemos fecha (aceptara el
/ y los números) pero en la fecha si podemos cometer errores, por ejemplo
podemos escribir 33/99/3000, esta no es una fecha valida si queremos evitar
codificar en el programa las validaciones, vamos hacer la validación en el
control. Para realizar la validación vamos a insertar el código
siguiente en el evento LostFocus del TEXTBOX (Text1) de nuestro control: Private Sub text1_LostFocus() If mTipo = 3 Then If Not IsDate(text1.Text) Then MsgBox "Esta Fecha no es Valida", vbInformation +
vbOKOnly, "Text Box Especial" text1.Text = vbNullString text1.SetFocus End If End If End Sub Ahora, regresemos al formulario quiten el control viejo,
inserta uno nuevo y en la propiedad "Tipo" selecciona fecha, ejecuta
el programa, introduce una fecha incorrecta, y dale el Foco a otro control veras
que te aparece un mensaje diciendo que la fecha no es valida. BUENO NO!!!!!! No se preocupen, que ya falta poco para terminar la parte de
controles, vamos a introducir una sola propiedad MAS!, vamos añadan en el código
del control lo siguiente: Dim mPersonalizado As String Public Property Let Personalizado(ByVal NuevoValor As String) mPersonalizado = NuevoValor PropertyChanged "Personalizado" End Property Public Property Get Personalizado() As String Personalizado = mPersonalizado End Property En ReadProperty: mPersonalizado =
PropBag.ReadProperty("Personalizado", "") En WriteProperty: Call PropBag.WriteProperty("Personalizado",
mPersonalizado, "") Esta propiedad lo que realiza es que cuando seleccionan en
"Tipo", la opción de CUSTOM, y colocan la letra A en la propiedad de
personalizado, solamente la letra A se podrá escribir en la ejecución del
control...... 8. Finalización de un Control
Bueno señores ahora si terminamos, espero que haber dedicado tiempo a leer esta parte del curso le halla servido para aprender lo esencial de la creación de controles, cabe mencionar que este CONTROL TEXTBOX_ESPECIAL, puede tener muchas fallas, o cosillas que siempre se escapan, pero bueno eso les queda como tarea para que practiquen con los controles. Señores diseñando controles ustedes pueden hacer lo que quieren, ANIMACIONES, TEXBOX SUPER AVANZADOS, GRAFICOS, lo que sea, solo hace falta conocer como hace un control, y una gran imaginación para realizar los mejores controles. A continuación explicare como diseñar clases en Visual Basic, véanla miren que la clase de ejemplo es un asistente ANIMADO el cual habla y todo que TAL!!!!!, y le puede ser muy útil. Tal vez cuando le hablan de clases se empiezan a imaginar un código complicado, enredado, y abstracto, bueno desde una perspectiva lo es; pero en Visual Basic la definición o la creación de una clase es muy sencilla, cuando dije desde una perspectiva es que las clases son complicadas en Lenguajes que Requieren del 100% de ellas, como por ejemplo Visual C++, JAVA, en estos las clases presentan muchas características que no se presentan en visual basic. Una clase no es nada mas que un Objeto, este objeto, tiene propiedades, funciones y métodos, ahora ustedes se preguntaran bueno esto mismo lo tienen presente los controles, entonces cual seria la diferencia entre un control y una clase, bueno para empezar la construcción de una clase no requiere de tanto "Protocolo" (ReadProperty, WriteProperty), ahora para la creación de propiedades si se utiliza Property Let y Property Get; la diferencia es casi nada, inclusive podría decir que una clase en visual basic, es casi lo mismo que un control, pero ahora nace una nueva pregunta, cuando utilizar un control y cuando utilizar una clase, bueno la opinión que voy a dar es desde mi perspectiva; yo usaría un control cuando quiere representar un objeto grafico en donde el usuario interactúa con él, y usuaria una clase para manipular la información interna de un programa, es decir normalmente una clase no suele ser una interfaz grafica, como por ejemplo, estaba visitando una pagina de Internet y vi una clase que manipula el DATAREPORT pero de una manera fenomenal, esta clase se le pasa la información a nivel de código y emite un reporte dependiendo de la información. Un ejemplo mas claro de clase, imagínense que están diseñando un programa matemático, este programa tiene una parte en donde dibuja una figura geométrica, muy bien podrían diseñar un control pero no seria lo adecuado PORQUE?, bueno porque yo veo a un control como un objeto que el usuario manipula, usa e interactúa con él, el usuario no va interactuar con un dibujo de una figura geométrica, entonces es aquí donde diseñaría una clase, que realizara todos los cálculos para dibujar una figura geométrica, la clases también ayudan a mantener un código ordenado, y poder reutilizarlo en cualquier aplicación. 11. Propiedades, Funciones y Eventos. Esto es exactamente igual que en los controles, pero tienen que tener un cuenta una cosa, que son las palabras PUBLIC y PRIVATE, cuando se diseña una clase tienen que tener cuidado cuando declaran funciones, métodos y variables, ya que ustedes tienen que saber que variable es privado y que variable es publica; una variable PUBLICA puede ser vista por aquellos quienes usen la clase y la PRIVADA no puede ser vista sino nada mas por la propia clase, cuando veamos el ejemplo se entenderá mejor. 12. Diseño de clase en Visual Basic Microsoft saco un programa llamado Microsoft Agent, este software permite realizar programas en cualquier lenguaje, colocando un asistente animado en 3D, parecido a los que observamos en OFFICE 2000, para la realización de esta clase es OBLIGATORIO tener los siguientes componentes instalados:
Si tienen el CD N.-3 de Visual Studio 6.0, metanse en la carpeta \Common\Tools\VB\MSAgent, en esa carpeta tienen el programa, la documentación y los CHARS ( o como yo les dijo Asistentes) o pueden bajar el programa que no ocupa mucho desde la pagina web www.microsoft.com/msagent, ahí podrá conseguir todo para el uso del agente (DIFERENTES Lenguajes de Habla, el programa actualizado y los 4 Chars que solamente hay en la actualidad que son: Merlín, Genie, Peedy, Robby). Cuando instale el programa podrá notar que los Chars se instalan en la Carpeta de WINDOWS/MSAGENT/CHARS, esto es importante cuando establezcamos la ubicación a nivel de código. Bueno suponiendo que ya tienen instalado todo esto, empecemos, esta clase puede ser muy útil para desarrollar programas animados o que requieren un asistente el cual van a ver que tiene muchas funciones y facilidades. Para empezar ejecutemos el programa Visual Basic y cuando le aparezca la ventana "NUEVO PROYECTO" igual a la figura n.2, seleccionen el icono "DLL Activex", y le dan Doble Click. Verán que le aparece un modulo de clase y en este caso cuando se compila no genera un OCX como el control sino un DLL. Y se ven los eventos de la clase notaran que nada mas hay INITIALIZE Y TERMINATE (QUE COMODIDAD). Bueno lo primero que tienen que tomar cuenta es que a la clase no se le pueden añadir controles, como verán no se presenta ningún formulario, y ni siquiera el fondo gris como el control, señores, aquí todo es a nivel de CODIGO, así que prepárense. 13. Creación de la Clase "ASISTENTE" Antes de empezar a codificar tenemos que hacer Referencia a una librería, así que sigan estos pasos:
Bueno empecemos, para comenzar llamen a la clase "Asistente" y declaramos nuestras primeras variables que serán las siguientes: Private WithEvents agnAsistente As Agent Private iaCargaAsistente As IAgentCtlCharacterEx Private Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long Notaran que la es declarado PRIVADA ya que estas variables solamente pueden ser vista por la CLASE y no por el programa. La primera variable es el objeto de Microsoft Agent, este objeto es necesario para invocar al asistente. Verán que hay una palabra que puede ser nueva para ustedes que es WITHEVENTS; si tuviésemos un formulario no tendríamos que poner esta línea de código, ya que Agent es un control, que con tan solo llamarlo y colocarlo en el formulario basta para acceder a sus propiedades, métodos, funciones y eventos, pero como esto es una clase y no podemos poner un control; si yo declarara la variables de esta manera Private agnAsistente As Agent, sin el WITHEVETNS, tendría acceso a las propiedades, métodos y funciones, PERO NO! A los eventos, para tener acceso a los eventos hay que colocar WITHEVENTS, por que resulta que si lo añadiera como un control en un formulario, cuando arranca el programa, el formulario se encarga de cargar todos los eventos, propiedades, etc, de ese control, pero como aquí todo es a nivel de código hay que ser un poco mas explicito. La segunda variable es la que vamos a usar para manipular al CHARS o Asistente, con este objeto podremos moverlo, animarlo, etc. Y la tercera variable es un API de Windows lo cual explicare cuando la utilicemos, nada mas le adelanto que esta API nos permite conocer el nombre del directorio en donde esta grabado WINDOWS. Continuamos, vamos a declara ahora todas las variables que vamos a usar en el programa: Enum Idioma ‘ Variable que nos permite saber el idioma en que hablara el CHAR EnglishUS = &H409 EnglishGB = &H809 French = &H40C Italian = &H410 Portuguese = &H816 Spanish = &HC0A End Enum Enum Muñeco ‘ Variable que no permite seleccionar que CHAR se ejecutara Genie = 0 Merlin = 1 Robby = 2 Peedy = 3 End Enum Enum Accion ‘ Las diferentes animación de los CHAR Acknowledge Alert Announce Blink Confused Congratulate Decline DoMagic1 DoMagic2 DontRecognize Explain GestureDown GestureLeft GestureRight GestureUp GetAttention GetAttentionContinued GetAttentionReturn Greet Hearing_1 Hearing_2 Hearing_3 Hide Idle1_1 Idle1_2 Idle1_3 Idle1_4 Idle2_1 Idle2_2 Idle3_1 Idle3_2 LookDown LookDownReturn LookLeft LookLeftReturn LookRight LookRightReturn LookUp LookUpReturn MoveDown MoveLeft MoveUp MoveRight Pleased Process Processing Read ReadContinued Reading ReadReturn RestPose Sad ShowA Search Searching StartListening StopListening Suggest Surprised ThinkW Thinking Uncertain Wave WriteA WriteContinued WriteReturn Writing End Enum Dim intAccion As Integer ‘ Determina que accion esta activo y lista para ejecutar Dim strWindows As String ‘ Determina la carpeta donde esta instalado WINDOWS Dim strMuñeco As String ‘ Determina que muñeco fue elegido por el usuario Dim bytInicio As Byte ‘ Indica si hay un Muñeco activo Dim Array_Accion(1 To 67) As String ‘ Lista de todas las acciones del CHAR Dim bolBalloon As Boolean ‘ Determina se presenta un BALLON para presentar el texto (EL BALLON es como el globo que aparece en las tiras cómicas donde se escribe el mensaje) Dim bolAutoHide As Boolean ‘ Determina si se esconde el BALLON cuando termina de presentar el mensaje Dim bolAutoSpace As Boolean ‘ Determina el espacio entre las frases Dim bolSonido As Boolean ‘ Determina si las animaciones presentaran sonidos El uso de la variable lo pueden ver en el comentario que les coloco al lado. Recomiendo que antes de entrar mas al programa se lean un poco la documentación del Microsoft Agent, ya que lo que viene ahora es mas CODIGO que explicación, recuerden estoy explicando CLASES no AGENT. Ahora en el evento Initialize de la clase "Asistente" coloque este código: Private Sub Class_Initialize() Set agnAsistente = New Agent Carpeta_Windows bytInicio = 0 bolAutoSpace = True bolAutoHide = True bolBalloon = True Array_Accion(1) = "Acknowledge" Array_Accion(2) = "Alert" Array_Accion(3) = "Announce" Array_Accion(4) = "Blink" Array_Accion(5) = "Confused" Array_Accion(6) = "Congratulate" Array_Accion(7) = "Decline" Array_Accion(8) = "DoMagic1" Array_Accion(9) = "DoMagic2" Array_Accion(10) = "DontRecognize" Array_Accion(11) = "Explain" Array_Accion(12) = "GestureDown" Array_Accion(13) = "GestureLeft" Array_Accion(14) = "GestureRight" Array_Accion(15) = "GestureUp" Array_Accion(16) = "GetAttention" Array_Accion(17) = "GetAttentionContinued" Array_Accion(18) = "GetAttentionReturn" Array_Accion(19) = "Greet" Array_Accion(20) = "Hearing_1" Array_Accion(21) = "Hearing_2" Array_Accion(22) = "Hearing_3" Array_Accion(23) = "Hide" Array_Accion(24) = "Idle1_1" Array_Accion(25) = "Idle1_2" Array_Accion(26) = "Idle1_3" Array_Accion(27) = "Idle1_4" Array_Accion(28) = "Idle2_1" Array_Accion(29) = "Idle2_2" Array_Accion(30) = "Idle3_1" Array_Accion(31) = "Idle3_2" Array_Accion(32) = "LookDown" Array_Accion(33) = "LookDownReturn" Array_Accion(34) = "LookLeft" Array_Accion(35) = "LookLeftReturn" Array_Accion(36) = "LookRight" Array_Accion(37) = "LookRightReturn" Array_Accion(38) = "LookUp" Array_Accion(39) = "LookUpReturn" Array_Accion(40) = "MoveDown" Array_Accion(41) = "MoveLeft" Array_Accion(42) = "MoveUp" Array_Accion(43) = "MoveRight" Array_Accion(44) = "Pleased" Array_Accion(45) = "Process" Array_Accion(46) = "Processing" Array_Accion(47) = "Read" Array_Accion(48) = "ReadContinued" Array_Accion(49) = "Reading" Array_Accion(50) = "ReadReturn" Array_Accion(51) = "RestPose" Array_Accion(52) = "Sad" Array_Accion(53) = "Search" Array_Accion(54) = "Searching" Array_Accion(55) = "Show" Array_Accion(56) = "StartListening" Array_Accion(57) = "StopListening" Array_Accion(58) = "Suggest" Array_Accion(59) = "Surprised" Array_Accion(60) = "Think" Array_Accion(61) = "Thinking" Array_Accion(62) = "Uncertain" Array_Accion(63) = "Wave" Array_Accion(64) = "Write" Array_Accion(65) = "WriteContinued" Array_Accion(66) = "WriteReturn" Array_Accion(67) = "Writing" End Sub Aquí hay una línea de código que es importante explicarle que es: Set agnAsistente = New Agent Cuando nosotros declaramos un objeto: Dim Nombre_del_Objeto as Objeto En nuestra clase el ejemplo es: Private WithEvents agnAsistente As Agent El objeto agnAsistente todavía no se ha inicializado, es decir no esta en memoria, para iniciarlo o activarlo hay que hacer lo que se llama una referencia al objeto esto se logra de esta manera: Set agnAsistente = New Agent Es aquí cuando el objeto se inicializa en la memoria, si ustedes no hacen esto cuando vayan a usar el objeto para cualquier utilidad, Visual Basic les indicara un error, de que "la variable no ha sido establecida", esto es porque se "DECLARO", pero no se inicializo, para inicializarla tienen que escribir la línea antes expuesta, NOTA: Esto solo se hace cuando se hacen referencias a OBJETOS. Vamos ahora a declarar las propiedades, para eso escriban lo siguiente: Public Property Get Sound() As Boolean Sound = bolSonido End Property Public Property Let Sound(ByVal NuevoValor As Boolean) iaCargaAsistente.SoundEffectsOn = NuevoValor End Property Public Property Get Balloon() As Boolean Balloon = bolBalloon End Property Public Property Let Balloon(ByVal NuevoValor As Boolean) bolBalloon = NuevoValor If bolBalloon Then iaCargaAsistente.Balloon.Style = iaCargaAsistente.Balloon.Style Or 1 Else iaCargaAsistente.Balloon.Style = iaCargaAsistente.Balloon.Style And 0 End If End Property Public Property Get AutoHide() As Boolean AutoHide = bolAutoHide End Property Public Property Let AutoHide(ByVal NuevoValor As Boolean) bolAutoHide = NuevoValor If bolAutoHide Then iaCargaAsistente.Balloon.Style = iaCargaAsistente.Balloon.Style Or 4 Else iaCargaAsistente.Balloon.Style = iaCargaAsistente.Balloon.Style And -5 End If End Property Public Property Get AutoSpace() As Boolean AutoSpace = bolAutoSpace End Property Public Property Let AutoSpace(ByVal NuevoValor As Boolean) bolAutoSpace = NuevoValor If bolAutoSpace Then iaCargaAsistente.Balloon.Style = iaCargaAsistente.Balloon.Style Or 8 Else iaCargaAsistente.Balloon.Style = iaCargaAsistente.Balloon.Style And -9 End If End Property Private Sub agnAsistente_Command(ByVal UserInput As Object) If UserInput.Name = "Opciones" Then agnAsistente.PropertySheet.Visible = True End If End Sub Esto ya ustedes lo deben de saber de memoria, ya que es lo mismo que en los controles, con la diferencia que aquí los propiedades las vemos a nivel de código y no a nivel de diseño. Ahora introduzcan los siguientes métodos y la única función de la Clase: Public Sub Show(ByVal LenguajeID As Idioma, ByVal GUIA As Muñeco) Select Case GUIA Case 0 strMuñeco = "genie" Case 1 strMuñeco = "merlin" Case 2 strMuñeco = "peedy" Case 3 strMuñeco = "robby" End Select If bytInicio = 1 Then Unload End If agnAsistente.Characters.Load "CharacterID", strWindows & "msagent\chars\" & strMuñeco & ".acs" Set iaCargaAsistente = agnAsistente.Characters("CharacterID") iaCargaAsistente.Commands.Add "Opciones", "&Opciones Avanzadas" iaCargaAsistente.LanguageID = LenguajeID iaCargaAsistente.Show iaCargaAsistente.Left = Screen.Width \ 15 - iaCargaAsistente.Width - 50 iaCargaAsistente.Top = Screen.Height \ 15 - iaCargaAsistente.Height - 50 bytInicio = 1 End Sub Public Sub Unload() ‘ Metodo utilizado para quitar el CHAR agnAsistente.Characters.Unload "CharacterID" End Sub Public Sub Speak(ByVal strOracion As String) ‘ Metodo utilizado para HABLAR iaCargaAsistente.Speak strOracion End Sub Public Sub Think(ByVal strOracion As String) ‘ Metodo utilizado para PENSAR iaCargaAsistente.Think strOracion End Sub Public Sub Move(x As Integer, y As Integer) ‘ Metodo para mover el Char iaCargaAsistente.MoveTo x, y End Sub Public Sub Action(accNombre As Accion) ‘ Metodo para ejecutar una accion del Char iaCargaAsistente.Play Array_Accion(accNombre + 1) End Sub Private Sub Carpeta_Windows() ‘ Metodo para localizar la carpeta de WINDOWS Dim Temp As String Dim Ret As Long Const MAX_LENGTH = 145 Temp = String$(MAX_LENGTH, 0) Ret = GetWindowsDirectory(Temp, MAX_LENGTH) Temp = Left$(Temp, Ret) If Temp <> "" And Right$(Temp, 1) <> "\" Then strWindows = Temp & "\" Else strWindows = Temp End If End Sub Public Function Animations(ByVal indice As Integer) as String ‘ Metodo para extraer el nombre de las animaciones Animations = Array_Accion(indice) End Function Public Sub Stop_Asistente() ‘ Metodo que frena cualquier animiacion del CHAR cuando se ejecuta una animación continua iaCargaAsistente.Stop iaCargaAsistente.Play "RestPose" End Sub Bueno señores, estamos listo, ahora vamos a probar nuestra clase, noten que volvemos a usar el SET: Set iaCargaAsistente = agnAsistente.Characters("CharacterID") Recuerden que iaCargaAsistente nada mas se declaro y no se Referencio, bueno aquí es donde la estamos inicializando., Los métodos declarados son sencillos, lo que tienen es que documentarse un poco sobre como funciona el Microsoft Agent, después de eso, es fácil entender el código, y ni siquiera con tan solo ver el código ya se puede suponer para que sirve cada instrucción que usamos. La única que se puede ver un poco extraña es el método "Carpeta Windows", este método establece el nombre de la carpeta donde fue grabado Windows, recuerden que mencione que el MS Agent, se instala en la carpeta de Windows, y nos es lo mismo el nombre en Windows 95/98 (C:/Windows) que NT/2000 (C:/WINNT), esa es la razón del porque es importante ubicar la carpeta de Windows. Vamos a añadir un formulario en el proyecto donde tenemos nuestra clase, y en el formulario van a colocar un TextBox, 3 Botones, y un listabox. En la parte de Declaraciones coloquen las siguiente línea de código: Dim asis As New Asistente Este es una forma de simplificar estas dos lineas en una sola: Dim asis as Asistente Set asis = New Asistente Y en el evento click del botón (command1) colocan: Private Sub Command1_Click() asis.Show Spanish, Merlin End Sub NOTA: verán que cuando le dan a espaciadora después de escribir Show, se le mostrara una lista con las diferentes opciones del lenguaje y luego una lista de las CHARS que se pueden elegir, eso sucede debido a que declaramos las variables de tipo ENUM sino no!!, no aparecieran. NOTA 2: Merlín es un Char el cual yo supongo que ustedes ya lo tienen instalado, si tienen otro cambien el nombre por el que tienen, y el idioma también supongo que la tienen instalado, aunque el idioma no afecta el funcionamiento de CHARS, sino afecta cuando el muñeco vaya a hablar. Ahora para arrancar nuestro formulario sigan estos pasos:
Ahora ejecuten el proyecto y denle click al botón Command1 verán que le aparece el CHARS en la esquina inferior derecha, IMPRESIONANTE NO!!. Salgan del formulario. En el evento clic del Command2 coloquen: Private Sub Command2_Click() asis.Speak text1.Text End Sub Y en el Command3: Private Sub Command3_Click() asis.Think text1.Text End Sub Ejecuten el programa y coloquen en el TEXTBOX que esta en el formulario "HOLA", sin las comillas por supuesto. Y denle click primero al botón Command1 para que se cargue el Asistente o Char, luego denle al botón Command2 y verán que el CHARS habla lo que ustedes escribieron en el TEXTBOX, (eso si configuraron el idioma), y si le dan al botón Command3 el CHARS no hablara pero si mostrara el Texto, esto es porque ahí esta PENSANDO (THINK) y no HABLANDO (SPEAK). Ahora vamos a ver las animaciones que tienen los CHARS: Para ello agrega en el evento LOAD del formulario lo siguiente: Private Sub Form_Load() For i = 1 To 67 List1.AddItem asis.Animations(i) Next End Sub Y en el evento DobleClick del control List1 agreguen lo siguiente: Private Sub List1_DblClick() asis.Action List1.ListIndex End Sub Y agrega dos botones Command4 y Command5 y en el evento Clic de cada uno coloca lo siguiente: Private Sub Command4_Click() asis.Move 150, 150 End Sub Private Sub Command5_Click() asis.Stop_Asistente End Sub Ahora ejecuten el proyecto verán que el cuadro List1 se lleno con las diferentes animaciones del CHAR ahora denle click a Command1, luego denle DobleClick a las diferentes animaciones que están en el List1 y verán como el CHAR se empieza a mover, después que maten su curiosidad denle Click a el Command4 para que vean como se mueva el CHAR de un sitio a otro. Bueno señores, esto es toda la clase OBVIAMENTE, no esta lo suficientemente SÓLIDA, que quiero decir con esto, ahora ustedes le tienen que acomodar los detalles, como por ejemplo si le dan al botón Command2 sin escribir nada el CHAR les lanza un error ya que no acepta cadena NULLSTRING, o si le dan a cualquiera de las animaciones o le dan a los botones Command2, Command3 y Command4, antes de cargar el asistente también les dará un error, quedara de tarea para ustedes si consideran útil esta clase en acomodar esos pequeñísimos detalles. Ahora vamos a dar los pasos para compilar una clase:
Dim Variable as Asistente En Load del formulario: Set Variable = New Asistente Asistente es el nombre que le dimos a nuestra clase. Bueno espero que le sea útil, lo que aprendieron con este curso FLASH sobre controles y clases, en realidad esto dos temas son muchos mas amplios pero aquí logre enfocarme en lo básico, ya los que le queda a ustedes es empezar a echar código, es importante, por que algunos se preguntaran PARA QUE APRENDER ESTO, con estas dos técnicas CONTROLES y CLASE desarrollamos códigos mas fácil de mantener, mas legibles, y la hora de conseguir una falla resulta mas rápido, estas técnicas nos ayudan a perfeccionar e idear nuevas técnicas que pueden beneficiar tanto a ustedes como a muchas personas, si poseen imaginación les aseguro que no habrá limite para la creación de nuevo objetos. CATEGORIA:PROGRAMACION. Trabajo enviado y realizado por: Publicación enviada por Eduardo Roa Contactar mailto:eduroam@hotmail.com Código ISPN de la Publicación EpZVVyluEkDsEvheJY Publicado Saturday 31 de January de 2004 Ultimas Publicaciones en ilustrados.com
ilustrados.com nace con el fin difundir el conocimiento publicando trabajos de investigación, monografias, tesis, presentaciones powerpoint y afines. Publicar trabajos en ilustrados.com ha alcanzado prestigio y reconocimiento internacional siendo cada vez más el número de académicos, empresas, investigadores, científicos que consultan las publicaciones de nuestro portal. | |||||||||