すぐ使えるADO.NET

【Visual BasicによるADO.NETデータベースプログラミング】

本の紹介

バックナンバー:VB.NETデータベースプログラミング

ADO.NETの基本的なプログラミングを中心に、すぐ使えるサンプルプログラム満載です。




【第29号】

 第29号(2005.7.29発行)
======================================================================
            ★★ VB.NETデータベースプログラミング奮闘記 ★★
----------------------------------------------------------------------
いつもご購読ありがとうございます。ADO.NETの基本的なプログラミングを中
心に掲載しますので、今後ともよろしくお願い申し上げます。

すぐ使えるADO.NET --> サンプルプログラム満載
                      http://park5.wakwak.com/‾weblab/
======================================================================
         ■■ VB.NETワンポイント:動的にインスタンスを生成 ■■

作成するオブジェクトの型を引数に指定して、Activatorクラスの
CreateInstanceメソッドを呼び出すことで、動的にインスタンスを生成するこ
とができます。今回は、動的に実行ファイル内のフォームクラスのインスタン
スを生成します。

System.Reflection名前空間には、動的に型を生成したり、呼び出すことができ
るAssemblyクラスがあります。

表示するフォームの型を取得するためには、AssemblyクラスのLoadFromメソッ
ドに、表示するフォームが存在する実行ファイル、たとえば"winApp.exe"を引
数に指定して呼び出します。さらに、GetTypeメソッドで、たとえばフォーム
"Form1"の型を取得して、ActivatorクラスのCreateInstanceメソッドで、イン
スタンスを生成します。生成されたインスタンスの戻り値は、Object型になり
ますので、データ変換関数CTypeでフォーム型に変換し、Formクラスのshowメ
ソッドを呼び出して表示します。

  'winApp.exeの読込
  Dim oExe As System.Reflection.Assembly = _
  System.Reflection.Assembly.LoadFrom("winApp.exe")

  '表示するフォームForm1の型を取得
  Dim oType As Type = oExe.GetType("winApp.Form1")

  'インスタンスの生成
  Dim oObj As Object = Activator.CreateInstance(oType)

  'CType関数でフォーム型に変換し、showメソッドで表示
  Dim oForm As Form
  oForm = CType(oObj, Form)
  oForm.Show()

今号では、動的にフォームのメニュー項目を生成することを利用して、テーブ
ルに登録したメニューを動的に生成するプログラムを作成しますが、ここで紹
介したクラスメソッドを利用します。

----------------------------------------------------------------------
          ■■ フォームに動的にメニューボタンを生成する ■■

メニューテーブルから、メニューグループ単位にメニューを読み込んで、動的
にボタンを生成し、ボタン形式のメニューを表示するプログラムを作成します。

メニューテーブルは、sample.mdbに下記のように作成して、あらかじめ数件の
レコード登録しておきます。仮に、テーブルのフォームIDに"frmMenu01",
"frmMenu02", "frmMenu03"を登録した場合には、対応するフォームfrmMenu01,
frmMenu02, frmMenu03を同一プロジェクトに追加します。
------------------------------------------------------------------
key フィールド名       データ型   サイズ  値要求  空文字列の許可
------------------------------------------------------------------
○ メニューグループ テキスト型   5 はい  いいえ
○ メニューID   テキスト型   5 はい  いいえ
− メニュー名称   テキスト型  40 はい  いいえ
− フォームID   テキスト型  16 はい  いいえ
− 更新日時     日付/時刻型  − はい  −
------------------------------------------------------------------

メニューを表示するためのプロジェクトをひとつ作成します。フォームに
は、コントロールはひとつも貼り付けません。フォームのStartPositionプロ
パティをCenterScreenに設定して、中央に表示するようにします。
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ メインメニュー                     _□×┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃
┃
┃
┃
┃
┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

それから、メニューから呼び出すフォームfrmMenu01をこのプロジェクトに
追加作成します。タイトルのラベルと終了用のボタンコントロールを貼り付け
ます。終了ボタンを押すと、このフォームを閉じて、メインメニューが表示さ
れます。フォームのStartPositionプロパティをCenterScreenに設定して、中
央に表示するようにします。
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ メニュー01                      _□×┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃   Label1            btnEnd
┃  ┌――――――――――┐   ┌―――┐
┃  │メニュー01    │   │終 了│
┃  └――――――――――┘   └―――┘
┃                                ┃
┃                                ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

同様にして、frmMenu02, frmMenu03もこのプロジェクトに追加します。

----------------------------------------------------------------------
フォームロードでは、clsDBIOクラスのgetMenuGroupメソッドを使って、
メニューテーブルから、指定したメニューグループのレコードを取得し、動的
にメニュー用のボタンを生成して、メインメニューのフォームに追加します。
このとき、Textプロパティや表示位置等のプロパティ値も設定します。また、
ボタンを押した時に呼び出すイベントハンドラaryBtnMenu_Clickも定義します。

メニュー用のボタンの動的に生成は、自動生成されるソースを参考にして、プ
ログラミングしています。コントロール生成の前後にある、SuspendLayout()と
ResumeLayout()は、画面のちらつき防止するために、レイアウト変更に関係す
る時発生するLayoutイベントを抑制するためのメソッドです。

呼び出されるフォームオブジェクトのスコープは、このプロジェクト内として、
Friend修飾子を使いました。必要なフォームはすべてこのプロジェクトに追加
します。

呼び出されたフォームを閉じた時に、呼び出し元のメニューフォームが表示さ
れるように、Ownerプロパティに呼び出し元フォームの参照を設定してから、
フォームを表示し、呼び出し元のフォームを隠します。

    oForm.Owner = Me
    oForm.Show()
    Me.Hide()

では、ソースリストを掲載します。clsDBIOクラスのに追加したgetMenuGroup
メソッドや、呼び出されるフォームクラスのソースリストは次号以降になりま
す。

--【プログラムソースリスト】------------------------------------------
Public Class Form1
  Inherits System.Windows.Forms.Form

#Region " Windows フォーム デザイナで生成されたコード "
  '自動生成部分省略
#End Region

  '呼び出されるフォーム
  Friend oForm As Form

  'メニューボタンコントロール配列
  Friend aryBtnMenu() As System.Windows.Forms.Button

  Private oTable As New DataTable()

  '----------<< フォームロード処理 >>----------
  Private Sub Form1_Load _
  (ByVal sender As System.Object, ByVal e As System.EventArgs) _
  Handles MyBase.Load

    Dim oTblMenu As New clsDBIO()

    'メニューグループのレコードをメニューテーブルから取得する
    oTable = oTblMenu.getMenuRec("m0001")

    'メニューの数だけボタンを生成
    Me.aryBtnMenu = _
      New System.Windows.Forms.Button(oTable.Rows.Count - 1) {}

    '描画を一時中止する(画面のちらつき防止)
    Me.SuspendLayout()

    'メニューの数だけボタンのインスタンス生成
    '(自動生成ソースを参考にしてコーディング)
    Dim i As Integer
    For i = 0 To Me.aryBtnMenu.Length - 1
      'ボタンのインスタンス生成
      Me.aryBtnMenu(i) = New System.Windows.Forms.Button()
      'ボタンのプロパティ設定
      Me.aryBtnMenu(i).Location = New Point(50, i * 30 + 50)
      Me.aryBtnMenu(i).Name = _
        "btn" + CStr(oTable.Rows(i).Item(3))
      Me.aryBtnMenu(i).Size = New Size(200, 25)
      Me.aryBtnMenu(i).Text = CStr(oTable.Rows(i).Item(2))
      'AddHandlerステートメントでボタンクリック時のイベントハンドラ定義
      AddHandler Me.aryBtnMenu(i).Click, AddressOf Me.aryBtnMenu_Click
    Next i

    'フォームのControlsプロパティのAddRangeでフォームに
    'ボタンコントロールを追加
    Me.Controls.AddRange(Me.aryBtnMenu)

    '描画を再開する
    Me.ResumeLayout(False)
  End Sub

  'Buttonのクリックイベントハンドラ
  Private Sub aryBtnMenu_Click(ByVal sender As Object, _
  ByVal e As EventArgs)

    '表示するフォーム名(先頭の"btn"を削除する)を取得
    Dim frmName As String
    frmName = DirectCast(sender, Button).Name.Remove(0, 3)

    '表示するフォームの型を取得
    Dim oType As Type = _
    Reflection.[Assembly].LoadFrom("TextBoxBind.exe"). _
    GetType("TextBoxBind." + frmName)

    'フォームの型からインスタンス作成
    Dim oObj As Object = _
    Activator.CreateInstance(oType, New Object() {})

    '作成したインスタンスをフォーム型に変換してShowメソッドで表示
    oForm = CType(oObj, Form)
    'oFormフォームの親にあたるフォームfrmMenuの参照設定
    oForm.Owner = Me

    oForm.Show()

    Me.Hide()

  End Sub

End Class

----------------------------------------------------------------------
              ■■ 次号予告 第30号(8月下旬発行予定) ■■
1. VB.NETワンポイント
2. フォームに動的にメニューボタンを生成する 2
======================================================================
VB.NET データベースプログラミング奮闘記
          http://park5.wakwak.com/‾weblab/
----------------------------------------------------------------------
このメールマガジン(マガジンID: 0000128094)は、
インターネットの本屋さん『まぐまぐ』から配信されています。
  http://www.mag2.com/

【購読中止の方法】購読の中止は次のホームページからお願い致します。
  http://park5.wakwak.com/‾weblab/
  http://www.mag2.com/m/0000128094.htm
----------------------------------------------------------------------
このメールマガジン及び、「すぐ使えるADO.NET」ホームページで公開してい
るソースプログラム・データの利用により生じた損害等については、発行者は
一切責任を負いません。
ソースプログラムの再利用は自由です。著作権は発行者が所有します。
このメールマガジン及び、「すぐ使えるADO.NET」ホームページに掲載されて
いる会社名・製品名等は、各社の登録商標または商標です。
======================================================================

Copyright© すぐ使えるADO.NET. All rights reserved.