Condividi tramite


Un client Windows utilizzando Windows Form

Tutti gli esempi utilizzati fino ad ora erano programmi di riga di comando che scrivevano nella console di sistema. Dopo averne analizzato l'intero processo di sviluppo si riscriverà ora l'applicazione client in modo che utilizzi la nuova libreria Windows Form, disponibile per tutti i linguaggi .NET. Nell'esempio riportato di seguito viene utilizzato il linguaggio Visual Basic. Il listato completo del codice sorgente è il seguente:

Listato 1. Client Windows Form in 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

In .NET Framework SDK la libreria Windows Form si trova nello spazio dei nomi System.Windows.Forms. L'istruzione riportata di seguito incorpora nel programma lo spazio dei nomi System.Windows.Forms.

Imports System.Windows.Forms

Grazie all'importazione degli spazi dei nomi è possibile fare riferimento a tipi inclusi, ad esempio il tipo Button, senza doverne specificare il nome completo, che in questo caso sarebbe System.Windows.Forms.Button.

La riga di codice riportata di seguito illustra l'ereditarietà, una delle funzionalità più potenti di Common Language Runtime.

Inherits Form

Questa semplice e breve istruzione è sufficiente per specificare che la classe del client eredita tutte le funzionalità della classe Form della libreria Windows Form. Il modello di ereditarietà di Common Language Runtime è indipendente dal linguaggio, in altre parole consente non solo di ereditare dal runtime, ma anche da classi scritte con uno qualsiasi dei linguaggi .NET.

Nella riga seguente si illustra la dichiarazione dei tipi di oggetti che verranno utilizzati sul form:

Private Button1 As System.Windows.Forms.Button

A questo punto tutto è pronto per l'esecuzione del codice. Di seguito è riportato il costruttore del form Client che consente di creare un'istanza della classe base e di chiamare il metodo InitForm:

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

Di seguito è illustrato il punto di ingresso del programma che, come prima cosa, consente di creare una nuova istanza del form Client:

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

Con il metodo InitForm viene installato il form con i relativi controlli. Per Button1, ad esempio, viene creato un nuovo pulsante dal tipo Button:

Me.Button1 = New Button

In seguito, sempre con il metodo InitForm, vengono eseguiti lo spostamento del pulsante, l'impostazione della didascalia tramite la proprietà Text e il ridimensionamento del pulsante:

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

Si giunge quindi alla parte più complessa rappresentata dalla connessione dell'evento Click, che è solo uno dei tanti eventi del tipo Button, alla subroutine specifica dell'esempio:

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

Infine, viene aggiunto il pulsante all'insieme Controls del form:

Me.Controls.Add(Button1)

Nel codice riportato di seguito si evidenzia il gestore eventi che viene eseguito quando l'utente fa clic su Button1:

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

L'unica cosa che accade a questo punto è la chiamata del metodo Close del form, con la quale l'applicazione si chiude . In questa particolare subroutine gli argomenti vengono ignorati.

La parte saliente del programma si trova nel gestore eventi Button2_Click, che utilizza lo stesso codice utilizzato nell'esempio relativo al client in Visual Basic. Invece di essere scritte nella console, le stringhe lette dal codice Windows Form vengono aggiunte alla proprietà Text dell'etichetta inclusa nel form:

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

Il processo di generazione risulta notevolmente più complesso: Non solo è necessario specificare i componenti già generati, ma è anche necessario fare riferimento a tutti gli assembly richiesti da Windows Form:

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

Quando si esegue l'applicazione viene creata la finestra di dialogo riportata di seguito. Quando l'utente fa clic sul pulsante Execute le stringhe vengono scritte nell'etichetta inclusa nel form:

Vedere anche

Un client utilizzando ASP.NET | Riepilogo dell'esercitazione di sviluppo | Appendice A: strumenti per l'esplorazione degli spazi dei nomi