バックナンバー: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」ホームページに掲載されて
いる会社名・製品名等は、各社の登録商標または商標です。
======================================================================
↑このページ(メルマガ:VB.NETデータベース) 先頭へ | すぐ使えるADO.NET ホームへ
Copyright© すぐ使えるADO.NET. All rights reserved.