Accessお手本データベースのホームへ戻る

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

 

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

 

オプションボタン

Yes

1

No

2



 

 

4-7-4 フォームにテキストボックス、イメージ、タブコントロール、レコード移動ボタン、オプショングループを作成した例

 

6 メニューからコードのアイコンをクリックしてフォームモジュールを表示させたら、 CH4-7..mdbfrmImageのフォームモジュールをコピーして貼り付けます。フォームモジュールのソースコードは、リスト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のレジストリからGIFShowProgressDialogの値(Yes/No)を取得して、オプショングループのラジオボタンを更新します。ShowProgressDialogの値は、RegGetKeyValue_FS()関数を呼び出しで取得します。この関数は、basRegistryに登録されていますので、詳細はそちらを参照してください。

 

4-7-5 WindowsのレジストリからGIFShowProgressDialogの値を取得

 

 

Sub Form_Current()イベントの処理

このイベントは、カレントレコードが移動するときに実行されます。尚、このイベントは、フォームを最初に開いたときも発生します。このイベントでは、テキストボックス(ImagePath)に表示されているイメージをロードして表示します。イメージは、イメージコントロールのPictureプロパティに、GIFのフルパス名を設定すると自動的にロードされます。GIFのパス名を取得するには、CurrentProjectPathメソッドを使用します。Pathメソッドでは、カレントのデータベースのパスを取得します。例えば、作業フォルダ C:\TempCH4-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 のコマンドウィザードを使用して、レコード移動用のコマンドボタンを作成すると、DoCmdGotoRecordメソッドが使用されます。ここで使用する関数では、RecordsetMoveFirst, 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

再使用できるコントロールを作成するには:

 

レコード移動用のコマンドボタンのように、クリック時のイベント処理をフォームモジュールに記述しないで、関数を埋め込むと新規作成のフォームで再使用するときに便利です。

 

フォームモジュールにイベント処理を記述したときは、コマンドボタンを新規に作成したフォームにコピーして貼り付けても、イベント処理はコピーされません。ところが、プロパティのイベントに関数を埋め込んでおくと、コマンドボタンをコピーすると、プロパティも一緒にコピーされますのでイベント処理が自動的に組み込まれます。

 

 

ダウンロード (CH4-7.lzh)
Accessお手本データベースのホームへ戻る