Controles de interfaz de usuario en Visual Basic 6 y Visual Basic 2005

Visual Studio 2005

3 de Mayo de 2006

Publicado: Enero de 2006

Una comparación en paralelo

Bill Sempf

Se aplica a:
Visual Basic 6
Visual Basic 2005
Visual Studio 2005

Resumen:conversión de controles de interfaz de usuario de Visual Basic 6 a Visual Basic 2005 de manera fácil y eficaz. (10 páginas impresas.)

En esta página

Introducción Introducción
Integración de controles de usuario Integración de controles de usuario
Trabajar con controles ActiveX y bibliotecas de controles de Windows Trabajar con controles ActiveX y bibliotecas de controles de Windows
Actualización de controles de OCX, DLL y de terceros Actualización de controles de OCX, DLL y de terceros
Cómo avanzar Cómo avanzar

Introducción

En el mundo de la conversión de las aplicaciones de Visual Basic 6, lo más complicado son los controles que no se pueden convertir. Entre los controles internos de los proyectos para los cuales se tiene el código fuente, los controles ActiveX personalizados adquiridos en 1997 y los controles Microsoft integrados que no tienen ruta de conversión real, la tarea no es fácil.

Sin embargo, hay esperanzas. El código de los controles de usuario de Visual Basic 6 se convierte fácilmente a Visual Basic 2005. Puede utilizar algunos controles de terceros vía interoperabilidad. En Visual Studio 2005 se incluyen herramientas que brindan ayuda para la creación de proxy de OCX. No todo está perdido.

Integración de controles de usuario

El problema principal es que Microsoft ajustó ligeramente los controles de usuarios. Gracias al uso de la herencia, podemos definir un Control de usuario como una colección de controles que extiende la idea de los controles. En Visual Basic 6, el Control de usuario sólo era un formulario que podía alojarse dentro de otro formulario.

Afortunadamente, Visual Basic 2005 realizó un cambio fantástico. Gran parte de él no resulta visible, pero incluso la sutil configuración es muy bien abordada por el Asistente de actualización de Visual Basic 6. Permítanme mostrarles a qué me refiero.

Traslado de un proyecto de Visual Basic 6 con controles de usuario a Visual Basic 2005

Diseñé un pequeño control de usuario en Visual Basic 6 que sólo implementa tres cuadros de texto para permitir el ingreso de un número de seguridad social estadounidense. Luego, ejecuto algunos trucos, defino algunas configuraciones para ver cómo se comporta el asistente.

Figura 1. El control SSN de Visual Basic 6

Utilizo el evento TextChanged para tabular automáticamente los cuadros de texto cuando tienen el número correcto de caracteres. Lo alojo en un formulario simple que acaba de mostrar el resultado en un cuadro de mensaje y lo ejecuto mediante el asistente de conversión. Es verdaderamente un proceso directo: sólo abro el proyecto de Visual Basic 6 mediante el elemento de menú Archivo -> Abrir proyecto en Visual Studio 2005.

Me complace señalar que Visual Basic 2005 pudo manejarlo muy bien. El asistente creó correctamente el formulario y el control de usuario en formato de Visual Basic 2005. Hasta se agregó un ToolTip ExtenderProvider, para admitir la propiedad ToolTip, que los controles TextBox y las instancias de los controles de usuario poseen en forma predeterminada en Visual Basic 6.

Lista 1. Comparación de código para las dos versiones

Código de Visual Basic 6

Private Sub Three_Change()
    If Len(Three.Text) = 3 Then
        Two.SetFocus
    End If
End Sub

Private Sub Two_Change()
    If Len(Two.Text) = 2 Then
        Four.SetFocus
    End If
End Sub

Public Property Get SocialSecurityNumber()
    SocialSecurityNumber = Three.Text & _
       "-" & Two.Text & "-" & Four.Text
End Property

Código de Visual Basic 2005

Option Strict Off
Option Explicit On
Friend Class UserControl1
  Inherits System.Windows.Forms.UserControl
   
  Private Sub Three_TextChanged(ByVal eventSender As _ 
    System.Object, ByVal eventArgs As System.EventArgs) _
    Handles Three.TextChanged

    If Len(Three.Text) = 3 Then
      Two.Focus()
    End If
  End Sub
   
  Private Sub Two_TextChanged(ByVal eventSender As _
    System.Object, ByVal eventArgs As System.EventArgs) _
    Handles Two.TextChanged

    If Len(Two.Text) = 2 Then
      Four.Focus()
    End If
  End Sub
   
  Public ReadOnly Property _
      SocialSecurityNumber() As Object
    Get
      SocialSecurityNumber = Three.Text & _
        "-" & Two.Text & "-" & Four.Text
    End Get
  End Property

El código casi no sufrió alteraciones, pero no ejecuté ninguna acción demasiado compleja. Después de todo, todo lo que queremos hacer aquí es comprobar si los controles de usuario se convierten. El único problema fue la aparición de una advertencia global que señalaba "Es necesario volver a generar los UserControl después de actualizar". Algo coherente, pero de todas maneras verifiqué el archivo de ayuda.

Resulta que los controles alojados se compilaron en tiempo real en Visual Basic 6 (¿recuerda haber tenido que cerrar una ventana cada vez que realizó un cambio?) y ese no es el caso de Visual Basic 2005. Sólo genere la solución antes de utilizarla.

Lo que no funciona son las matrices de controles. Como habrá observado no las utilicé en mi ejemplo, a pesar de que habría sido un buen momento para ello, pero no lo recomiendo. Al trabajar con controles simples, lo que no debe hacer es enredarse con el uso de una matriz de controles. ¿Por qué? No hay sistema complementario en .NET. El concepto se retiró de manera definitiva.

ASP.NET: un mundo totalmente distinto

Si usted ha desarrollado sus propios controles de usuario de Visual Basic, la conversión debería funcionar sin problemas. No probé cada parte del lenguaje de Visual Basic como parte de este ejemplo, pero, al parecer, el código de control no causa muchos problemas.

No se puede decir lo mismo respecto a los controles de usuario de ASP.NET. Son parte de una arquitectura totalmente distinta y el asistente de conversión de Visual Basic 6 no puede manejarlos. De hecho, no existe una función correspondiente en ASP3 para convertir a ASP.NET, lo que tiene sentido.

La inquietud que escucho más a menudo es la posibilidad de usar un control de servidor de Windows en un entorno de Web, de la misma forma que se pueden utilizar algunos controles de ActiveX en Visual Basic 6 o en un entorno de ASP 3. Aquello ya no ocurre. Debido a que es posible utilizar ActiveX en ASP.NET como se hacía en ASP3, esta opción aún está disponible. Los controles de Windows no se ejecutan en ASP.NET y los controles de ASP.NET no se ejecutan en las aplicaciones de Windows Forms.

Trabajar con controles ActiveX y bibliotecas de controles de Windows

Las bibliotecas de controles de Windows son bibliotecas de clases que contienen colecciones de controles en Visual Basic 2005. Son lo más parecido a un control ActiveX destinado a Windows Form que tiene Visual Basic 2005. El concepto de un archivo ejecutable en un formulario Web es algo de lo que debe tratar de alejarse. Es mejor utilizar ClickOnce e implementar una aplicación de Windows Forms.

En esa línea, cuando convierte un control ActiveX a Visual Basic 2005, usted obtiene una biblioteca de controles de Windows. Esto puede sorprender a quienes estamos acostumbrados a Visual Basic y esperamos que los controles ActiveX sean principalmente para el Web. El hecho es que, un control ActiveX es sólo un archivo ejecutable que revela ciertas propiedades en cualquier contenedor. .NET Framework, con su modelo de herencia, ofrece un poco más de control, para que tengamos una biblioteca de controles de Windows.

Traslado de un proyecto de control de usuario de ActiveX a Visual Basic 2005

El control del número de seguridad social que diseñé como control de usuario en el proyecto anterior se trasladó a un proyecto de control de ActiveX y se ejecutó a través del asistente de actualizaciones. Me complace informar que funcionó tan bien como el ejemplo anterior; este modelo no tiene problemas. Tengo un archivo .VB que se compila en una Biblioteca de clases.

Figura 2. El control en el cuadro de herramientas

De hecho, como puede apreciar en la figura 2, Visual Studio agregó el control a otros proyectos en la solución. Es un proceso de arrastrar y soltar, tal como los controles integrados.

Actualización de controles de OCX, DLL y de terceros

Usted tiene un control que adquirió en 1997 y el desarrollador ya no está disponible. ¿Qué hacer?

No todo está perdido. Debido a que no tiene el código fuente, no puede realizar una conversión como la descrita antes en este documento. Puede utilizar las herramientas integradas para generar en forma automática un proxy de .NET para una clase COM, una experiencia más común de lo que puede pensar, o hacer algo como lo que acabamos de realizar y crear un contenedor de COM para dicha DLL de control de .NET.

Uso de un control compilado de Visual Basic 6 en Visual Basic 2005

En algunas ocasiones, no hay acceso a la fuente. A veces encuentra un control Visual Basic 6 normal que no funciona en Visual Basic 2005. En esos momentos es cuando debe esperar poder crear un Contenedor que se pueda llamar en tiempo de ejecución.

El problema es que, al igual que al colocar una tarjeta de red antigua en un equipo nuevo, no existe forma de saber si funcionará hasta intentarlo. Los controles ActiveX implementan partes más antiguas de las bibliotecas de Win32 para realizar procesos; a veces se trata de partes de la biblioteca que ya no están en .NET ni en el sistema operativo que utiliza.

Si convierte una aplicación con controles antiguos que se ejecuta actualmente en un sistema antiguo, lo primero que debe hacer es tratar de instalarla en un sistema más nuevo. Incluso, si no planea utilizar el sistema en Visual Basic 6, debe probarlo si desea reutilizar alguno de los controles. Le dará una idea de los problemas de compatibilidad que tendrá más adelante.

El control sobre el cual más escucho hablar es el control del explorador Web de Visual Basic 6. Sin embargo, existe un nuevo control WebBrowser en Visual Basic 2005, que resuelve el problema. De hecho, existen muchos nuevos controles en Visual Basic 2005 que se traducen bien a los controles de Visual Basic 6 que todos extrañamos, en especial el control SerialPort, el cual reemplaza a mscomm. También existen otros en el área del diseño:

  • SoundPlayer

  • DataGridView

  • SplitContainer

  • MaskedTextBox

  • ToolStrip

En un esfuerzo por probar y buscar un control COM que no tuviera un ensamblado .NET, opté por el control de ShockWave Flash, que también tendrá si ha instalado Flash Web Player en el sistema. No hay ensamblado .NET para dicho control aún y sirve como un buen ejemplo de actualización. La pregunta es ¿podrá el asistente de actualización encontrar una forma de convertirlo?

Figura 3. El explorador Flash

Diseñé una aplicación de Visual Basic 6 simple con el control OCX de Shockwave Flash (completado con un flash de página de barra del cliente en la figura 4), un cuadro de texto y un botón y la convertí a Visual Basic 2005.

Como era de esperarse, el asistente de conversión de Visual Basic 6 convirtió sin problemas el componente y creó una interoperabilidad .NET del control. Ax se agregó al nombre de interoperabilidad para mostrar que se trata de un control alojado en ActiveX, el cual ahora deriva de System.Windows.Forms. Estos son los controles a los cuales hace referencia mi proyecto después de la conversión y limpieza:

  • AxInterop.ShockwaveFlashObjects (copiado en forma local)

  • System (en la caché de ensamblados global)

  • System.Drawing (en la caché de ensamblados global)

  • System.Windows.Forms (en la caché de ensamblados global)

Es posible convertir un control de la misma forma que lo hace el asistente de conversión mediante un aximp. Aximp utiliza la clase System.Web.Forms.AxHost como proxy entre el control ActiveX y el contenedor de Windows Forms. Si revisa el manifiesto del nuevo ensamblado de ShockwaveFlashObjects, puede apreciar que verdaderamente deriva de AxHost.

.assembly AxInterop.ShockwaveFlashObjects
{
  .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() 
  .custom instance void [System.Windows.Forms]System.Windows.Forms.AxHost/TypeLibraryTimeStampAttribute::.ctor(string) 
  .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32)  .hash algorithm 0x00008004
  .ver 1:0:0:0
}

Puede ejecutar aximp con la línea de comandos:

aximp c:\Windows\System32\Macromed\Flash\flash.ocx

AxHost ajusta los controles ActiveX y los revela como controles con características completas de Windows Forms. No es una clase que se utilice directamente, sino que se utiliza a través de un aximp para generar estos proxy que apreciamos. Se trata de algo así como la pieza Lego que traduce la interfaz de ActiveX a la interfaz de Windows Forms.

Si revisa los miembros, puede ver que las propiedades se derivan en gran parte de la clase Control. El objetivo de la clase AxHost es modificar el modelo Win32 y traducir las propiedades a .NET. Programación orientada a objetos de larga vida.

Cómo avanzar

Nadie cree que Visual Basic 6 está a punto de despedirse. Tengo clientes que aún ejecutan código base de Visual Basic 6 en un 100 por ciento. Cuando comienza a trasladar elementos, es bueno saber que tal vez, solo tal vez, no deberá volver a escribir cada línea de código. El código puede convertirse, los controles pueden contenerse; en resumen, existe más de una forma de hacer lo que se debe hacer.

¿La conclusión de todo esto? Tómese un minuto para limpiar el código de Visual Basic 6 antes de la conversión. Una excelente herramienta para esto es Code Advisor para Visual Basic 6. La herramienta requiere Visual Basic 6 para su instalación (recuerde que puede tener Visual Basic 2005 y Visual Basic 6 instalados en el mismo equipo). Agrega una barra de tareas simple a Visual Basic, que comenta el código para ayudarle con consejos de actualización.

Figura 4. Code Advisor

Los cambios que realiza al código son simples, claros y manejables.

Lista 2. Code Advisor mejora el Ejemplo de control

'FIXIT: Use Option Explicit to avoid implicitly creating variables of type Variant   
FixIT90210ae-R383-H1984
Private Sub Three_Change()
    If Len(Three.Text) = 3 Then
        Two.SetFocus
    End If
End Sub

Private Sub Two_Change()
    If Len(Two.Text) = 2 Then
        Four.SetFocus
    End If
End Sub

'FIXIT: Declare 'SocialSecurityNumber' with an early-bound data type  
             FixIT90210ae-R1672-R1B8ZE
Public Property Get SocialSecurityNumber()
    SocialSecurityNumber = Three.Text & _
       "-" & Two.Text & "-" & Four.Text
End Property

Puede descargar Code Advisor aquí.

¿Existen otros cambios para los que necesite buscar ayuda además de Code Advisor? Por ejemplo, ¿hay algo que debiera haber trasladado a un control de usuario hace años y no lo ha hecho? Puede que lo mejor para usted sea realizar el traslado ahora. ¿Qué le parece un control de terceros? ¿Hay una versión de .NET? Si la respuesta es no, pruebe la herramienta aximp lo más pronto posible. La planificación es la clave de toda fusión exitosa de Visual Basic 6 y Visual Basic 2005 y esto se aplica a los controles de usuario, al igual que a todos los demás aspectos.

Mostrar: