フォーム、レポート、またはデータ アクセス ページでフォルダーの画像を表示する方法

元の KB 番号: 285820

注:

専門的なコーディング、相互運用性、マルチユーザー スキルが必要です。 この記事は、Microsoft Access データベース (.mdb/.accdb) と Microsoft Access プロジェクト (.adp) に適用されます。

概要

場合によっては、Microsoft Access テーブルにイメージを格納することは実用的ではありません。 イメージが多数ある場合、または各イメージ ファイルが大きい場合は、Microsoft Access データベース ファイルのサイズがすぐに大きくなる可能性があります。

この記事では、次の目的で使用できるカスタム関数を示します。

  • ファイル パスとイメージの名前をテーブルに格納します。
  • イメージ コントロールを使用して画像を表示します。
  • 使用可能なイメージがない場合は、イメージ コントロールを非表示にします。
  • 画像の表示状態に関するフィードバックを提供します。

この記事には、データ アクセス ページに画像を表示するために使用できる Visual Basic スクリプトのサンプルも含まれています。

注:

この例ではビットマップ イメージ (.bmp) を使用しますが、.jpg、.pcx、.gif など、他の種類のイメージを使用することもできます。

Microsoft は、例示のみを目的としてプログラミング例を提供しており、明示または黙示にかかわらず、いかなる責任も負わないものとします。 これには、市販性または特定の目的との適合性についての黙示の保証も含まれますが、これに限定はされません。 この記事は、説明されているプログラミング言語、手順を作成およびデバッグするために使用されているツールに読者が精通していることを前提にしています。 マイクロソフト サポート窓口では、特定のプロシージャの機能説明に関するご質問に対して支援いたしますが、本例を特定の目的を満たすために機能を追加したり、プロシージャを構築することは行いません。

ファイルとパスのデータを格納するテーブルの作成

  1. サンプル データベース、Northwind.mdb、またはサンプル プロジェクト NorthwindCS.adp を開きます。

  2. 次の表を Northwind.mdb または NorthwindCS.adp に作成します。

    In Northwind.mdb:

    Table: tblImage
    ----------------------------
    Field Name: ImageID
    Data Type: AutoNumber
    Indexed: Yes (No Duplicates)
    
    Field Name: txtImageName
    Data Type: Text
    
    Table Properties: tblImage
    --------------------------
    PrimaryKey: ImageID
    

    In NorthwindCS.adp:

    Table: tblImage
    -----------------------
    Column Name: ImageID
    Datatype: Int
    Allow Nulls: Unchecked
    Identity: Yes
    
    Column Name: txtImageName
    Datatype: varchar
    
    Table Properties: ImageTable
    -------------------------------
    Primary Key Constraint: ImageID
    
  3. データシート ビューで tblImage テーブルを開き、ビットマップ ファイルのパスと名前を各レコードに追加します。 次の例の表は、レコードがどのように表示されるかを示しています。

    Absolute (Local) C:\Windows\Zapotec.bmp
    Absolute (UNC パス) \\Servername\sharename\Zapotec.bmp
    Relative Zapotec.bmp

カスタム関数の作成

  1. 新しいモジュールを作成し、次のコードを貼り付けるか入力します。

    Option Compare Database
    Option Explicit
    
    Public Function DisplayImage(ctlImageControl As Control, strImagePath As Variant) As String
    On Error GoTo Err_DisplayImage
    
    Dim strResult As String
    Dim strDatabasePath As String
    Dim intSlashLocation As Integer
    
    With ctlImageControl
     If IsNull(strImagePath) Then
         .Visible = False
         strResult = "No image name specified."
     Else
         If InStr(1, strImagePath, "\") = 0 Then
             ' Path is relative
             strDatabasePath = CurrentProject.FullName
             intSlashLocation = InStrRev(strDatabasePath, "\", Len(strDatabasePath))
             strDatabasePath = Left(strDatabasePath, intSlashLocation)
             strImagePath = strDatabasePath & strImagePath
         End If
         .Visible = True
         .Picture = strImagePath
         strResult = "Image found and displayed."
     End If
    End With
    
    Exit_DisplayImage:
     DisplayImage = strResult
     Exit Function
    
    Err_DisplayImage:
     Select Case Err.Number
         Case 2220       ' Can't find the picture.
             ctlImageControl.Visible = False
             strResult = "Can't find image in the specified name."
             Resume Exit_DisplayImage:
         Case Else       ' Some other error.
             MsgBox Err.Number & " " & Err.Description
             strResult = "An error occurred displaying image."
             Resume Exit_DisplayImage:
     End Select
    End Function
    
  2. モジュールを Module1 として保存します。

フォームでのカスタム関数の使用

  1. tblImage テーブルに基づく次の新しいフォームを作成します。

    Form: frmImage
    ----------------------
    Caption: Image Form
    RecordSource: tblImage
    
    Image Control
    ---------------------------------
    Name: ImageFrame
    Picture: "C:\Windows\Zapotec.bmp"
    
    Text box
    ----------------------
    Name: txtImageID
    ControlSource: ImageID
    
    Text box
    ---------------------------
    Name: txtImageName
    ControlSource: txtImageName
    
    Text box
    ---------------------------
    Name: txtImageNote
    ControlSource: <Blank>
    

    注:

    フォームにパスを表示しない場合は、コントロールのtxtImageNameプロパティを VisibleFalse に設定できます。

  2. [ 表示 ] メニューの [ コード] をクリックし、次のコードを貼り付けるか入力します。

    Option Compare Database
    Option Explicit
    
    Private Sub Form_AfterUpdate()
     CallDisplayImage
    End Sub
    
    Private Sub Form_Current()
     CallDisplayImage
    End Sub
    
    Private Sub txtImageName_AfterUpdate()
     CallDisplayImage
    End Sub
    
    Private Sub CallDisplayImage()
     Me!txtImageNote = DisplayImage(Me!ImageFrame, Me!txtImageName)
    End Sub
    
  3. フォーム ビューで frmImage フォームを開きます。 フォームには、各レコードの対応するビットマップが表示されることに注意してください。 フィールドが txtImageName 空白の場合、またはイメージが見つからない場合は、イメージ フレームではなく適切なメッセージを受け取ります。

レポートでのカスタム関数の使用

  1. ImageTable テーブルに基づく次の新しいレポートを作成します。

    Report: rptImage
    ----------------------
    Caption: Image Report
    RecordSource: tblImage
    
    Image Control
    ---------------------------------
    Name: ImageFrame
    Picture: "C:\Windows\Zapotec.bmp"
    
    Text box
    ----------------------
    Name: txtImageID
    ControlSource: ImageID
    
    Text box
    ---------------------------
    Name: txtImageName
    ControlSource: txtImageName
    
    Text box
    ---------------------------
    Name: txtImageNote
    ControlSource: <Blank>
    

    注:

    パスをレポートに表示しない場合は、コントロールのtxtImageNameプロパティを VisibleFalse に設定できます。

  2. [ 表示 ] メニューの [ コード] をクリックし、次のコードを貼り付けるか入力します。

    Option Compare Database
    Option Explicit
    
    Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
     Me!txtImageNote = DisplayImage(Me!ImageFrame, Me!txtImageName)
    End Sub
    
  3. 印刷プレビューで rptImage レポートを開きます。 レポートには、レコードごとに対応するビットマップが表示されることに注意してください。 フィールドが txtImageName 空白の場合、またはイメージが見つからない場合は、イメージ フレームではなく適切なメッセージを受け取ります。

データ アクセス ページでのカスタム関数の複製

  1. tblImage テーブルに基づく次の新しいデータ アクセス ページを作成します。

    Data Access Page: dapImage
    -----------------------------
    Title: Image Data Access Page
    
    Image Control
    ---------------------------------
    ID: ImageFrame
    
    Text box
    ----------------------
    ID: txtImageID
    ControlSource: ImageID
    
    Text box
    ---------------------------
    ID: txtImageName
    ControlSource: txtImageName
    

    注:

    パスをページに表示しない場合は、コントロールのtxtImageNameプロパティを VisibilityHidden に設定できます。

  2. [ツール] メニューの [マクロ] をポイントし、[Microsoft Script Editor] をクリックします。

  3. 次のスクリプトを、HTML ドキュメントの HEAD タグ部分の MSODSC の Current イベントに追加します。

    注:

    イベントをトリガーするには、パラメーターを渡す必要があります。

    <SCRIPT language=vbscript event=Current(oEventInfo) for=MSODSC>
    <!--
    ImageFrame.src=txtImageName.value
    -->
    </SCRIPT>
    
  4. ページ ビューで dapImage ページを開きます。 ページには、レコードごとに対応するビットマップが表示されることに注意してください。 txtImageName フィールドが空白の場合は、コントロール アイコンが表示されます。 イメージが見つからない場合は、イメージ コントロールに X アイコンが表示されます。

フォームで http:// パスを使用する

フォームで http:// パスを使用するには、次のように Web ブラウザー コントロール (shdocvw.dll) を使用します。

  1. Microsoft Web Browser コントロールをフォームに追加し、WebBrowser という名前を付けます。

  2. モジュールに次のコードを追加します。

    Public Function DisplayImageWeb(ctlBrowserControl As Control, _
    strImagePath As Variant)
    
    On Error GoTo Err_DisplayImage
    
    Dim strDatabasePath As String
    Dim intSlashLocation As Integer
    
    With ctlBrowserControl
     If IsNull(strImagePath) Then
     ElseIf Left(strImagePath, 4) = "http" Then
         .Navigate (strImagePath)
     Else
         If InStr(1, strImagePath, "\") = 0 Then
             ' Path is relative
             strDatabasePath = CurrentProject.FullName
             intSlashLocation = InStrRev(strDatabasePath, "\", Len(strDatabasePath))
             strDatabasePath = Left(strDatabasePath, intSlashLocation)
             strImagePath = strDatabasePath & strImagePath
         End If
         .Navigate (strImagePath)
     End If
    End With
    
    Exit_DisplayImage:
     Exit Function
    
    Err_DisplayImage:
     Select Case Err.Number
         Case Else
             MsgBox Err.Number & " " & Err.Description
             Resume Exit_DisplayImage:
     End Select
    End Function
    
  3. フォームの背後に次のコードを追加します。

    Option Compare Database
    Option Explicit
    
    Private Sub Form_AfterUpdate()
     CallDisplayImage
    End Sub
    
    Private Sub Form_Current()
     CallDisplayImage
    End Sub
    
    Private Sub txtImageName_AfterUpdate()
     CallDisplayImage
    End Sub
    
    Private Sub CallDisplayImage()
     DisplayImageWeb Me.WebBrowser9, Me.txtImageName
    End Sub