図1
 マイクロソフトは12月11日,開発ツールの次期版「Visual Studio.NET」の日本語ベータ版(ベータ1)の提供を開始した。なかでも多くの人が気になるのは,Visual Basic.NET(Visual Basic 7.0,以下VB7)だろう。オブジェクト指向技術を大幅に取り入れるなど,今回のバージョンアップはかなりの変更を含むからだ。

 そこでここではニューVBの機能について,特に既存(Visual Basic 6.0)のプロジェクトがどうVB7に移行できるのか,という点に注目してレビューしてみよう。

 Visual Studio.NETを起動すると,最初に現れるのは図1[拡大表示]の画面だ。ここではどんな言語を選択するかではなく,「既存のプロジェクトを開く」のか「新しいプロジェクトを開く」のかなどを指定する。つまり言語を選択するのではなく,「何をしたいのか」が作業のきっかけになる。ちなみに今回のベータでは,米Microsoftへの障害報告用のメニューも用意されている。

 「新しいプロジェクト」を選択すると現れるのが図2[図を表示]だ。ここではじめてVB,C#,VC++と言語別のプロジェクトのフォルダが見えるようになる。

図5
 今回は既存VBプロジェクトの移行がテーマなので,画面を戻して図1から既存のプロジェクトを選択してみる(図3[図を表示])。test.vbpは,テキストボックスに入力した文字列を,メッセージボックスに表示するだけの,きわめて簡単なVB6ベースのアプリケーションだ(図4[図を表示])。フォームもシンプル,コードもたった5行しかない。

 既存VBプロジェクトを選択すると現れるのが,今回のベータ1の目玉のひとつ「Visual Basic Upgrade Wizard」(図5[拡大表示])。既存のVBのプログラムを,.NET対応に移行するためのツールである。これは7月に公開されたTechnical Previewにはなかった機能で,この機能の完成度が,VBプログラマにとって一番の関心どころだろう。図6[図を表示]はNextボタンを選択すると出てくる画面で,プロジェクトのタイプなどを設定する。ここではデフォルトのまま次へ行く。すると次の段階では,.NETのプロジェクトをどこのフォルダに保存するかだ(図7[図を表示])。VB.NETというフォルダ名がデフォルトで指定されているので,そのまま次へ行く。新規フォルダの有無についてダイアログが出るので,作成を選ぶと,いよいよ移行作業がスタートする(図8[図を表示])。そして問題がなければ作業は終了だ(図9[図を表示])。すると,VB7の開発画面右上にある「ソリューション・エクスプローラ」に移行したプロジェクトの関係ファイルが表示される(図10)。VB7では複数のプロジェクトを「ソリューション」という単位でまとめるのだ。

図10
 さっそくtest.vbというファイルをダブルクリックしてみる。ここでようやく,おなじみのフォーム画面が表示された(図11[図を表示])。さて,フォームはともかく,コードはどう移行しているのか,さっそくコードを見るため,[表示]メニューから[コード]を選択する(図12[図を表示])。

 すると現れたのが図13[拡大表示]だ!この画面をVB6のコード・エディタとよ~く見比べてほしい。拡大してみよう(図14[図を表示])。VB6で記述したアプリケーションのコード(Command1ボタンをクリックしたときのイベントハンドラ)は,コードの下のほうに記述されているのがわかる。しかし,コードの半分以上はForm1(フォーム)のクラスの定義だ。

 興味深いのはエディタの左端にある,+や-のマーク。直感的に予想できると思うが,このマークをクリックすることで,なんとコードを「おりたためる」のだ(図15[拡大表示])。見たくなければコード全体をたたむこともできる(図16[図を表示])。これはかなり便利な機能だ。

 ところで,たった5行のコードがこれだけの分量になってしまったと驚いてしまうのはまだ早い。エディタ中央部の「Windows Form Designer generated codeの部分の+マークをクリックしてみる。すると,このフォームについてのもっと詳細なコードが現れるのである(図17[図を表示])。VB7では従来のフォームを,Win Formという新しいクラス仕様で定義する。このコードはその部分だ。従来,拡張子.frmのファイルに書かれていたプロパティなどの定義が,コード・エディタで読めるようになったと思ってもいい。ここでの注目はコメント文だ。Upgrade Wizardが自動的に挿入したコメント文があることがわかる。

図13
 さて,視点をアプリケーションのコードに戻してみよう。まず気になるのは,Command1_Click~の部分。たかがクリックするだけのイベントで,さまざまな引数がByVal(値渡し)で使われていることがわかるだろう。また,VB6ではVariant型だったstrXXという変数が,Objectになっていることにも注目してほしい。実はVB7にVariant型はない。従来のVariant型とObject型は,新しいObject型に移行されるのだ。Upgrade Wizardはこの程度の変更なら自動的にやってくれたわけだ。また,MsgBoxの表記も,(カッコ)を使うものに変更されている。

 このほか目に付くのは,コードの冒頭だ。オリジナルのコードでは,変数宣言を強制していない。つまりOption Explicitコードを挿入していない。これを移行すると,Option Explicit Offというコードが追加されるのだ。その前の行のOption Strict Offは,暗黙の型宣言を行うかどうか指定するもので,ここではOff(暗黙の型宣言を行う。StrictではないのでOff)になっている。

図15
 ありがたいのは,エディタ上でマウス・ポインタを変数名にもっていくと,その宣言が表示される機能だ(図18)。従来はデバッグ作業でないと見られなかったものだ。

 ではこの移行プロジェクトは,はたして動作するのか。さっそく実行してみる。実行は「コンパイル」ではなく,「ビルド」だ。このとき,ソリューション・ファイル(拡張子.sln)の作成が必要になる(図19[図を表示])。すると,確かに動作はした(図20[図を表示])。しかし画面を見てわかるように,メッセージボックスのタイトルバーには「エラー」と表示されてしまった。従来ならプロジェクト名が表示されたはずだ。これはちょっといただけない。

 このように,きわめて簡単なプログラムであれば,Upgrade Wizardで移行できることがわかった。

 ではもう少し複雑なプログラムだったらどうだろう。図21[図を表示]は,日経ソフトウエア1998年8月号の連載で紹介したVB6ベースのルーレットのアプリケーション(http://software.nikkeibp.co.jp/software/download/down98.htmlからダウンロード可能)を移行したものだ。このアプリケーションでは,コントロール配列やタイマー,ピクチャボックスなど,VBプログラムでは日常的に使うアイテムが使われている。興味深いのは,タイマー(Timer1)など画面表示機能のないコントロールは,フォーム画面に現れず,画面下部にその存在だけが表示されている点だ。

図18
 結論から言うと,このアプリケーションをUpgrade Wizardを使って移行した場合,そのままでは動かなかった。ビルドエラーが発生したのだ(図22[図を表示])。エラー内容は,開発画面下部のタスク一覧に,エラータスクとして表示された(図23[図を表示])。調べてみると,このエラーの原因は,コード上でコメント文として最初から指摘されていた(図24[図を表示])。つまりフォームのポップアップ・メニューはVB7ではサポートされないのである。アプリケーションを動かすには,このコードの部分をプログラマが手で直さなければならない。Wizardは修正をアドバイスするだけである。というと,修正項目が多い場合にその管理だけでも大変に感じられるかもしれない。そこでUpgrade Wizardは,アップグレードできなかった項目についてレポート(HTMLファイル)を 自動的に作成する機能を持っている(図25[図を表示])。プログラマは,このレポートを見て修正作業を行えばいいだろう。

 このようにUpgrade Wizardは,型の変更のようなきわめて単純な項目は自動的にアップグレードできるが,プログラムの細部までは無理なことがわかる。今回はベータ1なので,正式出荷までにどこまでブラッシュアップできるかわからないが,機能の向上を期待したい。