Compartir a través de


Cliente de Windows mediante formularios Windows Forms

Hasta ahora, todos los ejemplos han sido programas de línea de comandos que escribían en la consola del sistema. Ahora que ha visto todo el proceso de desarrollo, va a rescribir la aplicación cliente para utilizar la nueva biblioteca de formularios Windows Forms, que está disponible para todos los lenguajes de .NET. En el ejemplo se utiliza Visual Basic y ésta es la lista completa de código fuente:

Lista 1. Cliente de formularios Windows Forms en Visual Basic (ClientWinForms.vb)

Option Explicit
Option Strict

Imports System
Imports System.Collections
Imports System.Drawing
Imports System.Threading
Imports System.Windows.Forms

Imports CompCS
Imports CompVB
Imports CompVC

Public Module modmain
   Public Const vbCrLf as String = 
      Microsoft.VisualBasic.ControlChars.CrLf
   Public Class Client
      Inherits Form

      ' This code is required by the Windows Forms Designer.
      Private components As 
         System.ComponentModel.Container
      Private Button2 As System.Windows.Forms.Button
      Private Button1 As System.Windows.Forms.Button
      Private Label1 As System.Windows.Forms.Label

      Public Sub New()
         MyBase.New
         InitForm  'Required by the Windows Forms Designer.
      End Sub

      'Form overrides Dispose(Boolean) to clean up component list
      '(this Form has no components), then disposes of the base class
      Protected Overloads Overrides Sub Dispose(disposing As Boolean)
            If disposing Then
                  If Not (components Is Nothing) Then 
                        components.Dispose()
                  End If
            End If
            MyBase.Dispose(disposing)
      End Sub 

      ' This is the Main entry point for the application.
      Shared Sub Main()
         Application.Run(New Client)
      End Sub

      ' This procedure is required by the Windows Forms Designer.
      ' It can be modified using the Windows Forms Designer.  
      ' Do not modify it using the code editor.
      Private Sub InitForm()
          Me.Button1 = New Button
          Me.Button2 = New Button
          Me.Label1 = New Label

          Button1.Location = new Point(200, 230)
          Button1.TabIndex = 1
          Button1.Text = "&Close"
          Button1.Size = new Size(75, 23)
          AddHandler Button1.Click, New 
             System.EventHandler(AddressOf 
             Me.Button1_Click)

          Button2.Location = new Point(120, 230)
          Button2.TabIndex = 2
          Button2.Text = "&Execute"
          Button2.Size = new Size(75, 23)
          AddHandler Button2.Click, New 
             System.EventHandler(AddressOf 
             Me.Button2_Click)

          Label1.Location = new Point(8, 8)
          Label1.TabIndex = 0
          Label1.TabStop = False
          Label1.Text = ""
          Label1.Size = new Size(272, 232)

          Me.Text = "Client"

          Me.Controls.Add(Button2)
          Me.Controls.Add(Button1)
          Me.Controls.Add(Label1)

      End Sub

      Private Sub Button1_Click(ByVal sender As 
         System.Object, ByVal e As System.EventArgs) 
          Me.Close
      End Sub

      Private Sub Button2_Click(ByVal sender As 
         System.Object, ByVal e As System.EventArgs)
         
          ' Declare the local variables.
          Dim myCompCS As New CompCS.StringComponent
          Dim myCompVB As New CompVB.StringComponent
          Dim myCompVC As New CompVC.StringComponent

          Dim StringCount As Integer

          ' Clear the label. 
          Label1.Text = ""

          ' Display the results from the C# component.
          For StringCount = 0 To CInt(myCompCS.Count) - 1
            Label1.Text &= 
               MyCompCS.GetString(StringCount) & vbCrLf
          Next        
          Label1.Text &= vbCrLf

          ' Display the results from the Visual Basic component.
          For StringCount = 0 to CInt(MyCompVB.Count) - 1
              Label1.Text &= 
                 myCompVB.GetString(StringCount) & vbCrLf
          Next
          Label1.Text &= vbCrLf

          ' Display the results from the Visual C++ component.
          For StringCount = 0 To CInt(myCompVC.Count) - 1
              Label1.Text &= 
                 myCompVC.GetString(StringCount) & vbCrLf
          Next        
      End Sub
   End Class
End Module

En .NET Framework SDK, la biblioteca de formularios Windows Forms está ubicada en el espacio de nombres System.Windows.Forms. La siguiente instrucción incluye el espacio de nombres System.Windows.Forms en el programa.

Imports System.Windows.Forms

Al importar los espacios de nombres, se puede hacer referencia a los tipos incluidos (por ejemplo, Button) sin tener que usar el nombre de tipo completo (por ejemplo, System.Windows.Forms.Button).

La siguiente e interesante línea de código muestra la herencia, una de las características más eficaces de Common Language Runtime:

Inherits Form

Con esta instrucción, se especifica que la clase del cliente hereda todas las funciones de la clase Form de la biblioteca de formularios Windows Forms. La independencia de lenguaje es un aspecto importante del modelo de herencia del motor de tiempo de ejecución. No sólo se puede heredar del motor de tiempo de ejecución sin también de las clases escritas en cualquier lenguaje de .NET.

A continuación, se declaran los tipos de objeto que se van a utilizar en el formulario, tal y como se muestra en la siguiente línea:

Private Button1 As System.Windows.Forms.Button

Ahora ha llegado el momento de ejecutar código. Éste es el constructor del formulario Client que crea una instancia de la clase base y llama al método InitForm:

Sub New()
   MyBase.New
   ' InitForm is required by the Windows Forms Designer.
   InitForm
End Sub

Éste es el punto de entrada del propio programa que lo inicia todo creando una nueva instancia del formulario Client:

Shared Sub Main()
   Application.Run(New Client)
End Sub

El método InitForm configura el formulario y todos sus controles. Para Button1, por ejemplo, InitForm crea un nuevo botón del tipo Button:

Me.Button1 = New Button

A continuación, InitForm lo mueve, configura su título (o la propiedad Text) y ajusta su tamaño:

Button1.SetLocation(200, 248)
Button1.TabIndex = 1
Button1.Text = "&Close"
Button1.SetSize(75, 23)

Entonces aparece la parte difícil: conectar Click, que sólo es uno de los muchos eventos del tipo Button, a la propia subrutina del ejemplo:

AddHandler Button1.Click, New  
   System.EventHandler(AddressOf Me.Button1_Click)

Por último, InitForm agrega el botón a la colección Controls del formulario:

Me.Controls.Add(Button1)

El siguiente código resalta el controlador de eventos que se ejecuta cuando el usuario hace clic en Button1:

Private Sub Button1_Click(ByVal sender As System.Object, 
      ByVal e As System.EventArgs)
   Me.Close
End Sub

En realidad, lo único que sucede es que se llama al método Close del formulario, por lo que finaliza la aplicación. Esta subrutina omite los argumentos.

Lo fundamental del programa se encuentra en el controlador de eventos Button2_Click, que utiliza el mismo código que el que aparece en el ejemplo del cliente de Visual Basic. En lugar de escribir en la consola, el ejemplo de formularios Windows Forms agrega a la propiedad Text de la etiqueta del formulario:

Label1.Text &= 
   myCompVC.GetString(StringCount) & vbCrLf

El proceso de generación es sin duda alguna más complejo. No sólo se han de especificar los componentes ya generados sino que también se ha de hacer referencia a todos los ensamblados que requieren los formularios Windows Forms:

vbc.exe /t:winexe /debug+ /optionstrict+ 
   /reference:..\Bin\CompCS.dll 
   /reference:..\Bin\CompVB.dll 
   /reference:..\Bin\CompVC.dll 
   /reference:System.dll, 
   System.Windows.Forms.dll, 
   System.Data.DLL,system.drawing.dll 
   /out:..\bin\ClientWinForms.exe ClientWinForms.vb

Al ejecutar la aplicación, se crea el siguiente cuadro de diálogo. Cuando se hace clic en el botón Execute, se escriben las cadenas en la etiqueta del formulario:

Vea también

Un cliente mediante ASP.NET | Resumen del tutorial sobre la programación | Apéndice A: Herramientas para explorar espacios de nombres