【第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.