2011年12月21日水曜日

VB6 でもクラスは役に立つ

※これは VB Advent Calendat 2011 用の投稿です

元々私は VB2 からの VisualBasic プログラマだったりします。お仕事としても VB を利用していますが、まだまだ VB6 は廃れないなー、というのが率直なところです。

VB6 を利用されている場合、言語上の仕様もありあまりクラスを利用するメリットが見いだせないかと思われます。特定のケースに限り利用するだけで、結構使われていない。または使った事のない方も多いのではないでしょうか。ですが、VB6 でもクラスを利用する事で役立つことは多くあるのです。


例えば GrapeCity さんの製品で ActiveReport という帳票ツールをご存知の方は多いと思います。それを利用している際によくある要件として、プレビューウィンドゥのツールバーに○○な機能を追加してほしい、と言われることはないでしょうか。

実際にツールバーに何かしらの機能を付与するには次のような処理が必要です。

   1: With objActReport.Toolbar
   2:     '終了させるファンクションを追加
   3:     .Tools.Add "F12:終了"
   4:     .Tools(.Tools.Count - 1).Type = 0
   5:     .Tools(.Tools.Count - 1).Tooltip = "終了"
   6: End With

このような処理を ActiveReport のインスタンスに対して行う必要があります。今はまだ少しの処理ですので、各プログラム毎に上記ロジックを記載していてもそれほど苦にならないかも知れませんが、処理の内容が増えたりすると途端に苦労する度合が飛躍的に増加してしまいます。そうなるとモジュールに処理をまとめたりするのですが、ここではクラスを利用してみる事を提案します。

VB6 のクラスは他オブジェクト指向言語に慣れてしまうとなかなかに不便です。どうしても同じコードを記述する必要があったりします。ですがそれでも利用する事で楽になる部分は存在しています。ですがそのあたりも少し工夫する事で、便利さの方が目立つようにすることはできます。

先程は ActiveReport だったので今度は DenpyoMan を例に説明します。

   1: Public WithEvents objDenpyo  As DpDenpyo
   2:  
   3: Private Sub objDenpyo_EnterEdit(EditValue As Variant)
   4:     
   5:     Dim orgIMEMode As Variant
   6:     'IMEモードを再設定
   7:     With objDenpyo
   8:         Select Case .TRow(.ActiveCellKey).Type
   9:             Case dpCellText     'テキスト型
  10:             orgIMEMode = .TRow(.ActiveCellKey).Details(dpTextIMEMode)
  11:                 .TRow(.ActiveCellKey).Details(dpTextIMEMode) = dpIMEOff
  12:                 .TRow(.ActiveCellKey).Details(dpTextIMEMode) = orgIMEMode
  13:         End Select
  14:  
  15: End Sub

以前に扱った話題で DenpyoMan の IME が Windows 7 などで誤作動する件がありますが、それもクラスを上記のように用意しておくことで、大元のプログラム側からは次のようにすれば全て制御が行われることになります。

   1: Dim objDenpyoControl As clsEventDenpyo 'DenpyoMan 用制御クラス
   2: Set objDenpyoControl = New clsEventDenpyo 
   3: Set objDenpyoControl.objDenpyo = [フォーム上の DenpyoMan コントロール]

これだけのロジックで先程の処理が等しく行われるようになります。クラス側でイベント制御や特定の処理を追加で記述する事があっても、呼び出し側のロジックが増える事はありませんし、何より VB.NET に移行するのが非常に楽になります。それというのも、影響を受けるクラスは DenpyoMan 制御用クラスだけであり、呼び出し元のフォームは全く影響を受けないからです。

同様の手段を ActiveReport に対して利用する場合はこのような感じになります。

   1: Public WithEvents objAReport As ActiveReport
   2:  
   3: Private Sub objAReport_KeyDown(KeyCode As Integer, ByVal Shift As Integer)
   4:     Select Case KeyCode
   5:         Case vbKeyF12 'プレビュー中に F12 を押すと終了
   6:             Unload objAReport 
   7:         Case Else
   8:     End Select
   9: End Sub

上記のロジックでは、ActiveReport のプレビュー画面表示中に F12 を押すとプレビュー画面が閉じるという制御を共通して盛り込めるようになります。

今現在 VB6 なアプリケーションで共通したイベント処理などが散見されるのでしたら、このような方法を試してみるのも手かと思います。なお、この方法をつきつめると、フォーム上に一切のロジックを書かずに今までと同様の制御も行えます。

0 件のコメント:

コメントを投稿