Windows フォームを使用する Windows クライアント
ここまでに見てきた例はすべて、システム コンソールに書き込みを行うコマンド ライン プログラムです。ここまでは開発プロセス全体を見てきましたが、ここからは、すべての .NET 言語で利用できる新しい Windows フォーム ライブラリを使用できるように、クライアント アプリケーションを変更していきます。この例では Visual Basic を使用し、その完全なソース コードを次に示します。
リスト 1. Visual Basic での Windows フォーム クライアント (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
.NET Framework SDK では、Windows フォーム ライブラリは System.Windows.Forms 名前空間にあります。次のステートメントは、System.Windows.Forms 名前空間をプログラムに組み込みます。
Imports System.Windows.Forms
名前空間をインポートすることによって、組み込まれた型 (Button など) を、System.Windows.Forms.Button などの完全限定名を使用せずに参照できるようになります。
次のコード行は、共通言語ランタイムの最も強力な機能の 1 つである継承を示しています。
Inherits Form
この 1 つのステートメントによって、クライアント クラスが Windows フォーム ライブラリ内の Form クラスからすべての機能を継承することが指定されます。特定の言語に依存しないという点、つまり、ランタイムからだけでなく、他の .NET 言語で書かれたクラスからも継承できるということは、ランタイムの継承モデルで重要な部分です。
続いて、フォームで使用するオブジェクトの型を次の行で示すように宣言します。
Private Button1 As System.Windows.Forms.Button
これで、コードを実行できる状態になりました。基本クラスのインスタンスを作成し、InitForm メソッドを呼び出す、Client フォームのコンストラクタを次に示します。
Sub New()
MyBase.New
' InitForm is required by the Windows Forms Designer.
InitForm
End Sub
Client フォームの新しいインスタンスを作成することから実行を開始する、プログラム自体のエントリ ポイントを次に示します。
Shared Sub Main()
Application.Run(New Client)
End Sub
InitForm メソッドは、フォームとそのすべてのコントロールを設定します。たとえば、Button1 の場合、InitForm は Button 型から新しいボタンを作成します。
Me.Button1 = New Button
次に、InitForm は作成したボタンを移動し、そのキャプション (または Text プロパティ) を設定し、そのサイズを変更します。
Button1.SetLocation(200, 248)
Button1.TabIndex = 1
Button1.Text = "&Close"
Button1.SetSize(75, 23)
その後に、Button 型の多くのイベントのうちの 1 つである Click をサンプルの独自のサブルーチンにリンクさせるという注意を要する部分が続きます。
AddHandler Button1.Click, New
System.EventHandler(AddressOf Me.Button1_Click)
最後に、InitForm はそのボタンをフォームの Controls コレクションに追加します。
Me.Controls.Add(Button1)
次のコードは、ユーザーが Button1 をクリックしたときに実行されるイベント ハンドラを示しています。
Private Sub Button1_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs)
Me.Close
End Sub
ここでの実際の動作は、フォームの Close メソッドが呼び出され、それによってアプリケーションが終了するだけです。この特別なサブルーチンは、引数を無視します。
このプログラムの核心部分は Button2_Click イベント ハンドラに含まれており、このイベント ハンドラは、Visual Basic クライアントの例で説明したコードと同じコードを使用します。ただし、Windows フォーム サンプルは、コンソールに書き込むのではなく、そのフォーム上のラベルの Text プロパティに出力を追加します。
Label1.Text &=
myCompVC.GetString(StringCount) & vbCrLf
ビルド プロセスは、明らかに複雑になります。既にビルドしたコンポーネントを指定するだけでなく、Windows フォームによって必要とされるすべてのアセンブリを参照する必要があります。
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
アプリケーションを実行すると、次のダイアログ ボックスが作成されます。[Execute] ボタンをクリックすると、文字列はそのフォームのラベルに書き込まれます。