フォーム上にイメージを表示するお手本データベース

図4-7-1 実行時にイメージをロードしてフォーム上に表示するサンプルデータベース
このサンプルデータベースは、イメージを実行時にロードしてフォーム上に表示します。顔写真や商品などのイメージをフォーム上に表示するには、イメージをテーブルのOLEオブジェクトに埋め込んでフォームと連結させるのが一般的です。レコード件数が少ないときは、この方式でイメージを表示しても特に問題ないのですが、数千件を超えるような比較的大規模なテーブルにイメージを埋め込むと、テーブルが肥大化してパフォーマンスが極端に低下します。
ここで紹介するサンプルデータベースは、この不都合を回避するためにイメージをテーブルに埋め込まないで、実行時ダイナミックにロードして表示します。この方式を採用すると、高速スクロールするときイメージを非表示にすることも可能です。
サンプルデータベース(CH4-7.mdb)では、以下のノウハウを習得することができます。
◆ フォルダに格納されているイメージをダイナミックにロードしてフォーム上に表示する方法
◆ イメージがロードされるときに表示される読み込み中のダイアログを非表示にする方法
◆ 複数のコントロールを同時に可視/非可視状態に切り替える方法
◆ フォーム独自のレコード移動ボタンを作成する方法
◆ Windowsのレジストリを更新する方法
● イメージをダイナミックにロードして表示するフォームを作成するには
1 作業フォルダを作成して、CH4-7のフォルダからサンプルイメージContacts.gif, Expenses.gif, Ordproc.gif, Service.gifをコピーします。
2 Access を起動したら作業フォルダに、新規データベース CH4-7.mdbを作成します。
3 データベースウィンドウからテーブル
をクリックしたら、新規作成のボタンをクリックします。テーブルの新規作成ダイアログが表示されたら、一覧からデザインビューを選択してOKボタンをクリックします。テーブルのデザインビューが表示されたら、フィールド名にID, ImagePathを入力します。IDフィールドを選択したら、メニューから主キーのアイコン
をクリックして主キーを設定します。テーブルをtblImageの名称で保存します。
![]()
図4-7-2 フィールド名にID, ImagePathフィールドを入力してtblImageの名称で保存する
4 テーブルtblImageを開いたら、ImagePathフィールドに項番1でコピーしたGIFのファイル名を入力します。IDは、オートナンバー型ですから自動採番されます。ファイル名を入力したらテーブルを保存して閉じます。

図4-7-3 GIFのファイル名を入力
5 データベースウィンドウからフォーム
をクリックして、新規作成ボタンをクリックします。新規作成ダイアログが表示されたら、一覧からデザインビューを選択します。基になるテーブル/クエリのコンボから、tblImageを選択します。OKボタンをクリックしてダイアログを閉じます。フォームのデザインビューが表示されたら、メニューからフィールドリストのアイコン
をクリックして、tblImageのフィールドリストを表示させます。フィールドリストから、ImagePathをドラッグしてフォーム上位に貼り付けます。ラベルの標題を”ImagePath”に書き替えます。
ツールボックスから、イメージのアイコン
をクリックしてフォーム中央に貼り付けます。図の挿入のダイアログが表示されたら、作業フォルダにコピーしたService.gifを選択してOKボタンをクリックします。イメージのプロパティを表示したら、コントロール名をimgImageDisplayに書き替えます。ピクチャに格納されているイメージのフルパス名は、実行時再設定しますから削除します。
ツールボックスからタブコントロールのアイコン
をクリックしてイメージの下に配置します。デフォルトで2ページのタブが作成されますので1ページ削除します。タブコントロールのプロパティを表示したら、コントロール名をtabRecordNaviに書き替えます。背景スタイルを”透明”、スタイルを”なし”に設定して四角形のようなコントロールにします。このタブコントロールは、レコード移動用のコマンドボタンを一括して可視/非可視状態に切り替えるために使用します。タブコントロールのページ1を選択したら、ツールボックスからコマンドボタンのアイコン
をクリックしてレコード移動用のコマンドボタンを4個作成します。コマンドボタンは、左から順番に先頭レコード、前のレコード、次のレコード、最後のレコードの順に作成します。各コマンドボタンのクリック時のイベントには、表4-7-1に示す関数を埋め込みます。
最後に、ツールボックスからオプショングループのアイコン
をクリックして、2個のオプションボタンから成るオプショングループを作成します。オプショングループのプロパティを表示したら、コントロール名をfraShowProgressDialogに書き替えます。
表4-7-1 フォームに作成したコントロールのプロパティ
|
コントロールの種類 |
プロパティ |
値 |
||||||
|
テキストボックス |
コントロールソース |
ImagePath |
||||||
|
イメージ |
名前 |
imgImageDisplay |
||||||
|
ピクチャ |
なし |
|||||||
|
OLEサイズ |
クリップ |
|||||||
|
ピクチャ配置 |
中央 |
|||||||
|
タブコンコントロール |
名前 |
tabRecordNavi |
||||||
|
背景スタイル |
透明 |
|||||||
|
スタイル |
なし |
|||||||
|
可視 |
実行時再設定 |
|||||||
|
コマンドボタン1 |
名前 |
cmdMoveFirst |
||||||
|
クリック時 |
=MoveFirst_FS([Form]) |
|||||||
|
コマンドボタン2 |
名前 |
cmdMovePrevious |
||||||
|
クリック時 |
=MovePrevious_FS([Form]) |
|||||||
|
コマンドボタン3 |
名前 |
cmdMoveNext |
||||||
|
クリック時 |
=MoveNext_FS([Form]) |
|||||||
|
コマンドボタン4 |
名前 |
cmdMoveLast |
||||||
|
クリック時 |
=MoveLast_FS([Form]) |
|||||||
|
オプショングループ |
名前 |
fraShowProgressDialog
|

図4-7-4 フォームにテキストボックス、イメージ、タブコントロール、レコード移動ボタン、オプショングループを作成した例
6 メニューからコードのアイコン
をクリックしてフォームモジュールを表示させたら、 CH4-7..mdbのfrmImageのフォームモジュールをコピーして貼り付けます。フォームモジュールのソースコードは、リスト4-7-1を参照してください。
7 フォームをビューモードで開いたら、レコード移動ボタンをクリックしてテキストボックス(ImagePath)に表示されているファイル名(*.GIF)のイメージがロードされるか確認します。レコードを移動すると、イメージ読み込み中のダイアログが表示されます。このダイアログを非表示にするには、オプショングループ(Show Progress Dialog)の”No”をクリックします。オプションボタンをクリックすると、Windowsのレジストリを更新します。Windowsのレジストリの情報を有効にするには、Access を一旦終了させて、再起動する必要があります。フォームをfrmImageの名称で保存したら、Access を再起動してください。frmImageをビューモードで表示したら、オプショングループ(Show Progress Dialog)が”No”に設定されていることを確認します。Show Progress Dialogが”No”に設定されているため、レコードの移動ボタンをクリックしてイメージを切り替えても、イメージ読み込み中のメッセージは表示されません。
8 イメージが正常に表示されることを確認したら、Access を終了します。
Sub Form_Open()イベントの処理
このイベントは、フォームが開かれたときに実行されます。このイベントでは、WindowsのレジストリからGIFのShowProgressDialogの値(Yes/No)を取得して、オプショングループのラジオボタンを更新します。ShowProgressDialogの値は、RegGetKeyValue_FS()関数を呼び出しで取得します。この関数は、basRegistryに登録されていますので、詳細はそちらを参照してください。

図4-7-5 WindowsのレジストリからGIFのShowProgressDialogの値を取得
Sub Form_Current()イベントの処理
このイベントは、カレントレコードが移動するときに実行されます。尚、このイベントは、フォームを最初に開いたときも発生します。このイベントでは、テキストボックス(ImagePath)に表示されているイメージをロードして表示します。イメージは、イメージコントロールのPictureプロパティに、GIFのフルパス名を設定すると自動的にロードされます。GIFのパス名を取得するには、CurrentProjectのPathメソッドを使用します。Pathメソッドでは、カレントのデータベースのパスを取得します。例えば、作業フォルダ C:\TempにCH4-7.mdbを作成したときは、C:\Tempがパスとして返されます。Pathメソッドで取得したパス名に、”\”とGIFのファイル名を連結するとフルパス名になります。
C:\Temp\Service.gif
尚、このイベントでは、イメージロード中にレコード移動ボタンをクリックしないように移動ボタンを非可視状態にしています。(イメージロード中に、レコードを移動すると異常終了することがあるため、この不都合を回避しています。)通常、複数のコントロールを非可視状態にするには、それぞれのコントロールのVisibleプロパティを“False”に設定します。ここでは、タブコントロールのVisibleプロパティを”False”に設定することにより、4個のコマンドボタンを一括して非可視状態にしています。
Sub fraShowProgressDialog_AfterUpdate()イベントの処理
このイベントは、オプショングループのラジオボタンをクリックしたときに実行されます。このイベントでは、オプショングループの値を元にWindowsのレジストリのShowProgressDialogの値を更新します。レジストリの値は、RegSetKeyValueString_FS()関数を呼び出して更新します。この関数は、basRegistryに登録されていますので、詳細はそちらを参照してください。
Function
MoveFirst_FS()/MovePrevious_FS()/MoveNext_FS()/MoveLast_FS()関数の処理
これらの関数は、レコード移動用のコマンドボタンをクリックしたときに実行されます。これらの関数は、basRecordNavigationモジュールに登録されていますので、詳細はそちらを参照してください。Access のコマンドウィザードを使用して、レコード移動用のコマンドボタンを作成すると、DoCmdのGotoRecordメソッドが使用されます。ここで使用する関数では、RecordsetのMoveFirst, MovePrevious, MoveNext, MoveLastメソッドを使用して実現しています。
リスト4-7-1 frmImageのフォームモジュール
|
Option Compare Database Option Explicit Private Sub Form_Current() On Error Resume Next With Me .tabRecordNavi.Visible = False .imgImageDisplay.Picture = _ CurrentProject.Path & "\" & .ImagePath .tabRecordNavi.Visible = True End With End Sub Private Sub Form_Open(Cancel As Integer)
Dim varValue As Variant ' Yes/No Call SetAppTitle_FS("Display Image (C) " _ & Year(Date) & " by Akio Kasai")
varValue = RegGetKeyValue_FS(HKEY_LOCAL_MACHINE, _ "Software\Microsoft\Shared Tools\" _ & "Graphics Filters\Import\GIF\Options", _ "ShowProgressDialog") Me.fraShowProgressDialog = IIf(varValue = "Yes", 1, 2)
End Sub Private Sub fraShowProgressDialog_AfterUpdate() Dim fOK As Boolean fOK = RegSetKeyValueString_FS(HKEY_LOCAL_MACHINE, _ "Software\Microsoft\Shared Tools\" _ & "Graphics Filters\Import\GIF\Options", _ "ShowProgressDialog", _ IIf(Me.fraShowProgressDialog = 1, "Yes", "No")) End Sub |
リスト4-7-2 basRecordNavigationに登録されているレコード移動用の関数
|
Option Compare Database Option Explicit Public Function MoveFirst_FS(frm As Form) As Integer On Error GoTo Err_MoveFirst_FS frm.Recordset.MoveFirst Exit_MoveFirst_FS: MoveFirst_FS = Err.Number Exit Function Err_MoveFirst_FS: MsgBox Err.Description, vbInformation, Err.Number Resume Exit_MoveFirst_FS End Function Public Function MovePrevious_FS(frm As Form) As Integer On Error GoTo Err_MovePrevious_FS frm.Recordset.MovePrevious Exit_MovePrevious_FS: MovePrevious_FS = Err.Number Exit Function Err_MovePrevious_FS: With Err Select Case .Number Case 2105, 3021 .Clear frm.Recordset.MoveLast Case Else MsgBox .Description, vbInformation, .Number End Select End With Resume Exit_MovePrevious_FS End Function Public Function MoveNext_FS(frm As Form) As Integer On Error GoTo Err_MoveNext_FS frm.Recordset.MoveNext Exit_MoveNext_FS: MoveNext_FS = Err.Number Exit Function Err_MoveNext_FS: With Err Select Case .Number Case 2105, 3021 .Clear frm.Recordset.MoveFirst Case Else MsgBox .Description, vbInformation, .Number End Select End With Resume Exit_MoveNext_FS End Function Public Function MoveLast_FS(frm As Form) As Integer On Error GoTo Err_MoveLast_FS frm.Recordset.MoveLast Exit_MoveLast_FS: MoveLast_FS = Err.Number Exit Function Err_MoveLast_FS: MsgBox Err.Description, vbInformation, Err.Number Resume Exit_MoveLast_FS End Function |
Tip
|
再使用できるコントロールを作成するには: レコード移動用のコマンドボタンのように、クリック時のイベント処理をフォームモジュールに記述しないで、関数を埋め込むと新規作成のフォームで再使用するときに便利です。 フォームモジュールにイベント処理を記述したときは、コマンドボタンを新規に作成したフォームにコピーして貼り付けても、イベント処理はコピーされません。ところが、プロパティのイベントに関数を埋め込んでおくと、コマンドボタンをコピーすると、プロパティも一緒にコピーされますのでイベント処理が自動的に組み込まれます。 |