| 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:
- O le dejamos así, y quedara en ustedes programadores diseñar una forma de restringir la entrada a nivel de diseño
- O Hacer que esta propiedad funcione nada mas a nivel de ejecución y no de diseño.
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.
Bueno esto tiene su pro y sus contra; por ejemplo si nosotros tenemos una variable:
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......
>> Ver
siguiente capitulo
|