Help with linking images

Yatiman Idara

Registered User.
Local time
Today, 12:01
Joined
Apr 22, 2016
Messages
27
Hi everyone,

My database requires profile images and fingerprint images for the entries.
Because this will bloat the database size I decided (after consultation with forum members) to link the image files to my database.

After my decision however, I realized how little material there was for implementing this method. I have searched all day and finally set up a module to display the images in the form.

However I am clueless on how to display those very same images in the reports. Any help on this issue will be greatly appreciated.

Basically to display the images in my form I have had to set up a Function in the form's code which is then called in the current event property.

Function code is :

Function setImagePath()
Dim strImagePath As String
On Error GoTo PictureNotAvailable
strImagePath = Me.ImagePath
Me.ImagePath.Locked = True
Me.ImagePath.enabled = False
Me.ImageFrame.Picture = strImagePath
Exit Function
PictureNotAvailable:
strImagePath = "D:\New Program\Program\Photos\Yatiman\Profile\NoImage.bmp"
'strImagePath = "C:\db_Images\NoImage.gif"
Me.ImageFrame.Picture = strImagePath
End Function


And the form current event is:

Private Sub Form_Current()
On Error Resume Next
setImagePath
setFingerPath

End Sub


Any ideas how I could display these images in reports as well?

Also if anyone thinks there is a better way to link/display these images then suggestion are welcome.

One other thing: I tried to implement the API dialog file browse method but it failed because I am using MS x86 in a win 64 computer.

Any suggestion on how to set up above function for my specs?


Thanks
 
I keep having to correct this....you CANT put more code into the error trap.
you must handle the error and get out.

Code:
 Function setImagePath()
Dim strImagePath As String
On Error GoTo PictureNotAvailable
strImagePath = Me.ImagePath
Me.ImagePath.Locked = True
Me.ImagePath.enabled = False
Me.ImageFrame.Picture = strImagePath
 Exit Function

 try2:
 strImagePath = "D:\NewProgram\Program\Photos\Yatiman\Profile\NoImage.bmp "
'strImagePath = "C:\db_Images\NoImage.gif"
Me.ImageFrame.Picture 
 
Exit Function
PictureNotAvailable:
I = I + 1
 IF I = 1 THEN resume try2
 end function
 
You may get some ideas from this youtube video by Richard Rost

oOOops" I see ranman posted while I was typing.
 
include the imagepath field in your report.
drag an Image control on your report.

on your report's detail print event:

Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
Me.ImageCtrl.Picture = Me.imagepath & ""
End Sub
 
Last edited:
for file browser:

Code:
Option Compare Database
Option Explicit

'***************** Code Start **************
'This code was originally written by Ken Getz.
'It is not to be altered or distributed,
'except as part of an application.
'You are free to use it in any application,
'provided the copyright notice is left unchanged.
'
' Code courtesy of:
'   Microsoft Access 95 How-To
' Ken Getz and Paul Litwin
' Waite Group Press, 1996
'
' updated for x64 by arnelgp
'
#If VBA7 Or Win64 Then
    Type tagOPENFILENAME
        lStructSize As Long
        hwndOwner As LongPtr
        hInstance As LongPtr
        strFilter As String
        strCustomFilter As String
        nMaxCustFilter As Long
        nFilterIndex As Long
        strFile As String
        nMaxFile As Long
        strFileTitle As String
        nMaxFileTitle As Long
        strInitialDir As String
        strTitle As String
        flags As Long
        nFileOffset As Integer
        nFileExtension As Integer
        strDefExt As String
        lCustData As Long
        lpfnHook As LongPtr
        lpTemplateName As String
    '#if (_WIN32_WINNT >= 0x0500)
        pvReserved As LongPtr
        dwReserved As Long
        FlagsEx As Long
    '#endif // (_WIN32_WINNT >= 0x0500)
    End Type
#Else
    Type tagOPENFILENAME
        lStructSize As Long
        hwndOwner As Long
        hInstance As Long
        strFilter As String
        strCustomFilter As String
        nMaxCustFilter As Long
        nFilterIndex As Long
        strFile As String
        nMaxFile As Long
        strFileTitle As String
        nMaxFileTitle As Long
        strInitialDir As String
        strTitle As String
        flags As Long
        nFileOffset As Integer
        nFileExtension As Integer
        strDefExt As String
        lCustData As Long
        lpfnHook As Long
        lpTemplateName As String
    End Type
#End If

#If VBA7 Or Win64 Then
    Declare PtrSafe Function aht_apiGetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As tagOPENFILENAME) As Long
    Declare PtrSafe Function aht_apiGetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" (pOpenfilename As tagOPENFILENAME) As Long
    Private Declare PtrSafe Function CommDlgExtendedError Lib "comdlg32.dll" () As Long
#Else
    Declare Function aht_apiGetOpenFileName Lib "comdlg32.dll" _
        Alias "GetOpenFileNameA" (OFN As tagOPENFILENAME) As Boolean
        
    Declare Function aht_apiGetSaveFileName Lib "comdlg32.dll" _
        Alias "GetSaveFileNameA" (OFN As tagOPENFILENAME) As Boolean
    Private Declare Function CommDlgExtendedError Lib "comdlg32.dll" () As Long
#End If

Global Const ahtOFN_READONLY = &H1
Global Const ahtOFN_OVERWRITEPROMPT = &H2
Global Const ahtOFN_HIDEREADONLY = &H4
Global Const ahtOFN_NOCHANGEDIR = &H8
Global Const ahtOFN_SHOWHELP = &H10
' You won't use these.
'Global Const ahtOFN_ENABLEHOOK = &H20
'Global Const ahtOFN_ENABLETEMPLATE = &H40
'Global Const ahtOFN_ENABLETEMPLATEHANDLE = &H80
Global Const ahtOFN_NOVALIDATE = &H100
Global Const ahtOFN_ALLOWMULTISELECT = &H200
Global Const ahtOFN_EXTENSIONDIFFERENT = &H400
Global Const ahtOFN_PATHMUSTEXIST = &H800
Global Const ahtOFN_FILEMUSTEXIST = &H1000
Global Const ahtOFN_CREATEPROMPT = &H2000
Global Const ahtOFN_SHAREAWARE = &H4000
Global Const ahtOFN_NOREADONLYRETURN = &H8000
Global Const ahtOFN_NOTESTFILECREATE = &H10000
Global Const ahtOFN_NONETWORKBUTTON = &H20000
Global Const ahtOFN_NOLONGNAMES = &H40000
' New for Windows 95
Global Const ahtOFN_EXPLORER = &H80000
Global Const ahtOFN_NODEREFERENCELINKS = &H100000
Global Const ahtOFN_LONGNAMES = &H200000
Sub a_test2()
Dim strFilter As String
Dim strInputFileName As String

strFilter = ahtAddFilterItem(strFilter, "Excel Files (*.XLS)", "*.XLS")
strInputFileName = ahtCommonFileOpenSave(Filter:=strFilter, OpenFile:=True, _
                DialogTitle:="Please select an input file...", _
                flags:=ahtOFN_HIDEREADONLY)
End Sub

Function TestIt()
    Dim strFilter As String
    Dim lngFlags As Long
    strFilter = ahtAddFilterItem(strFilter, "Access Files (*.mda, *.mdb)", _
                    "*.MDA;*.MDB")
    strFilter = ahtAddFilterItem(strFilter, "dBASE Files (*.dbf)", "*.DBF")
    strFilter = ahtAddFilterItem(strFilter, "Text Files (*.txt)", "*.TXT")
    strFilter = ahtAddFilterItem(strFilter, "All Files (*.*)", "*.*")
    MsgBox "You selected: " & ahtCommonFileOpenSave(InitialDir:="C:\", _
        Filter:=strFilter, FilterIndex:=3, flags:=lngFlags, _
        DialogTitle:="Hello! Open Me!")
    ' Since you passed in a variable for lngFlags,
    ' the function places the output flags value in the variable.
    Debug.Print Hex(lngFlags)
End Function

Function GetOpenFileo(Optional varDirectory As Variant, _
    Optional varTitleForDialog As Variant, _
    Optional pstrFilter As String = "") As Variant
' Open get file dialog
Dim strFilter As String
Dim lngFlags As Long
Dim varFileName As Variant
' Specify that the chosen file must already exist,
' don't change directories when you're done
' Also, don't bother displaying
' the read-only box. It'll only confuse people.
    lngFlags = ahtOFN_FILEMUSTEXIST Or _
                ahtOFN_HIDEREADONLY Or ahtOFN_NOCHANGEDIR
    If IsMissing(varDirectory) Then
        varDirectory = ""
    End If
    If IsMissing(varTitleForDialog) Then
        varTitleForDialog = "Please choose a file name ..."
    End If

    ' Define the filter string and allocate space in the "c"
    ' string Duplicate this line with changes as necessary for
    ' more file templates.
    If pstrFilter = "" Then
        strFilter = ahtAddFilterItem(strFilter, _
                "All Files (*.*)", "*.*")
    Else
        strFilter = pstrFilter
        '* Add 'All files' if it's not already there
        If Right(strFilter, 4) = "*.*" & vbNullChar Then
        Else
            strFilter = ahtAddFilterItem(strFilter, _
                "All Files (*.*)", "*.*")
        End If
    End If
    
    ' Now actually call to get the file name.
    varFileName = ahtCommonFileOpenSave( _
                    OpenFile:=True, _
                    InitialDir:=varDirectory, _
                    Filter:=strFilter, _
                    flags:=lngFlags, _
                    DialogTitle:=varTitleForDialog)
    If Not IsNull(varFileName) Then
        varFileName = TrimNull(varFileName)
    End If
    GetOpenFile = varFileName
End Function
Function GetOpenFile(Optional varDirectory As Variant, _
    Optional varTitleForDialog As Variant, _
    Optional strFilterName As String = "", _
    Optional strFilterString As String = "") As Variant
' Here's an example that gets an Access database name.
Dim strFilter As String
Dim lngFlags As Long
Dim varFileName As Variant
' Specify that the chosen file must already exist,
' don't change directories when you're done
' Also, don't bother displaying
' the read-only box. It'll only confuse people.
    lngFlags = ahtOFN_FILEMUSTEXIST Or _
                ahtOFN_HIDEREADONLY Or ahtOFN_NOCHANGEDIR
    If IsMissing(varDirectory) Then
        varDirectory = ""
    End If
    If IsMissing(varTitleForDialog) Then
        varTitleForDialog = "Please choose an Access Database..."
    End If

    ' Define the filter string and allocate space in the "c"
    ' string Duplicate this line with changes as necessary for
    ' more file templates.
    If strFilterName = "" Then
    Else
        strFilter = ahtAddFilterItem(strFilter, _
                    strFilterName, strFilterString)
    End If
    strFilter = ahtAddFilterItem(strFilter, _
                "Access (*.mdb)", "*.MDB")
    strFilter = ahtAddFilterItem(strFilter, _
                "MDE Files (*.mde)", "*.MDE")
    strFilter = ahtAddFilterItem(strFilter, _
                "Access 2007 (*.accdb)", "*.ACCDB")
    strFilter = ahtAddFilterItem(strFilter, _
                "ACCDE Files (*.accde)", "*.ACCDE")
    strFilter = ahtAddFilterItem(strFilter, _
                "All Files (*.*)", "*.*")
    ' Now actually call to get the file name.
    varFileName = ahtCommonFileOpenSave( _
                    OpenFile:=True, _
                    InitialDir:=varDirectory, _
                    Filter:=strFilter, _
                    flags:=lngFlags, _
                    DialogTitle:=varTitleForDialog)
    If Not IsNull(varFileName) Then
        varFileName = TrimNull(varFileName)
    End If
    GetOpenFile = varFileName
End Function
Function GetFile( _
    Optional pblnOpen As Boolean = True, _
    Optional varDirectory As Variant, _
    Optional varTitleForDialog As Variant, _
    Optional pstrFilter As String = "") As Variant
' Open get file dialog
Dim strFilter As String
Dim lngFlags As Long
Dim varFileName As Variant
' Specify that the chosen file must already exist,
' don't change directories when you're done
' Also, don't bother displaying
' the read-only box. It'll only confuse people.
    lngFlags = ahtOFN_FILEMUSTEXIST Or _
                ahtOFN_HIDEREADONLY Or ahtOFN_NOCHANGEDIR
    If IsMissing(varDirectory) Then
        varDirectory = ""
    End If
    If IsMissing(varTitleForDialog) Then
        varTitleForDialog = "Please choose a file name ..."
    End If

    ' Define the filter string and allocate space in the "c"
    ' string Duplicate this line with changes as necessary for
    ' more file templates.
    If pstrFilter = "" Then
        strFilter = ahtAddFilterItem(strFilter, _
                "All Files (*.*)", "*.*")
    Else
        strFilter = pstrFilter
        '* Add 'All files' if it's not already there
        If Right(strFilter, 4) = "*.*" & vbNullChar Then
        Else
            strFilter = ahtAddFilterItem(strFilter, _
                "All Files (*.*)", "*.*")
        End If
    End If
    
    ' Now actually call to get the file name.
    varFileName = ahtCommonFileOpenSave( _
                    OpenFile:=pblnOpen, _
                    InitialDir:=varDirectory, _
                    Filter:=strFilter, _
                    flags:=lngFlags, _
                    DialogTitle:=varTitleForDialog)
    If Not IsNull(varFileName) Then
        varFileName = TrimNull(varFileName)
    End If
    GetFile = varFileName
End Function
Function GetSaveFile1(strFileName As String, Optional varDirectory As Variant, _
    Optional varTitleForDialog As Variant) As Variant
' Here's an example that gets an Access database name to save to
' A default file name is passed in the strFileName parm
Dim strFilter As String
Dim lngFlags As Long
Dim varFileName As Variant
' Specify that the chosen file must already exist,
' don't change directories when you're done
' Also, don't bother displaying
' the read-only box. It'll only confuse people.
    lngFlags = ahtOFN_OVERWRITEPROMPT Or ahtOFN_READONLY Or ahtOFN_HIDEREADONLY
    If IsMissing(varDirectory) Then
        varDirectory = ""
    End If
    If IsMissing(varTitleForDialog) Then
        varTitleForDialog = "Please select a file name to save to..."
    End If

    ' Define the filter string and allocate space in the "c"
    ' string Duplicate this line with changes as necessary for
    ' more file templates.
    strFilter = ahtAddFilterItem(strFilter, _
                "Access (*.mdb)", "*.MDB")
    ' Now actually call to get the file name.
    varFileName = ahtCommonFileOpenSave( _
                    OpenFile:=False, _
                    InitialDir:=varDirectory, _
                    Filter:=strFilter, _
                    flags:=lngFlags, _
                    filename:=strFileName, _
                    DialogTitle:=varTitleForDialog)
    If Not IsNull(varFileName) Then
        varFileName = TrimNull(varFileName)
    End If
    GetSaveFile1 = varFileName
End Function

Function ahtCommonFileOpenSave( _
            Optional ByRef flags As Variant, _
            Optional ByVal InitialDir As Variant, _
            Optional ByVal Filter As Variant, _
            Optional ByVal FilterIndex As Variant, _
            Optional ByVal DefaultExt As Variant, _
            Optional ByVal filename As Variant, _
            Optional ByVal DialogTitle As Variant, _
            Optional ByVal hwnd As Variant, _
            Optional ByVal OpenFile As Variant) As Variant
' This is the entry point you'll use to call the common
' file open/save dialog. The parameters are listed
' below, and all are optional.
'
' In:
' Flags: one or more of the ahtOFN_* constants, OR'd together.
' InitialDir: the directory in which to first look
' Filter: a set of file filters, set up by calling
' AddFilterItem. See examples.
' FilterIndex: 1-based integer indicating which filter
' set to use, by default (1 if unspecified)
' DefaultExt: Extension to use if the user doesn't enter one.
' Only useful on file saves.
' FileName: Default value for the file name text box.
' DialogTitle: Title for the dialog.
' hWnd: parent window handle
' OpenFile: Boolean(True=Open File/False=Save As)
' Out:
' Return Value: Either Null or the selected filename
Dim OFN As tagOPENFILENAME
Dim strFileName As String
Dim strFileTitle As String
Dim fResult As Boolean
    ' Give the dialog a caption title.
    If IsMissing(InitialDir) Then InitialDir = CurDir
    If IsMissing(Filter) Then Filter = ""
    If IsMissing(FilterIndex) Then FilterIndex = 1
    If IsMissing(flags) Then flags = 0&
    If IsMissing(DefaultExt) Then DefaultExt = ""
    If IsMissing(filename) Then filename = ""
    If IsMissing(DialogTitle) Then DialogTitle = ""
    If IsMissing(hwnd) Then hwnd = Application.hWndAccessApp
    If IsMissing(OpenFile) Then OpenFile = True
    ' Allocate string space for the returned strings.
    strFileName = Left(filename & String(256, 0), 256)
    strFileTitle = String(256, 0)
    ' Set up the data structure before you call the function
    With OFN
        .lStructSize = Len(OFN)
        .hwndOwner = hwnd
        .strFilter = Filter
        .nFilterIndex = FilterIndex
        .strFile = strFileName
        .nMaxFile = Len(strFileName)
        .strFileTitle = strFileTitle
        .nMaxFileTitle = Len(strFileTitle)
        .strTitle = DialogTitle
        .flags = flags
        .strDefExt = DefaultExt
        .strInitialDir = InitialDir
        ' Didn't think most people would want to deal with
        ' these options.
        .hInstance = 0
        '.strCustomFilter = ""
        '.nMaxCustFilter = 0
        .lpfnHook = 0
        'New for NT 4.0
        .strCustomFilter = String(255, 0)
        .nMaxCustFilter = 255
    End With
    ' This will pass the desired data structure to the
    ' Windows API, which will in turn it uses to display
    ' the Open/Save As Dialog.
    If OpenFile Then
        fResult = aht_apiGetOpenFileName(OFN)
    Else
        fResult = aht_apiGetSaveFileName(OFN)
        'MsgBox "fresult=" & fResult & " :: ofn.strfile=" & OFN.strFile
    End If

    ' The function call filled in the strFileTitle member
    ' of the structure. You'll have to write special code
    ' to retrieve that if you're interested.
    If fResult Then
        ' You might care to check the Flags member of the
        ' structure to get information about the chosen file.
        ' In this example, if you bothered to pass in a
        ' value for Flags, we'll fill it in with the outgoing
        ' Flags value.
        If Not IsMissing(flags) Then flags = OFN.flags
        ahtCommonFileOpenSave = TrimNull(OFN.strFile)
    Else
        ahtCommonFileOpenSave = vbNullString
    End If
    'MsgBox "ahtCommonFileOpenSave=" & ahtCommonFileOpenSave
End Function

Function ahtAddFilterItem(strFilter As String, _
    strDescription As String, Optional varItem As Variant) As String
' Tack a new chunk onto the file filter.
' That is, take the old value, stick onto it the description,
' (like "Databases"), a null character, the skeleton
' (like "*.mdb;*.mda") and a final null character.

    If IsMissing(varItem) Then varItem = "*.*"
    ahtAddFilterItem = strFilter & _
                strDescription & vbNullChar & _
                varItem & vbNullChar
End Function

Private Function TrimNull(ByVal strItem As String) As String
Dim intPos As Integer
    intPos = InStr(strItem, vbNullChar)
    If intPos > 0 Then
        TrimNull = Left(strItem, intPos - 1)
    Else
        TrimNull = strItem
    End If
End Function
'************** Code End *****************
 
I keep having to correct this....you CANT put more code into the error trap.
you must handle the error and get out.

Code:
 Function setImagePath()
Dim strImagePath As String
On Error GoTo PictureNotAvailable
strImagePath = Me.ImagePath
Me.ImagePath.Locked = True
Me.ImagePath.enabled = False
Me.ImageFrame.Picture = strImagePath
 Exit Function

 try2:
 strImagePath = "D:\NewProgram\Program\Photos\Yatiman\Profile\NoImage.bmp "
'strImagePath = "C:\db_Images\NoImage.gif"
Me.ImageFrame.Picture 
 
Exit Function
PictureNotAvailable:
I = I + 1
 IF I = 1 THEN resume try2
 end function

Thanks for that. Will give this set up a try.
 
include the imagepath field in your report.
drag an Image control on your report.

on your report's detail print event:

Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
Me.ImageCtrl.Picture = Me.imagepath & ""
End Sub

I gave that one a try as well but unfortunately no success :confused:

In the report view the image control remains blank and when I try to go to the print preview, it gives me a generic error message :(

What could I be doing wrong?
 
Forgive me if there are some typos as this is a cutdown version of 30,000 image database. Try something along the lines of :

Code:
Function GetImage ()

Dim ImagePath as string

    With CodeContextObject
         ImagePath = .ImagePath

         If Dir(ImagePath) <> Empty Then
            .[ImageControl].Visible = True
            .[ImageControl].Picture = ImagePath
        Else
            .[ImageControl].Visible = False
        End If
    End With
End Function
Simon
 

Users who are viewing this thread

Back
Top Bottom