Отображение изображений из папки в форме, отчете или на странице доступа к данным

Оригинальный номер базы знаний: 285820

Примечание.

Требуются экспертные навыки программирования, взаимодействия и многопользовательских навыков. Эта статья относится к базе данных Microsoft Access (.mdb/.accdb) и к проекту Microsoft Access (ADP).

Сводка

Иногда нецелесообразно хранить образы в таблице Microsoft Access. Если у вас много изображений или каждый из файлов изображений большой, размер файла базы данных Microsoft Access может быстро увеличиться.

В этой статье демонстрируется пользовательская функция, которую можно использовать для:

  • Храните пути к файлам и имена изображений в таблице.
  • Отображение изображений с помощью элемента управления изображением.
  • Скрытие элемента управления изображением, если изображение недоступно.
  • Оставьте отзыв о состоянии отображения изображения.

В этой статье также содержится пример скрипта Visual Basic, который можно использовать для отображения изображений на странице доступа к данным.

Примечание.

Хотя в этом примере используются растровые изображения (.bmp), можно также использовать другие типы изображений, например .jpg, PCX и .gif.

Корпорация Майкрософт предоставляет примеры программирования только в целях демонстрации без явной или подразумеваемой гарантии. Данное положение включает, но не ограничивается этим, подразумеваемые гарантии товарной пригодности или соответствия отдельной задаче. Эта статья предполагает, что пользователь знаком с представленным языком программирования и средствами, используемыми для создания и отладки процедур. Специалисты технической поддержки Майкрософт могут пояснить работу той или иной процедуры, но модификация примеров и их адаптация к задачам разработчика не предусмотрена.

Создание таблицы для хранения файлов и данных пути

  1. Откройте пример базы данных, Northwind.mdb или пример проекта NorthwindCS.adp.

  2. Создайте следующую таблицу в Northwind.mdb или в NorthwindCS.adp.

    В 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
    

    В 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 в режиме таблицы, а затем добавьте путь и имя точечных файлов в каждую запись. В следующей таблице примеров показано, как могут выглядеть записи:

    Тип Пример
    Абсолютный (локальный) C:\Windows\Zapotec.bmp
    Абсолютный (UNC-путь) \\Servername\sharename\Zapotec.bmp
    Относительный 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>
    

    Примечание.

    Если вы не хотите, чтобы путь отображались в форме, можно задать Visible для свойства txtImageName элемента управления значение False.

  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>
    

    Примечание.

    Если вы не хотите, чтобы путь отображались в отчете, можно задать Visible для свойства txtImageName элемента управления значение False.

  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
    

    Примечание.

    Если вы не хотите, чтобы путь отображался на странице, можно задать Visibility для свойства txtImageName элемента управления значение Скрытый.

  2. В меню Сервис наведите указатель мыши на пункт Макросы и выберите пункт редактор скриптов (Майкрософт).

  3. Добавьте следующий скрипт в текущее событие MSODSC в части тега HEAD HTML-документа.

    Примечание.

    Чтобы событие было активировано, необходимо передать параметр .

    <SCRIPT language=vbscript event=Current(oEventInfo) for=MSODSC>
    <!--
    ImageFrame.src=txtImageName.value
    -->
    </SCRIPT>
    
  4. Откройте страницу dapImage в представлении страницы. Обратите внимание, что на странице отображается соответствующее растровое изображение для каждой записи. Если поле txtImageName пусто, отображается значок элемента управления. Если изображение не удается найти, в элементе управления изображением отображается значок X.

Использование http:// пути в форме

Чтобы использовать путь http:// в форме, используйте элемент управления веб-браузера (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