Unos correos del 2001 interesantes sobre activex.


abemos que un buen programador o equipo de programadores no reinventan el hilo negro cada rato. Para poder llevar un control de lo que se ha hecho, es comun que usemos partes de nuestros programas anteriores. Si bien era común que se usara el modo de cortar y pegar hasta 1990, cuando se popularizó el uso de Turbo Pascal, de Borland, se le dio difusión a la idea «aparentemente» nueva de encapsular los procesos usandolos en varios proyectos, en versión compilada. Estos trozos reutilizables y NO MODIFICABLES POR TERCEROS de código, eran llamados units, o unidades, y eran muy parecido a lo que hacía C, pero se manejaba desde dos puntos de vista:

Interfase >( Rutinas publicas a otros proyectos )
Implementation ( Rutinas internas a este proyecto )
Junto con la implementación de un sistema llamado de «tipos fuertes», esto provocó que Turbo Pascal se hiciera un favorito en su tiempo, y ahora es un lenguaje gratuito en la versión 5.5 y esta disponible en el mismo sitio de Borland, o en la sección de archivos del grupo.

Con el paso del tiempo Clipper tuvo que crear una versión similar, creandose las llamadas Librerías, que permitian lo mismo solo que todos los procesos eran interfase, es decir, publicos. Aqui se dieron las primeras posibilidades reales de integración multilenguaje, entre MASM, TASM, C estandar microsoft, y clipper / dbase. Cabe destacar que una ventaja extra de estas librerías de CLipper era que podian usarse en diversas versiones del compilador y en cierta medida por otros lenguajes, mientras que las librerías de TP eran unicas para version de compilador, una librería 5.5 no funcionaba con 6, por ejemplo. Estos son los archivos LIB, que reconocerán los que usan librerías de terceros, como CATOOLS, FASTLIB, o mi propia CADMUS, UNIT.

Las dos principales diferencias de las versiones actuales de Visual Basic contra las versiones de QBASIC o BASICA, son los llamados tipos fuertes, que veremos mas adelante, y la posibilidad de crear procesos publicos y privados.

Todos sabemos que podemos crear functions y subs, que devuelven y no respectivamente un resultado. Los famosos archivos BAS que vemos en los proyectos, son librerías de SUB y FUNCTION, que son publicas a todo el proyecto. Sin embargo, estas rutinas deberían ser lo suficientemente generales y bien diseñadas para poder usarse en varios proyectos. Por lo general los sistemas realmente pesados que suelo hacer en VB, tienen tres modulos:

proyecto.bas ( por ejemplo, perfum.bas, inv_equipo.bas ) donde guardo el código que solo sirve para este proyecto por ser demasiado específico.
reporte.bas Aquí guardo el codigo que genera todos los reportes de este proyecto. No hay confusion de nombres porque cada proyecto tiene su directorio.
clasific.bas Las rutinas generales que no he enlazado en una clase.
Vamos a suponer que ya tenemos una serie de procesos que podemos usar en otros programas y queremos volverlos un control. Vamos a suponer que no tienen que ver con los controles que estan en ningun formulario, es decir, vamos a suponer que no tenemos ninguna llamada tipo

Form1.Caption=»Este es el nombre de mi programa»
Para este caso usaré tres rutinas que uso mucho en mis proyectos, y que son «hijas» de CLipper. Cada una de ellas se parece a una orden de clipper, pero es su versión en VB.:

Taller:

Crear un nuevo modulo de VB al que le pondremos clipper.bas, y pondremos dentro este código:

option explicit
Public Function strtran(ByVal origen As String, anterior As String, nuevo As String)
Dim posicion As Integer
Dim cadpaso As String
Do
posicion = InStr(origen, anterior)
If posicion = 0 Then Exit Do
cadpaso = Left(origen, posicion – 1) & nuevo
cadpaso = cadpaso & Right(origen, Len(origen) – (posicion + Len(anterior)) + 1)
origen = cadpaso
DoEvents
Loop
strtran = origen
End Function
Public Function Padl(ByVal cadena As String, ByVal largo As Byte) As String
If Left(cadena, 5) = «- » Then cadena = Trim(Right(cadena, Len(cadena) – 5))
If largo >= Len(cadena) Then ‘ no simplificar
Padl = String(largo – Len(cadena), » «) & cadena
Else
Padl = cadena
End If
End Function
Public Function Padr(ByVal cadena As String, ByVal largo As Byte) As String
If Len(cadena) > largo Then cadena = Left(cadena, largo)
Padr = cadena & String(largo – Len(cadena), » «)
End Function
Public Function Padc(ByVal cadena As String, ByVal largo As Byte) As String
If Len(cadena) > largo Then
Padc = cadena
Else
Do Until Len(cadena) = largo
cadena = cadena & » »
If Len(cadena) = largo Then Exit Do
cadena = » » & cadena
Loop
End If
Padc = cadena
End Function
Una vez que tenemos hecho lo anterior, podríamos utilizar este archivo con atributo de solo lectura, en varios proyectos. Porque de solo lectura? Porque lo que se tiende a hacer es o cortar y pegar, o modificarlo directamente. Un problema de modificar directamente en cada proyecto un modulo ( que asi se llaman los archivos BAS ), es que podemos terminar con muchas versiones ligeramente distintas del proceso, o peor aun, con versiones que no funcionan en todos los sistemas. Me tocó ver una empresa con quince programas que comercializaban, todos con su grales.bas, proc.bas, y func.bas… pero a veces completamente diferentes entre un proyecto y otro.

Otro problema que podemos tener es lo engorroso que resulta reutilizar un archivo bas en diferentes proyectos, si usamos Source Safe o si otros programadores tienen acceso a el. Una de las escenas mas hilarantes y deprimentes al mismo tiempo que me tocó ver, fue un pleito entre dos programadores que por orden de su jefe inmediato estaban haciendo un sistema entre los dos, pero cuando uno modificaba el codigo, el del otro programador ya no funcionaba. Todos conocemos casos así, no ? Sin embargo, un control o librería o Unit compilada, o el equivalente en cada lenguaje, puede crear una gran uniformidad de código. Desde el punto de vista de los datos, el objetivo que se tiene es tener una sola tabla de usuarios que usen todos los sistemas de la empresa, y no que cada programador o programa tenga su propia tabla de usuarios.

Sin embargo, en lo que reunimos la cantidad adecuada de rutinas, Y LAS PROBAMOS, los modulos son una alternativa viable, que mas adelante podremos convertir a clases y controles, conservando las ventajas, ganando otras, pasando a una sola desventaja.