特集

Visual Basic 2005へ移行する理由(後編)

VB6開発者が待ち望んだVB2005の便利機能

om (takanao)(Microsoft MVP Oct 2005 - Oct 2006 Visual C#)
2006/01/31

Page1 Page2

6. 移行ウィザード

 アップグレード・ウィザードとは、VB6などの古い形式のプロジェクトとソース・コードを.NET Frameworkで実行できる形式に変換するためのものだ。これによりVB6から.NETへの移行をある程度簡略化できるのだが、実際にはVB6のソース・コードを完ぺきに.NETのコードへ置き換えることは難しく、中途半端な変換に終わってしまい、あまり使えないという評価があったのも事実だ。それではVB2005になって、アップグレード・ウィザードはどれくらい改善されたのだろうか。本連載の最後に、この移行ウィザードの改善点について説明しよう。なお本稿はProfessional Editionをベースとして書いているが、アップグレード・ウィザードはVB 2005 Express Editionでも利用可能だ。

■6.1 移行ウィザードの起動

 VB2005のアップグレード・ウィザードは、メニューバーの[ファイル]−[開く]−[変換]をクリックすることで起動できる。すると次の画面のように[変換]ダイアログが表示されるので、「Visual Basic 2005 アップグレード ウィザード」を選択して[OK]ボタンをクリックすればよい(Express Editionではこの方法で起動できない。詳細後述)。なおこの起動方法は従来のVB.NETでも同じだった。

VB2005でアップグレード・ウィザードを起動する方法
VB2005のアップグレード・ウィザードを起動するには、メニューバーから[ファイル]−[開く]−[変換]を実行して[変換]ダイアログを表示し、そこから「Visual Basic 2005 アップグレード ウィザード」を選択すればよい。

 これにより次のような[Visual Basic アップグレード ウィザード]が表示される。後はウィザードの指示に従って進めていけばよい。


([参照]ボタンをクリック)

(ウィザードの数ページを省略)
VB2005のアップグレード・ウィザード
VB2005のアップグレード・ウィザードでは、VB6プロジェクトをVB2005プロジェクトへ変換できる。

 アップグレード・ウィザードでは、変換元のVB6プロジェクトとして、拡張子が.vbpのファイル(=VB6プロジェクト・ファイル)を選択する必要がある。また、VB2005のアップグレード・ウィザードは、IDEのメニューバーで[ファイル]−[開く]−[プロジェクト/ソリューション]から.vbpファイルを直接開くことでも起動でき、この場合にはウィザードでの.vbpファイルの選択は省略される。VB 2005 Express Editionの場合、メニューバーに[変換]という項目が提供されていないので、この.vbpファイルを直接開くという起動方法を取る必要がある。

■6.2 VB.NETから改善された移行ウィザードの変換機能

 以下のソース・コードは、VB.NETのアップグレード・ウィザードでは移行できなかったいくつかの機能を盛り込んだVB6のコードである。

Private Sub Form_Load()
  Text1 = App.EXEName
  Clipboard.SetText(Text1)
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  If UnloadMode = vbFormControlMenu Then
    Cancel = 1
  End If
End Sub
VB6で書かれたアップグレード前のソース・コード
このコードはVB.NETのアップグレード・ウィザードでは移行できない。

 このようなコードが書かれたプロジェクトを、VB.NETのアップグレード・ウィザードで変換すると、以下のようなコードが作成される。#Regionディレクティブで隠されている部分は掲載していないが、デザイン・コードやアップグレード・ウィザードで生成された下位互換コードが生成されている。

Friend Class Form1
  Inherits System.Windows.Forms.Form

#Region "Windows フォーム デザイナによって生成されたコード"
#Region "アップグレード ウィザードのサポート コード"

  Private Sub Form1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
    Text1.Text = VB6.GetExeName()

    ' UPGRADE_ISSUE: Clipboard メソッド Clipboard.SetText は
    ' アップグレードされませんでした。
    ' 詳細については次のリンクをクリックしてください :
    ' 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup2069"'
    Clipboard.SetText((Text1.Text))
  End Sub

  ' UPGRADE_WARNING: Form イベント Form1.QueryUnload には
  ' 新しい動作が含まれます。
  ' 詳細については次のリンクをクリックしてください :
  ' 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup2065"'
  Private Sub Form1_Closing(ByVal eventSender As System.Object, ByVal eventArgs As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
    Dim Cancel As Short = eventArgs.Cancel

    ' UPGRADE_ISSUE:
    ' 定数 vbFormControlMenu はアップグレードされませんでした。
    ' 詳細については次のリンクをクリックしてください :
    ' 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup2070"'
    ' UPGRADE_ISSUE:
    ' Event パラメータ UnloadMode はアップグレードされませんでした。
    ' 詳細については次のリンクをクリックしてください :
    ' 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1057"'
    If UnloadMode = vbFormControlMenu Then
      Cancel = 1
    End If
    eventArgs.Cancel = Cancel
  End Sub
End Class
VB.NETのアップグレード・ウィザードが生成したコード
ClipboardオブジェクトとForm_QueryUnloadイベント・ハンドラの関連部分はソースがそのまま残っており、このままコンパイルしてもコンパイル・エラーになってしまう。

 まず、このコードでうまく変換できている部分を紹介しよう。VB6で、デフォルト・プロパティを使用していた「Text1」の部分が、「Text1.Text」とプロパティが正しく指定されていることが分かる。また、「App.EXEName」はVB6互換ライブラリ呼び出しの「VB6.GetExeName()」に変換されている。

 次に、変換できていない部分だが、「Clipboard.SetText()」の部分は、パラメータとして渡していた「Text1」が「Text1.Text」といったふうに正しくプロパティが指定されているが、肝心のClipboard.SetText関数自体がアップグレードできていないことが分かる。

 また、確かにフォームのQueryUnloadイベント・ハンドラ(Form_QueryUnload関数)で書かれていたコードがフォームのClosingイベント・ハンドラ(Form1_Closingメソッド)に正しく変換されているが、終了理由の判定(UnloadModeパラメータなど)がうまく変換できていないため、コンパイルしてもコンパイル・エラーが発生してしまう。

 しかしこのようなVB.NETで変換できなかったコードも、VB2005のアップグレード・ウィザードでは正しくアップグレードできるようになっている。以下のコードがVB2005のアップグレード・ウィザードで変換されたコードである。

Friend Class Form1
  Inherits System.Windows.Forms.Form

  Private Sub Form1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load

    ' UPGRADE_WARNING:
    ' App プロパティApp.EXEName には新しい動作が含まれます。
    ' 詳細については、
    ' 'ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?keyword="6BA9B8D2-2A32-4B6E-8D36-44949974A5B4"'
    ' をクリックしてください。
    Text1.Text = My.Application.Info.AssemblyName
    My.Computer.Clipboard.SetText((Text1.Text))
  End Sub

  Private Sub Form1_FormClosing(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    Dim Cancel As Boolean = eventArgs.Cancel
    Dim UnloadMode As System.Windows.Forms.CloseReason = eventArgs.CloseReason
    If UnloadMode = System.Windows.Forms.CloseReason.UserClosing Then
      Cancel = 1
    End If
    eventArgs.Cancel = Cancel
  End Sub
End Class
VB2005のアップグレード・ウィザードが生成したコード
AppオブジェクトやClipboardオブジェクトにVB2005の新機能のMyオブジェクトが使われている。また、VB6のForm_QueryUnloadイベント・ハンドラで行っていた「終了理由(eventArgs.CloseReasonプロパティ)の確認」が復活した。

 まず、このコードで最初に気付くのが、VB.NETでは自動生成されていたデザイン・コードと下位互換コードが作成されていないことだ。

 デザイン・コードは、中編で紹介した部分クラス(Partial Class)にアップグレードされるようになったため、開発者が編集するコードには記述されなくなった。

 またVB.NETでは、下位互換コードとして暗黙のフォーム・インスタンスを仮想的に実現するコードが生成されていたが、VB2005では中編で説明したとおり、暗黙のフォーム・インスタンスが復活したため、このコードが生成されなくなった。

 さらに、VB.NETではアップグレードできなかったClipboardオブジェクトなどの機能やVB6互換ライブラリを用いたコードに変換されていた「App.EXEName」などの機能が、中編で説明したMyオブジェクトを使ってアップグレードされているのが分かる。例えば「Clipboard」は「My.Computer.Clipboard」に、「App.EXEName」は「My.Application.Info.AssemblyName」に置き換わっている。このことからも、MyオブジェクトがVB6開発者がVB2005に移行する際のステップになることを期待していることが分かる。

 最後に、VB.NETでアップグレードできていなかったForm_QueryUnloadイベント・ハンドラはVB.NETと同じくFormClosingイベント・ハンドラに置き換わっているが、終了判断(eventArgs.CloseReasonプロパティ)ができるようになっているのが分かる。

 ここまでで解説したように、VB2005のアップグレード・ウィザードを使用してアップグレードすれば、VB.NETのときのような特殊なコードが作成されずに移行できることが分かる。また、ここで紹介した部分以外でも、これまで以上にアップグレードが容易になっている。例えばこれまでアップグレードできなかったTreeViewやListViewなどのコントロールもアップグレードできるようになっている。移行ウィザードの助けは、これまで以上に頼れるものになったといえるだろう。ただし、FormのLineメソッドやPrintFormメソッド、OLEコントロールやLineコントロールなど、これまで通り移行できないコードやコントロールもいまだに存在しているため、アップグレード・ウィザードだけですべての移行ができるようにはなっていないことにも注意してほしい。

まとめ

 以上、3回にわたり解説してきたとおり、マイクロソフトはVB6開発者を呼び戻すためにVB2005に対してさまざまな改善を行った。これによって移行の敷居は低くなったと思うが、ご紹介したとおり完全な互換性があるわけではない。やはりVB6開発者自身の新しいことに対する学習が必要な点は変わっていない。

 しかしVB2005そして.NET Framework 2.0には、それらをカバーしてあり余るほど豊富で強力な機能が用意されている。筆者としては、VB6開発者はぜひともVB2005へ移行すべきだと考えている。End of Article

 

 INDEX
  [特集] Visual Basic 2005へ移行する理由(後編)
  VB2005は.NETへの移行を加速できるのか!?
    1.なぜVB6開発者はVB.NETに移行しなかったか?
    2.互換性が高まった開発環境
 
  VB6開発者にやさしいVB2005の言語仕様
    1.フォームのデザインと生成されるコード、フォームのインスタンス化処理
    2.Myオブジェクト、コード・スニペット、配列の下限指定、暗黙の型変換
    3.デフォルト・プロパティ、オブジェクトの解放、エディット&コンティニュー
   
  VB6開発者が待ち望んだVB2005の便利機能
    1. 進化したデータ・アクセス機能とアプリケーションの配布技術
  2. 完成度を高めた移行ウィザードとまとめ
 


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH