金宏 和實(かねひろ かずみ)

 イーザー(http://www.easier.co.jp/)副社長。40代半ばになってあらためてプログラミングが好きになりました。何歳まで現役でプログラムを作れるか,チャレンジしたいと思います。でも,実はかばんにいつも老眼鏡をしのばせていたりします。

 この連載では,マイクロソフトのVisual Basic(VB)2005を使って,最新のVBプログラミングの便利さや快適さを紹介したいと思います。.NET Framework登場以前のVBを使っていた方の中には,.NET以降のVBに興味を失ったという人もいるようです。確かに,.NET以降のVBはいろいろと変わりましたが,最新のVB 2005は,旧VBユーザーに使いやすいように進化しています(カコミ記事「Visual Basic 2005は現実的である」参照)。VBで培ってきたこれまでのスキルを活かすことができます。これを使わない手はありません。

 米MicrosoftがVisual Studioを提供し続ける限り,VBがなくなることはないでしょう。その意味でVBは常に最前線の言語だと言えます。VBに一度は愛想を尽かした方もぜひ読んでみてください。快適かつモダンになったVB 2005が“使える”言語であることに気づくことでしょう。

Visual Basic 2005は現実的である

 BASIC言語は米Microsoftの原点であり,Visual Basic(VB)はWindows上でもっとも注目されてきた言語製品です。VBのバージョン4.0/5.0/6.0は,RAD(Rapid Application Development)ツールの代名詞でした。フォームにユーザー・インタフェース(UI)部品を貼り付け,ダブルクリックしてコードを記述する。コードの量が多くなりそうな処理はモジュールに記述して,フォームから呼び出す──こんな風にして,多くのプログラマがデータベース・アプリケーションからゲームに至るまで,VBで作り続けて来ました。

 Javaの台頭により,VBに転機が訪れました。ご存じの通り,Java言語で記述したプログラムはJava VM(Java仮想マシン)という実行環境で,バイトコード(中間コード)からネィティブ・コードに変換されて実行されます。ですから,Java VMが存在すれば,WindowsでもUNIX系OSでも同じJavaのプログラムを実行できるのです。

 とはいえ,当初は,バイトコードからネィティブ・コードに実行時に変換するという仕様はどうして時間がかかるので,Javaの普及はゆるやかでした。しかし,その後のJava VMの改良とハードウエアの処理能力の向上により,現在では「どこでもJava」と思えるほどに適用範囲は広がりました。

 MicrosoftのJava VM対抗馬が.NET Frameworkです。.NET FrameworkはJava VMのようにMSIL(Microsoft Intermediate Language)という中間コードを実行します。.NET Framework 1.0用の統合開発環境として登場したのがVisual Studio(VS).NETです。VS.NETには複数の言語製品が含まれていました。VB,C++,J#,C#が.NET Frameworkで動く中間コードをはきだします。

・自分が知っている言語,使いたい言語で開発すればよい
・アプリケーションを複数の言語の組み合わせによって構築できる
・ある言語を使って覚えたコンポーネントの使い方が他の言語にも応用できる

これらが,Javaに対するアドバンテージです。

 しかし,VB 6.0からVB.NETに乗り換えるプログラマは決して多くはなかったようです。

・使いなれたサードパーティ製のOCX部品がそのまま利用できない
・VS.NETのほかの言語と同様に,オブジェクト指向でプログラミングをしなければならない

伝統的なVBプログラマには違和感があったのかもしれません。VB 6.0でもクラスを定義し,インスタンスを生成することはできたのですが,多くのVBプログラマは,オブジェクトを使うことの便利さは理解していても,必ずしもオブジェクト指向でプログラミングする必要性を感じていなかったのではないでしょうか。まして,これまで動いていたプログラムを全面的にオブジェクト指向に書き直す動機は薄かったでしょう。

 新しい .NET Framawrok 2.0とともにリリースされたVB 2005は,VB.NETよりも,古くからのVBプログラマに受け入れやすい工夫が施されています。VB 6.0の便利なところを取り入れた結果,JavaプログラマやC#プログラマからすると「何でもありのプログラム言語」に映るかもしれません。でも,そうした進化の方向は,VB 2005をぐっと現実的なものに変えました。

○○○するのにコンビニエンスなプログラミング言語はVBである。

手早くソフトウエアを開発したいとき,VB 2005はいつも選択肢の上位にあるでしょう。

「フォームを開く」の変遷

 まず,伝統的なVBプログラマに媚びているのではないかとさえ思えるところから見ていきましょう。

 リスト1は,VB 6.0のフォームを開くコードです(図1)。VB 6.0では(a)の形式でフォームを開くことが多いと思いますが,(b)のようにフォームのインスタンスを作成してshowメソッドを呼び出す形で書くこともできました。

リスト1●VB 6.0のフォームを開くコード
リスト1●VB 6.0のフォームを開くコード

図1●「フォームを開く」を実装した画面
図1●「フォームを開く」を実装した画面

 また,VB .NET(2002/2003)では,インスタンスを作成して,showメソッドを呼び出すオブジェクト指向の規則に従うほかありませんでした(図2)。

図2●VB .NET(2002/2003)での「フォームを開く」コード
図2●VB .NET(2002/2003)での「フォームを開く」コード[画像のクリックで拡大表示]

 VB 2005ではVB 6.0のように,インスタンスを作成しなくても,フォームを開くことができるようになりました(図3)。インスタンスを明示的に生成しなくても,暗黙のインスタンスが作成されてフォームが表示されるように戻ったのです。

図3●VB 2005では,インスタンスを作成しなくても,フォームを開くことができる
図3●VB 2005では,インスタンスを作成しなくても,フォームを開くことができる[画像のクリックで拡大表示]

 もう一度,図2と図3を比較してください。図2には

Inherits System.Windows.Forms.Form

があり,Formクラスを継承(Inherits)していることがわかります。一方,図3には継承の記述はありません。しかし,継承しなくなったわけではありません。

 フォームのInitializeComponentメソッドを開くと,「フォーム名.Designer.vb」のウィンドウが開きます(図4)。VB 2005では,フォーム上にボタンやテキストボックスなどを配置したり,操作したりすると,フォームやコントロールなどGUIデザインに関するコードが自動生成されて「フォーム名.Designer.vb」に保存されるようになりました。一方,イベントの処理などのコードは「フォーム名.vb」に保存します。このように,クラスの定義を複数のファイルに分けて記述する機能をパーシャル・クラス(部分クラス)と呼びます。パーシャル・クラスは,VB 2005から追加されたものです。

図4●InitializeComponentメソッドは,Form1.Designer.vb内に定義されている
図4●InitializeComponentメソッドは,Form1.Designer.vb内に定義されている[画像のクリックで拡大表示]

 フォーム名.Designer.vbのコードは本来,触る必要のないものですが,このコードを読むと勉強になります(リスト2)。

Private Sub InitializeComponent()
Me.Button1 = New System.Windows.Forms.Button
Me.Button2 = New System.Windows.Forms.Button
Me.SuspendLayout()
'
'Button1
'
Me.Button1.Location = New System.Drawing.Point(35, 12)
Me.Button1.Name = "Button1"
Me.Button1.Size = New System.Drawing.Size(121, 49)
Me.Button1.TabIndex = 0
Me.Button1.Text = "フォームを開く"
Me.Button1.UseVisualStyleBackColor = True
'
'Button2
'
Me.Button2.Location = New System.Drawing.Point(35, 78)
Me.Button2.Name = "Button2"
Me.Button2.Size = New System.Drawing.Size(121, 49)
Me.Button2.TabIndex = 1
Me.Button2.Text = "フォームを開く"
Me.Button2.UseVisualStyleBackColor = True
'
'Form1
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(292, 266)
Me.Controls.Add(Me.Button2)
Me.Controls.Add(Me.Button1)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)
End Sub
リスト2●InitializeComponentメソッドのコード(自動的に生成される)

ボタンのインスタンスを二つ作成して,フォームに貼り付けているだけの処理ですが,描画時の画面のちらつきを抑えるために,

Me.SuspendLayout()

でLayoutイベントの発生を止め,

Me.ResumeLayout(False)

で,一度だけLayoutイベントが発生するようにしています。このようなテクニックを覚えておくと,データの発生に合わせてコントロールを動的に配置するといった処理をプログラミングするときに役に立ちます。