Jak wyświetlać obrazy z folderu w formularzu, raporcie lub na stronie dostępu do danych

Oryginalny numer KB: 285820

Uwaga

Wymaga specjalistycznego kodowania, współdziałania i wielodostępnych umiejętności. Ten artykuł dotyczy bazy danych programu Microsoft Access (.mdb/.accdb) i projektu programu Microsoft Access (.adp).

Podsumowanie

Czasami przechowywanie obrazów w tabeli programu Microsoft Access nie jest praktyczne. Jeśli masz wiele obrazów lub jeśli każdy z plików obrazów jest duży, rozmiar pliku bazy danych programu Microsoft Access może szybko wzrosnąć.

W tym artykule przedstawiono funkcję niestandardową, która umożliwia:

  • Przechowuj ścieżki plików i nazwy obrazów w tabeli.
  • Wyświetlanie obrazów przy użyciu kontrolki obrazu.
  • Ukryj kontrolkę obrazu, jeśli żaden obraz nie jest dostępny.
  • Przekaż opinię na temat stanu wyświetlania obrazu.

Ten artykuł zawiera również przykładowy skrypt języka Visual Basic, którego można użyć do wyświetlania obrazów na stronie dostępu do danych.

Uwaga

Chociaż w tym przykładzie są używane obrazy mapy bitowej (.bmp), można również użyć innych typów obrazów, takich jak .jpg, pcx i .gif.

Firma Microsoft podaje przykłady programowania tylko dla celów ilustracyjnych, nie udzielając żadnej rękojmi, wyrażonej wprost ani dorozumianej, w tym także, ale nie tylko, dorozumianej rękojmi co do przydatności handlowej lub do określonych celów. W tym artykule zakłada się, że czytelnik zna demonstrowany język programowania oraz narzędzia używane do tworzenia i debugowania procedur. Wykwalifikowani pracownicy pomocy technicznej firmy Microsoft mogą pomóc w wyjaśnieniu, jak działa określona procedura, ale nie będą modyfikować tych przykładów ani dodawać żadnych funkcji i konstruować nowych procedur w celu dostosowania ich do określonych potrzeb użytkownika.

Tworzenie tabeli do przechowywania danych plików i ścieżek

  1. Otwórz przykładową bazę danych, Northwind.mdb lub przykładowy projekt NorthwindCS.adp.

  2. Utwórz następującą tabelę w Northwind.mdb lub w pliku NorthwindCS.adp.

    W 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
    

    W pliku 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. Otwórz tabelę tblImage w widoku arkusza danych, a następnie dodaj ścieżkę i nazwę pliku mapy bitowej do każdego rekordu. Poniższa tabela przykładów pokazuje, jak mogą wyglądać rekordy:

    Wpisać Przykład
    Wartość bezwzględna (lokalna) C:\Windows\Zapotec.bmp
    Bezwzględne (ścieżka UNC) \\Servername\sharename\Zapotec.bmp
    Względne Zapotec.bmp

Tworzenie funkcji niestandardowej

  1. Utwórz nowy moduł, a następnie wklej lub wpisz następujący kod:

    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. Zapisz moduł jako moduł Module1.

Używanie funkcji niestandardowej w formularzu

  1. Utwórz następujący nowy formularz oparty na tabeli 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>
    

    Uwaga

    Jeśli nie chcesz, aby ścieżka była wyświetlana w formularzu, możesz ustawić Visible właściwość kontrolki na txtImageNamewartość False.

  2. W menu Widok kliknij pozycję Kod, a następnie wklej lub wpisz następujący kod:

    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. Otwórz formularz frmImage w widoku Formularz. Należy pamiętać, że formularz wyświetla odpowiednią mapę bitową dla każdego rekordu. txtImageName Jeśli pole jest puste lub nie można odnaleźć obrazu, otrzymasz odpowiednie komunikaty zamiast ramki obrazu.

Używanie funkcji niestandardowej w raporcie

  1. Utwórz następujący nowy raport oparty na tabeli 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>
    

    Uwaga

    Jeśli nie chcesz, aby ścieżka była wyświetlana w raporcie, możesz ustawić Visible właściwość kontrolki na txtImageNamewartość False.

  2. W menu Widok kliknij pozycję Kod, a następnie wklej lub wpisz następujący kod:

    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. Otwórz raport rptImage w wersji zapoznawczej wydruku. Należy pamiętać, że raport wyświetla odpowiednią mapę bitową dla każdego rekordu. txtImageName Jeśli pole jest puste lub nie można odnaleźć obrazu, otrzymasz odpowiednie komunikaty zamiast ramki obrazu.

Duplikowanie funkcji niestandardowej na stronie dostępu do danych

  1. Utwórz następującą nową stronę dostępu do danych opartą na tabeli 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
    

    Uwaga

    Jeśli nie chcesz, aby ścieżka była wyświetlana na stronie, możesz ustawić Visibility właściwość kontrolki txtImageName na Wartość ukryta.

  2. W menu Narzędzia wskaż pozycję Makra, a następnie kliknij pozycję Microsoft Script Editor.

  3. Dodaj następujący skrypt do bieżącego zdarzenia MSODSC w części tagu HEAD dokumentu HTML.

    Uwaga

    Aby zdarzenie zostało wyzwolone, należy przekazać parametr.

    <SCRIPT language=vbscript event=Current(oEventInfo) for=MSODSC>
    <!--
    ImageFrame.src=txtImageName.value
    -->
    </SCRIPT>
    
  4. Otwórz stronę dapImage w widoku strony. Należy pamiętać, że na stronie jest wyświetlana odpowiednia mapa bitowa dla każdego rekordu. Jeśli pole txtImageName jest puste, zostanie wyświetlona ikona kontrolki. Jeśli nie można odnaleźć obrazu, w kontrolce obrazu zostanie wyświetlona ikona X.

Używanie ścieżki http:// w formularzu

Aby użyć ścieżki http:// w formularzu, użyj kontrolki przeglądarki sieci Web (shdocvw.dll) w następujący sposób:

  1. Dodaj kontrolkę Microsoft Web Browser do formularza i nadaj jej nazwę WebBrowser.

  2. Dodaj następujący kod do modułu:

    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. Dodaj następujący kod za formularzem:

    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