すぐ使えるADO.NET

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

本の紹介

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

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




【第31号】

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

すぐ使えるADO.NET --> サンプルプログラム満載
                      http://park5.wakwak.com/‾weblab/
======================================================================
     ■■ VB.NETワンポイント:フォームクラスのコンストラクタ ■■

引数が無いコンストラクタを、デフォルトコンストラクタといいます。Windows
アプリケーションのプロジェクトを新規に作成すると、#Region と #End Region
の間に、

    Public Sub New()
        MyBase.New()

        ' この呼び出しは Windows フォーム デザイナで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後に初期化を追加します。

    End Sub

のデフォルトコンストラクタが自動的に生成されます。

自動生成部分は、追加や変更することなくプロジェクトを構築することができ
ますが、「' InitializeComponent() 呼び出しの後に初期化を追加します。」
の部分に手を加えることもできます。

コンストラクタを追加することもできます。引数の数が違っていたり、引数の
数が同じでも、引数の型が異なれば、いくつでもコンストラクタを追加するこ
とができます。

今回は、このことを利用して、メインメニューフォームクラスのオブジェクト
の参照を、コンストラクタの引数に指定して、

  Public Sub New(ByVal perForm As Form)

を、#Region と #End Regionの間の Public Sub New() の次に追加定義します。

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

コンストラクタに、メインメニューフォームの参照を引数に指定して、呼び出
すフォームのオブジェクト(インスタンス)を作成する方法について説明します。

呼び出されるフォームクラスには、自動生成された引数のないコンストラクタ
しかありませんから、フォームクラスの参照を引数に指定するコンストラクタ
を追加します。自動生成された引数なしのコンストラクタをコピーして、必要
な処理を追加します。

呼び出されるフォームクラスには、メインメニューフォームクラスのオブジェ
クトの参照を保持するPrivateなメンバ変数を宣言します。追加したコンスト
ラクタでは、引数をこのメンバ変数に代入する処理を1行追加します。

    Private mForm As Form

    Public Sub New(ByVal perForm As Form)
        MyBase.New()

        ' この呼び出しは Windows フォーム デザイナで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後に初期化を追加します。
        mForm = perForm       '◆この1行が追加部分

    End Sub

前号では、終了ボタン、フォーム右上の×ボタン、及び Alt + F4 キー押下時
のイベントハンドラの記述は、Ownerプロパティに設定した参照から、showメ
ソッドを呼び出して、親フォームを再表示していました。

  oMenuForm = Me.Owner
  oMenuForm.Show()

今回は、mFormを操作して、

  mForm.Show()

として、親メニューを再表示するように変更します。

再表示が終わったら、Disposeメソッドを呼び出して破棄します。念のため、
破棄する前に、フォームインスタンスが存在することを If Not Me Is Nothing
で確認して、mForm の参照を解放しておきます。

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

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

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

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

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

        Dim oTblMenu As New clsDBIO()
        Dim oTable As New DataTable()

        'メニューをメニューテーブルから取得するメソッド
        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() {Me})

        '作成したインスタンスをフォーム型に変換してShowメソッドで表示
        oForm = CType(oObj, Form)

        oForm.Show()

        Me.Hide()

    End Sub

End Class


'◆ 呼び出されるフォームクラス
Public Class frmMenu01
    Inherits System.Windows.Forms.Form

#Region " Windows フォーム デザイナで生成されたコード "

    Public Sub New()
        MyBase.New()

        ' この呼び出しは Windows フォーム デザイナで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後に初期化を追加します。

    End Sub

    '--------------------------- 追加 -------------------------------
    Private mForm As Form

    Public Sub New(ByVal perForm As Form)
        MyBase.New()

        ' この呼び出しは Windows フォーム デザイナで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後に初期化を追加します。
        mForm = perForm

    End Sub

    '----------------------------------------------------------------

    '----- 以下自動生成部分省略 -----

#End Region

    Private Sub btnEnd_Click( _
    ByVal sender As System.Object, ByVal e As System.EventArgs _
    ) Handles btnEnd.Click

        Me.formClose()

    End Sub

    Private Sub frmMenu01_Closing( _
    ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs _
    ) Handles MyBase.Closing

        Me.formClose()

    End Sub

    Private Sub formClose()

        Try
            mForm.Show()
        Finally
            If Not Me Is Nothing Then
                mForm = Nothing
                Me.Dispose()
            End If
        End Try

    End Sub

End Class

----------------------------------------------------------------------
            ■■ 次号予告 第32号(10月12日発行予定) ■■
1. VB.NETワンポイント
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.