wiklendt
i recommend chocolate
- Local time
- Today, 09:57
- Joined
- Mar 10, 2008
- Messages
- 1,746
Hi everyone,
A) this is something i didn't bother with for some time, but i think i need to sort it out. when i add an image path to my table via a browse button on my form - all is good. however, if i click on my 'add image' button, browse for an image, then decide the one i have is the best one after all so i click 'cancel' in the browse dialog, the image that was there originally is removed form the table (and the next time i open the form the image is no longer displayed).
my work-around at the moment is to remove the image from displaying b/c the entry in the table was deleted anyway. this alerts the users straightaway to the fact that the image is gone. if i remove the error handling for this event, i get an error message saying "Error # 13: type mismatch"
here is the code i am using on my browse button on my form (i have 7 in total, all are the same save the appropriate field names etc for each one...):
and this is my basOpenFile module code (i'll paste it all b/c i'm not sure which bits are the important ones - although i suspect it could have something to do with the bit i've highlighted in red)
some other things i wanted to tackle with this code (though one step at a time!) is that
B) relative path returned
the code above returns an absolute path, not relative... i have fiddled with commenting out bits of code in the basOpenFile, and also changing bits, but none of it worked. (and i have changed it back to absolute path).
is there something simple i can do to achieve this (retaining my browse button and dialog - i refuse to force my users to know how compile an absoulte path to their image and then typing it in!)
this will also help if my user needs to move the database from desktop to laptop while out on assignment. i HAVE looked at all the current options on this forum and on internet, but they all have EITHER a browse dialog OR relative path (via manual typing in of text). the means to the end are so vastly different.
C) copy and rename
this database has sub-folders. one i have called HorsePhotos. is it possible at all, that when a user chooses an image from somewhere in their computer, Access, through VBA(?) copies and renames that image into "./HorsePhotos/[appropriate name change].jpg/gif/bmp" and returns that as a relative path? WHILST RETAINING THE BROWSE BUTTON FOR SELECTING AN IMAGE.
the 'copying' assures that the image chosen is always available even if the user deletes the original one they chose (say they forget that's the one they used OR they re-organise the Pictures folder, whatever) because the copy is safely stored in the sub-folder of the database. also means the database is easily migrated.
the 'renaming' assures that the folder doesn't keep growing and growing and growing if the user changes one image several times for the same horse.
A) this is something i didn't bother with for some time, but i think i need to sort it out. when i add an image path to my table via a browse button on my form - all is good. however, if i click on my 'add image' button, browse for an image, then decide the one i have is the best one after all so i click 'cancel' in the browse dialog, the image that was there originally is removed form the table (and the next time i open the form the image is no longer displayed).
my work-around at the moment is to remove the image from displaying b/c the entry in the table was deleted anyway. this alerts the users straightaway to the fact that the image is gone. if i remove the error handling for this event, i get an error message saying "Error # 13: type mismatch"
here is the code i am using on my browse button on my form (i have 7 in total, all are the same save the appropriate field names etc for each one...):
Code:
Private Sub cmdBrowseHorsePhoto3_Click()
On Error GoTo err_cmdBrowseHorsePhoto3
Dim strDialogTitle As String
strDialogTitle = "Select a left view image for " & Me!FormHorseName
Me![HorsePhotoLeft] = GetOpenFile_CLT(".\", strDialogTitle)
Me![HorsePhotoLeft] = LCase(Me![HorsePhotoLeft])
Me!imgHorsePhoto3.Picture = Me!HorsePhotoLeft
exit_cmdBrowseHorsePhoto3:
Exit Sub
err_cmdBrowseHorsePhoto3:
Select Case Err.Number
Case 13
'ignore, not an Error(?), but remove current for now, b/c "select image" deleted what was there anyway
Me!imgHorsePhoto3.Picture = ""
Case Else
Msg = "Error # " & Str(Err.Number) & Chr(13) & Err.Description
MsgBox Msg, , "Error", Err.HelpFile, Err.HelpContext
End Select
Resume exit_cmdBrowseHorsePhoto3
End Sub
Code:
Option Compare Database
Option Explicit
' Code for this module was taken from a "PictDatabse 2000" sample database. Author unknown.
' Declarations for Windows Common Dialogs procedures
Private Type CLTAPI_OPENFILE
strFilter As String ' Filter string
intFilterIndex As Long ' Initial Filter to display.
strInitialDir As String ' Initial directory for the dialog to open in.
strInitialFile As String ' Initial file name to populate the dialog with.
strDialogTitle As String ' Dialog title
strDefaultExtension As String ' Default extension to append to file if user didn't specify one.
lngFlags As Long ' Flags (see constant list) to be used.
strFullPathReturned As String ' Full path of file picked.
strFileNameReturned As String ' File name of file picked.
intFileOffset As Integer ' Offset in full path (strFullPathReturned) where the file name (strFileNameReturned) begins.
intFileExtension As Integer ' Offset in full path (strFullPathReturned) where the file extension begins.
End Type
Const ALLFILES = "All Files"
Private Type CLTAPI_WINOPENFILENAME
lStructSize As Long
hWndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustrFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
Flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustrData As Long
lpfnHook As Long
lpTemplateName As String
End Type
Const OFN_ALLOWMULTISELECT = &H200
Const OFN_CREATEPROMPT = &H2000
Const OFN_EXPLORER = &H80000
Const OFN_FILEMUSTEXIST = &H1000
Const OFN_HIDEREADONLY = &H4
Const OFN_NOCHANGEDIR = &H8
Const OFN_NODEREFERENCELINKS = &H100000
Const OFN_NONETWORKBUTTON = &H20000
Const OFN_NOREADONLYRETURN = &H8000
Const OFN_NOVALIDATE = &H100
Const OFN_OVERWRITEPROMPT = &H2
Const OFN_PATHMUSTEXIST = &H800
Const OFN_READONLY = &H1
Const OFN_SHOWHELP = &H10
Declare Function CLTAPI_GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" _
(pOpenfilename As CLTAPI_WINOPENFILENAME) _
As Boolean
Declare Function CLTAPI_GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" _
(pOpenfilename As CLTAPI_WINOPENFILENAME) _
As Boolean
Declare Sub CLTAPI_ChooseColor Lib "msaccess.exe" Alias "#53" _
(ByVal hwnd As Long, rgb As Long)
Function GetOpenFile_CLT(strInitialDir As String, strTitle As String) As String
' Comments : Simple file open routine. For additional options, use GetFileOpenEX_CLT()
' Parameters: strInitialDir - path for the initial directory, or blank for the current directory
' strTitle - title for the dialog
' Returns : string path, name and extension of the file selected
'
Dim fOK As Boolean
Dim typWinOpen As CLTAPI_WINOPENFILENAME
Dim typOpenFile As CLTAPI_OPENFILE
Dim strFilter As String
On Error GoTo PROC_ERR
' Set reasonable defaults for the structure
strFilter = CreateFilterString_CLT("JPEG files (*.JPG)", "*.JPG", "GIF image files (*.GIF)", "*.GIF", "Bitmap files (*.BMP)", "*.BMP")
' strFilter = CreateFilterString_CLT("JPEG image files (*.JPG)", "*.JPG", "GIF image files (*.GIF)", "*.GIF")
'(original in the above line)
' to add more, use same format separated by commas within the CLT()
' e.g.: All Files (*.*)", "*.*",
If strInitialDir <> "" Then
typOpenFile.strInitialDir = strInitialDir
Else
typOpenFile.strInitialDir = CurDir()
End If
If strTitle <> "" Then
typOpenFile.strDialogTitle = strTitle
End If
typOpenFile.strFilter = strFilter
typOpenFile.lngFlags = OFN_HIDEREADONLY Or OFN_SHOWHELP
' Convert the CLT structure to a Win structure
ConvertCLT2Win typOpenFile, typWinOpen
' Call the Common dialog
fOK = CLTAPI_GetOpenFileName(typWinOpen)
' Convert the Win structure back to a CLT structure
ConvertWin2CLT typWinOpen, typOpenFile
GetOpenFile_CLT = typOpenFile.strFullPathReturned
PROC_EXIT:
Exit Function
[COLOR=Red]PROC_ERR:
GetOpenFile_CLT = ""
Resume PROC_EXIT[/COLOR]
End Function
Sub ConvertCLT2Win(CLT_Struct As CLTAPI_OPENFILE, Win_Struct As CLTAPI_WINOPENFILENAME)
' Comments : Converts the passed CLTAPI structure to a Windows structure
' Parameters: CLT_Struct - record of type CLTAPI_OPENFILE
' Win_Struct - record of type CLTAPI_WINOPENFILENAME
' Returns : Nothing
'
Dim strFile As String * 512
On Error GoTo PROC_ERR
Win_Struct.hWndOwner = Application.hWndAccessApp
Win_Struct.hInstance = 0
If CLT_Struct.strFilter = "" Then
Win_Struct.lpstrFilter = ALLFILES & Chr$(0) & "*.*" & Chr$(0)
Else
Win_Struct.lpstrFilter = CLT_Struct.strFilter
End If
Win_Struct.nFilterIndex = CLT_Struct.intFilterIndex
Win_Struct.lpstrFile = String(512, 0)
Win_Struct.nMaxFile = 511
Win_Struct.lpstrFileTitle = String$(512, 0)
Win_Struct.nMaxFileTitle = 511
Win_Struct.lpstrTitle = CLT_Struct.strDialogTitle
Win_Struct.lpstrInitialDir = CLT_Struct.strInitialDir
Win_Struct.lpstrDefExt = CLT_Struct.strDefaultExtension
Win_Struct.Flags = CLT_Struct.lngFlags
Win_Struct.lStructSize = Len(Win_Struct)
PROC_EXIT:
Exit Sub
PROC_ERR:
Resume PROC_EXIT
End Sub
Sub ConvertWin2CLT(Win_Struct As CLTAPI_WINOPENFILENAME, CLT_Struct As CLTAPI_OPENFILE)
' Comments : Converts the passed CLTAPI structure to a Windows structure
' Parameters: Win_Struct - record of type CLTAPI_WINOPENFILENAME
' CLT_Struct - record of type CLTAPI_OPENFILE
' Returns : Nothing
'
On Error GoTo PROC_ERR
CLT_Struct.strFullPathReturned = Left(Win_Struct.lpstrFile, InStr(Win_Struct.lpstrFile, vbNullChar) - 1)
CLT_Struct.strFileNameReturned = RemoveNulls_CLT(Win_Struct.lpstrFileTitle)
CLT_Struct.intFileOffset = Win_Struct.nFileOffset
CLT_Struct.intFileExtension = Win_Struct.nFileExtension
PROC_EXIT:
Exit Sub
PROC_ERR:
Resume PROC_EXIT
End Sub
Function CreateFilterString_CLT(ParamArray varFilt() As Variant) As String
' Comments : Builds a Windows formatted filter string for "file type"
' Parameters: varFilter - parameter array in the format:
' Text, Filter, Text, Filter ...
' Such as:
' "All Files (*.*)", "*.*", "Text Files (*.TXT)", "*.TXT"
' Returns : windows formatted filter string
'
Dim strFilter As String
Dim intCounter As Integer
Dim intParamCount As Integer
On Error GoTo PROC_ERR
' Get the count of paramaters passed to the function
intParamCount = UBound(varFilt)
If (intParamCount <> -1) Then
' Count through each parameter
For intCounter = 0 To intParamCount
strFilter = strFilter & varFilt(intCounter) & Chr$(0)
Next
' Check for an even number of parameters
If (intParamCount Mod 2) = 0 Then
strFilter = strFilter & "*.*" & Chr$(0)
End If
End If
CreateFilterString_CLT = strFilter
PROC_EXIT:
Exit Function
PROC_ERR:
CreateFilterString_CLT = ""
Resume PROC_EXIT
End Function
Function RemoveNulls_CLT(strIn As String) As String
' Comments : Removes terminator from a string
' Parameters: strIn - string to modify
' Return : modified string
'
Dim intChr As Integer
intChr = InStr(strIn, Chr$(0))
If intChr > 0 Then
RemoveNulls_CLT = Left$(strIn, intChr - 1)
Else
RemoveNulls_CLT = strIn
End If
End Function
B) relative path returned
the code above returns an absolute path, not relative... i have fiddled with commenting out bits of code in the basOpenFile, and also changing bits, but none of it worked. (and i have changed it back to absolute path).
is there something simple i can do to achieve this (retaining my browse button and dialog - i refuse to force my users to know how compile an absoulte path to their image and then typing it in!)
this will also help if my user needs to move the database from desktop to laptop while out on assignment. i HAVE looked at all the current options on this forum and on internet, but they all have EITHER a browse dialog OR relative path (via manual typing in of text). the means to the end are so vastly different.
C) copy and rename
this database has sub-folders. one i have called HorsePhotos. is it possible at all, that when a user chooses an image from somewhere in their computer, Access, through VBA(?) copies and renames that image into "./HorsePhotos/[appropriate name change].jpg/gif/bmp" and returns that as a relative path? WHILST RETAINING THE BROWSE BUTTON FOR SELECTING AN IMAGE.
the 'copying' assures that the image chosen is always available even if the user deletes the original one they chose (say they forget that's the one they used OR they re-organise the Pictures folder, whatever) because the copy is safely stored in the sub-folder of the database. also means the database is easily migrated.
the 'renaming' assures that the folder doesn't keep growing and growing and growing if the user changes one image several times for the same horse.
Last edited: