file - visual - cómo crear un objeto viejo a partir de un archivo-Acceso a Ms
no se ha declarado el elemento configuration (1)
Antes de proporcionar mis respuestas, voy a echar un rápido vistazo a la reformulación de su pregunta y sus requisitos. Me parece que quiere poder cargar objetos de archivos binarios, en este caso imágenes, usando VBA, un campo Objeto OLE en su tabla y un Marco de objeto enlazado.
Su mejor opción es dejar de tratar de usar un marco de objeto enlazado porque tiene demasiadas limitaciones.
Básicamente, hay dos métodos recomendados para lo que estás tratando de hacer.
1) Almacene solo un enlace al archivo de imagen y luego use un control de imagen (puede estar vinculado a su campo de imagen) para mostrar la imagen.
2) Almacene la imagen en un campo Objeto OLE utilizando el código para leer la imagen como datos binarios. Cuando necesite mostrar la imagen, tendrá que escribirla en un archivo temporal y luego puede establecer la propiedad de Imagen en un Control de imagen en la ruta completa y el nombre de archivo para el archivo de imagen temporal. Depende de usted administrar el archivo de imagen como un archivo temporal. Puede usar el directorio temporal de Windows o simplemente puede escribir en el mismo nombre de archivo cada vez que necesite mostrar una imagen.
Ninguna de estas técnicas es demasiado difícil. Aquí hay un artículo realmente bueno para ayudarlo a comprender mejor de lo que estoy hablando: http://www.jamiessoftware.tk/articles/handlingimages.html
Aquí hay una función para leer en datos binarios (en este caso su archivo de imagen) y otra función para escribir datos binarios: http://www.ammara.com/access_image_faq/read_write_blob.html Esto funciona bien para escribir su imagen en una archivo "temp" Entonces, todo lo que tiene que hacer es configurar la propiedad Imagen en su control de imagen para que sea la ruta del archivo y el nombre de su archivo temporal.
También puede leer y escribir datos binarios utilizando un objeto ADO Stream, junto con un objeto ADO RecordSet y un objeto ADO Connection. Deberá establecer una referencia en la Biblioteca de Access to Microsoft ActiveX Data Objects 2.8.
Aquí hay un código para agregar imágenes a la base de datos usando ADO:
Private Function LoadPicIntoDatabase(sFilePathAndName As String) As Boolean
On Error GoTo ErrHandler
''Test to see if the file exists. Exit if it does not.
If Dir(sFilePathAndName) = "" Then Exit Function
LoadPicIntoDatabase = True
''Create a connection object
Dim cn As ADODB.Connection
Set cn = CurrentProject.Connection
''Create our other variables
Dim rs As ADODB.Recordset
Dim mstream As ADODB.Stream
Set rs = New ADODB.Recordset
''Configure our recordset variable and open only 1 record (if one exists)
With rs
.LockType = adLockOptimistic
.CursorLocation = adUseClient
.CursorType = adOpenDynamic
.Open "SELECT TOP 1 * FROM tblArticles", cn
End With
''Open our Binary Stream object and load our file into it
Set mstream = New ADODB.Stream
mstream.Open
mstream.Type = adTypeBinary
mstream.LoadFromFile sFilePathAndName
''add a new record and read our binary file into the OLE Field
rs.AddNew
rs.Fields("olepicturefield") = mstream.Read
rs.Update
''Edit: Removed some cleanup code I had inadvertently left here.
Cleanup:
On Error Resume Next
rs.Close
mstream.Close
Set mstream = Nothing
Set rs = Nothing
Set cn = Nothing
Exit Function
ErrHandler:
MsgBox "Error: " & Err.Number & " " & Err.Description
LoadPicIntoDatabase = False
Resume Cleanup
End Function
Private Sub Command0_Click()
If IsNull(Me.txtFilePathAndName) = False Then
If Dir(Me.txtFilePathAndName) <> "" Then
If LoadPicIntoDatabase(Me.txtFilePathAndName) = True Then
MsgBox Me.txtFilePathAndName & " was successfully loaded into the database."
End If
End If
End If
End Sub
Edit1:
Según su solicitud, aquí hay un código para buscar / cargar una imagen para un artículo determinado. En aras de la coherencia, también he cambiado los nombres de mi tabla y campo anterior para reflejar mejor su proyecto y para que coincida con el siguiente código. Probé este código y funcionó correctamente para mí.
Private Sub Command1_Click()
If IsNull(Me.txtArticleID) = False Then
If DCount("articleid", "tblArticles", "articleid = " & Me.txtArticleID) = 1 Then
Dim rs As DAO.Recordset, sSQL As String, sTempPicture As String
sSQL = "SELECT * FROM tblArticles WHERE ArticleID = " & Me.txtArticleID
Set rs = CurrentDb.OpenRecordset(sSQL)
If Not (rs.EOF And rs.BOF) Then
sTempPicture = "C:/MyTempPicture.jpg"
Call BlobToFile(sTempPicture, rs("olepicturefield"))
If Dir(sTempPicture) <> "" Then
Me.imagecontrol1.Picture = sTempPicture
End If
End If
rs.Close
Set rs = Nothing
Else
MsgBox "Article Not Found"
End If
Else
MsgBox "Please enter an article id"
End If
End Sub
Private Function BlobToFile(strFile As String, ByRef Field As Object) As Long
On Error GoTo BlobToFileError
Dim nFileNum As Integer
Dim abytData() As Byte
BlobToFile = 0
nFileNum = FreeFile
Open strFile For Binary Access Write As nFileNum
abytData = Field
Put #nFileNum, , abytData
BlobToFile = LOF(nFileNum)
BlobToFileExit:
If nFileNum > 0 Then Close nFileNum
Exit Function
BlobToFileError:
MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical, _
"Error writing file in BlobToFile"
BlobToFile = 0
Resume BlobToFileExit
End Function
Tengo una tabla con una imagen incrustada (OLE) coulmn.
Quiero poder insertar un nuevo registro a través de un formulario con una opción de exploración.
De todos modos, tengo un nombre de archivo, y necesito convertirlo en un objeto viejo e insertarlo en el formulario. ¿Cómo hago eso en VBA?
Para aclarar: necesito convertir un nombre de archivo en un objeto viejo con ese archivo y luego insertarlo en la tabla.
Gracias, Fingerman.
EDITAR:
Ok, como lo señala @HansUp, necesito explicarlo. En mi forma, tengo un objeto OLE vinculado que no está vinculado a un campo, sino a una función dlookup. Obtengo la identificación correcta en un control a través de una consulta y un cuadro combinado, por lo que el controlador está obligado a:
=DLookUp("picture","articles","id=" & [articles])
tenga en cuenta que los artículos no son un campo sino un controlador, no sé si eso difiere.
Cada vez que se cambia ese controlador, utilizo me.recalc
para que el OLE enlazado pueda actualizar su valor.
De todos modos, pensé en hacer esto solo por VBA y un usuario que ingresa una dirección de archivo, sin usar el controlador pero con algún tipo de INSERT o algo, pero otras opciones serían bienvenidas.
Si no estoy seguro, ¡PREGUNTA! Voy a aclararme y arreglarme a mí mismo.
EDICION 2:
Entonces, ¿cómo se adquiere o se obtiene el nombre del archivo? ¿Esperas usar el ArticleID? ¿La imagen está siempre en una ubicación esperada con un nombre de archivo esperado? ¿Qué es exactamente lo que quiere hacer si no usa el botón Examinar? ¿Está buscando algo totalmente automático basado en la carpeta y el nombre del archivo o está buscando algo así como arrastrar y soltar?
el nombre de archivo se adquiere a través de una opción de exploración, lo tengo implementado. por simplicidad, digamos que el usuario debe ingresar el nombre del archivo en un cuadro de texto. ahora, quiero que con un clic de un botón, pueda insertar ese nombre de archivo como un objeto ole incrustado en mi base de datos. No estoy buscando ninguna automatización ni arrastrar y soltar (Pero, si arrastrar y soltar funciona, sería genial). La primera edición es sobre el controlador ole ya que alguien preguntó. pensó que mi pregunta podría resolverse usando ese controlador, así que di detalles sobre cómo estoy desplazando la imagen. No creo que tenga ninguna relevancia, pero si alguien pudiera usar eso, estaría bien para mí. Espero usar un articleID para la actualización, pero una vez más, no veo cómo se relaciona esto con la pregunta.
Estoy empezando a pensar que esto podría no ser posible ... :( Esto no es feliz ya que el problema es bastante directo. Tienes un nombre de archivo, lo necesitas embebido como un objeto OLE en tu base de datos.