Вставка картинки в таблицу Access через OLE (VB6)

Узнай цену своей работы

Формулировка задачи:

Есть таблица в Access 2003 с полем объекта OLE, в котором хранятся картинки jpg. И есть форма с OLE куда картинка загружается из базы. Я не могу понять как сделать связь в обратную сторону, чтобы через форму в таблицу загружать картинку, при добавлении новой записи или изменении существующей. Заранее благодарен за помощь. P.S. мои знания vb равны 6 часам, так что сильно не бейте.

Решение задачи: «Вставка картинки в таблицу Access через OLE (VB6)»

textual
Листинг программы
  1. Option Explicit
  2.  
  3. Private Declare Sub memcpy Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
  4. Private Declare Function GetMem4 Lib "msvbvm60" (Src As Any, Dst As Any) As Long
  5. Private Declare Function lstrcpyn Lib "kernel32" Alias "lstrcpynA" (lpString1 As Any, lpString2 As Any, ByVal iMaxLength As Long) As Long
  6. Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (lpString As Any) As Long
  7. Private Declare Function CreateStreamOnHGlobal Lib "ole32.dll" (hGlobal As Any, ByVal fDeleteOnResume As Long, ppstr As Any) As Long
  8. Private Declare Function OleLoadPicture Lib "olepro32.dll" (ByVal lpStream As IUnknown, ByVal lSize As Long, ByVal fRunMode As Long, riid As Any, lplpObj As Any) As Long
  9. Private Declare Function CLSIDFromString Lib "ole32.dll" (ByVal lpsz As Long, pclsid As Any) As Long
  10.  
  11. Private Const IID_IPicture As String = "{7BF80980-BF32-101A-8BBB-00AA00300CAB}"
  12.  
  13. Private Const OBJECT_SIGNATURE = &H1C15
  14. Private Const OBJECT_HEADER_SIZE = 20
  15.  
  16. Private Type PT
  17.     Width               As Integer
  18.     Height              As Integer
  19. End Type
  20. Private Type OBJECTHEADER
  21.    Signature            As Integer         '0x1c15
  22.   HeaderSize           As Integer
  23.    ObjectType           As Long
  24.    NameLen              As Integer
  25.    ClassLen             As Integer
  26.    NameOffset           As Integer
  27.    ClassOffset          As Integer
  28.    ObjectSize           As PT
  29. End Type
  30. Private Type OLEHEADER
  31.    OleVersion           As Long
  32.    Format               As Long
  33.    OleTypeNameLength    As Long
  34. End Type
  35.  
  36. Private Sub Adodc1_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
  37.     Dim z()         As Byte
  38.     Dim f           As Field
  39.     Dim p           As Long
  40.     Dim guid(15)    As Byte
  41.     Dim pic         As IPicture
  42.     Dim stm     As IUnknown
  43.     Dim dat()   As Byte
  44.  
  45.     If pRecordset.EOF Or pRecordset.BOF Then Exit Sub
  46.    
  47.     Set f = pRecordset.Fields(3)
  48.    
  49.     CLSIDFromString StrPtr(IID_IPicture), guid(0)
  50.  
  51.    
  52.     If f.ActualSize > OBJECT_HEADER_SIZE Then
  53.         Dim hdr     As OBJECTHEADER
  54.         Dim Name    As String
  55.         Dim Class   As String
  56.    
  57.         z = f.Value
  58.        
  59.         Open "D:\Temp\Temp.dat" For Binary As 1
  60.         Put 1, , z
  61.         Close 1
  62.    
  63.         memcpy hdr, z(0), OBJECT_HEADER_SIZE
  64.        
  65.         If hdr.Signature <> OBJECT_SIGNATURE Then
  66.             ' Сырые данные
  67.            
  68.             If CreateStreamOnHGlobal(z(0), False, stm) = 0 Then
  69.                 OleLoadPicture stm, UBound(z) + 1, False, guid(0), pic
  70.                 Set picPictureBox = pic
  71.                 Set stm = Nothing
  72.             End If
  73.         Else
  74.             ' OLE обертка
  75.            Name = Space(hdr.NameLen - 1)
  76.             lstrcpyn ByVal Name, z(hdr.NameOffset), hdr.NameLen
  77.             Class = Space(hdr.ClassLen - 1)
  78.             lstrcpyn ByVal Class, z(hdr.ClassOffset), hdr.ClassLen
  79.            
  80.             Dim olehdr  As OLEHEADER
  81.             Dim typName As String
  82.             Dim size(2) As Long
  83.            
  84.             memcpy olehdr, z(hdr.HeaderSize), Len(olehdr)
  85.             p = hdr.HeaderSize + 12
  86.             typName = Space(olehdr.OleTypeNameLength - 1)
  87.             lstrcpyn ByVal typName, z(p), olehdr.OleTypeNameLength
  88.             p = p + olehdr.OleTypeNameLength
  89.            
  90.             Select Case typName
  91.             Case "PBrush"
  92.                 memcpy size(0), z(p), 12
  93.                 ReDim dat(size(2) - 1)
  94.                 memcpy dat(0), z(p + 12), size(2)
  95.             Case "Package"
  96.                 Dim l       As Long
  97.                 Dim fName   As String
  98.                 Dim fPath   As String
  99.                 Dim Path    As String
  100.                 ' Получаем имя файла
  101.                p = p + 14
  102.                 l = lstrlen(z(p))
  103.                 fName = Space(l)
  104.                 lstrcpyn ByVal fName, z(p), l + 1
  105.                 ' Получаем полный путь
  106.                p = p + l + 1
  107.                 l = lstrlen(z(p))
  108.                 fPath = Space(l)
  109.                 lstrcpyn ByVal fPath, z(p), l + 1
  110.                 p = p + l + 5
  111.                 GetMem4 z(p), l
  112.                 Path = Space(l - 1)
  113.                 p = p + 4
  114.                 lstrcpyn ByVal Path, z(p), l
  115.                 p = p + l
  116.                 GetMem4 z(p), l
  117.                 ReDim dat(l - 1)
  118.                 memcpy dat(0), z(p + 4), l
  119.             End Select
  120.            
  121.             If CreateStreamOnHGlobal(dat(0), False, stm) = 0 Then
  122.                 OleLoadPicture stm, size(2), False, guid(0), pic
  123.                 Set stm = Nothing
  124.             End If
  125.            
  126.             Set picPictureBox = pic
  127.         End If
  128.     End If
  129. End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.625 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы