Freigeben über


Ein Windows Forms verwendender Windows-Client

Bei allen bisher beschriebenen Beispielen handelt es sich um Befehlszeilenprogramme, die Daten in die Systemkonsole geschrieben haben. Jetzt kennen Sie den gesamten Entwicklungsprozess und können somit die Clientanwendung neu schreiben, um die neue Windows Forms-Bibliothek zu verwenden, die in allen .NET-Sprachen verfügbar ist. Im Beispiel wird Visual Basic verwendet, und dies ist die vollständige Quellcodeauflistung:

Auflistung 1. Windows Forms-Client 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 befindet sich die Windows Forms-Bibliothek im System.Windows.Forms-Namespace. Die folgende Anweisung schließt den System.Windows.Forms-Namespace in das Programm ein.

Imports System.Windows.Forms

Indem Sie die Namespaces importieren, können Sie auf eingeschlossene Typen verweisen (z. B. Button), ohne den voll gekennzeichneten Typnamen (z. B. System.Windows.Forms.Button) verwenden zu müssen.

Anhand der folgenden Codezeile wird die Vererbung dargestellt, eines der leistungsstärksten Features der Common Language Runtime:

Inherits Form

Mit dieser einen Anweisung geben Sie an, dass die Clientklasse alle Funktionen von der Form-Klasse in der Windows Forms-Bibliothek erbt. Die Sprachenunabhängigkeit ist ein wichtiger Aspekt des Vererbungsmodells der Laufzeit. Die Vererbung erfolgt nicht nur von der Laufzeit, sondern auch von Klassen, die in einer beliebigen .NET-Sprache geschrieben wurden.

Anschließend deklarieren Sie die Objekttypen, die Sie im Formular verwenden, wie in der folgenden Zeile demonstriert:

Private Button1 As System.Windows.Forms.Button

Jetzt können Sie endlich Code ausführen. Dies ist der Konstruktor für das Client-Formular, das eine Instanz der Basisklasse erstellt und die InitForm-Methode aufruft:

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

Dies ist der Einsprungpunkt für das Programm selbst, der den gesamten Prozess startet, indem er eine neue Instanz des Client-Formulars erstellt:

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

Die InitForm-Methode richtet das Formular und alle dazugehörigen Steuerelemente ein. Für Button1 erstellt InitForm beispielsweise eine neue Schaltfläche vom Typ Button:

Me.Button1 = New Button

InitForm verschiebt sie, legt die Beschriftung (oder Text-Eigenschaft) fest und ändert die Größe:

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

Anschließend kommt der schwierige Teil: das Verbinden von Click, das lediglich eines der vielen Ereignisse des Typs Button ist, mit der Unterroutine des Beispiels:

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

Schließlich fügt InitForm die Schaltfläche der Controls-Auflistung des Formulars hinzu:

Me.Controls.Add(Button1)

Der folgende Code hebt den Ereignishandler hervor, der ausgeführt wird, wenn der Benutzer auf Button1 klickt:

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

Hier wird lediglich die Close-Methode des Formulars aufgerufen, wodurch die Anwendung beendet wird. Diese Unterroutine ignoriert die Argumente.

Der entscheidende Inhalt des Programms befindet sich im Button2_Click-Ereignishandler, der denselben Code verwendet, der im Visual Basic-Clientbeispiel verwendet wurde. Das Windows Forms-Beispiel schreibt nicht in die Konsole, sondern in die Text-Eigenschaft der Marke im Formular:

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

Der Buildprozess ist definitiv komplexer. Sie müssen nicht nur die Komponenten angeben, die Sie bereits erstellt haben, sondern auch auf alle Assemblies verweisen, die für Windows Forms benötigt werden:

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

Wenn die Anwendung ausgeführt wird, wird folgendes Dialogfeld erstellt. Wenn auf die Schaltfläche Execute geklickt wird, werden die Zeichenfolgen in die Marke des Formulars geschrieben:

Siehe auch

Ein ASP.NET verwendender Client | Zusammenfassung des Lernprogramms für Entwicklung | Anhang A: Tools zum Durchsuchen von Namespaces