Access'2000 и картинки

Программирование на Visual Basic for Applications
hohol_kz
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 05.08.2005 (Пт) 6:21

Access'2000 и картинки

Сообщение hohol_kz » 05.12.2005 (Пн) 9:51

Люди, человеки, мож кто знает!!

Такой вопрос:
У меня БД, в которой я храню в том числе и картинки.
БД на Access'2000.
При вставки картинки экономных форматов (*.jpg) в соответствующее поле OLE, таблица пухнет как если вставлять *.bmp.
Причем независимо от того, вставляю как ссылку или нет.
Если вставляю как ссылку и назначаю иконку для отображения типа содержимого, то вроде БД не пухнет (т.е. увеличивается ~ на размер файла картинки), но только до момента закрытия БД. При закрытии Access стандартно пытается сжать БД и чего-то там делает, что bmp-эффект появляется.

Это победить можно или надо смириться с тем что БД станет просто огромной? Может это решено в ХР-версии?
На правах саморекламмы: "Кофейник" - это тот же "чайник", только круче.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 05.12.2005 (Пн) 10:40

Ложи в базу не картинки, а ссылки (на файл).
Либо пиши свой обработчик.
Lasciate ogni speranza, voi ch'entrate.

hohol_kz
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 05.08.2005 (Пт) 6:21

Сообщение hohol_kz » 05.12.2005 (Пн) 12:03

Клал ссылки и результат тот же.
Не могу понять, то ль оно сохраняет там же и картинку для предпросмотра в bmp, или просто все в него конвертирует.
Но как и написал, при закрытии БД она автоматически распухает. Даже если после вставки увеличение происходит ожидаемое, на размер jpg-файла.
На правах саморекламмы: "Кофейник" - это тот же "чайник", только круче.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 05.12.2005 (Пн) 14:24

Ссылки -- это C:\PICTURES\image1.jpg
Lasciate ogni speranza, voi ch'entrate.

hohol_kz
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 05.08.2005 (Пт) 6:21

Сообщение hohol_kz » 06.12.2005 (Вт) 8:05

Я понимаю, но этот вариант неприемлем. Мне нужно хранить картинки в БД а не ссылки. Потому что БД должна быть мобильная и посильная для почти-идиота.
Таскать огромный набор файлов к собственно БД в данном случае нельзя.

Меня полностью устроило бы если бы в БД хранились jpg-и.
Прогнозируемый объем около 100 Мб, что помещается на 1 диск. А вот с описаной мной проблемой, получается гораздо больше 1-го CD.

Как дело обстоит в Access-е из пакета ХР? Ведь поддержку вставки mp3 в Office'XP добавили. Может и с картинками так же? Кто-нить знает об этом?
На правах саморекламмы: "Кофейник" - это тот же "чайник", только круче.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.12.2005 (Вт) 8:28

В таком случае запоминай их в базе не как OLE, а как бинарный массив, только процедуру распаковки из поля во временный файл и запаковки в поле тебе надо будет писать самому.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 06.12.2005 (Вт) 9:08

alibek писал(а):В таком случае запоминай их в базе не как OLE, а как бинарный массив, только процедуру распаковки из поля во временный файл и запаковки в поле тебе надо будет писать самому.


Все верно. Только зачем в файл-то? Без него можно.

Код: Выделить всё

Private Declare Function CLSIDFromString Lib "ole32" (ByVal lpsz As Any, pclsid As GUID) As Long
Private Declare Function IsEqualGUID Lib "ole32" (rguid1 As GUID, rguid2 As GUID) As Boolean

Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal dwLength As Long)
Private Declare Function CreateStreamOnHGlobal Lib "ole32" (ByVal hGlobal As Long, ByVal fDeleteOnRelease As CBoolean, ppstm As Any) As Long

Private Const GMEM_MOVEABLE = &H2
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal uFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long

Private Enum CBoolean   ' enum members are Long data types
    CFalse = 0
    CTrue = 1
End Enum

Private Type GUID       ' 16 bytes (128 bits)
    dwData1 As Long     ' 4 bytes
    wData2 As Integer   ' 2 bytes
    wData3 As Integer   ' 2 bytes
    abData4(7) As Byte  ' 8 bytes, zero based
End Type

Private Declare Function OleLoadPicture Lib "olepro32" (pStream As Any, ByVal lSize As Long, ByVal fRunmode As CBoolean, riid As GUID, ppvObj As Any) As Long

Public Function PictureFromBits(abPic() As Byte) As IPicture  ' not a StdPicture!!
    Const sIID_IPicture = "{7BF80980-BF32-101A-8BBB-00AA00300CAB}"
    Const S_OK = 0     ' indicates successful HRESULT
   
    Dim nLow As Long
    Dim cbMem  As Long
    Dim hMem  As Long
    Dim lpMem  As Long
    Dim IID_IPicture As GUID
    Dim istm As stdole.IUnknown '  IStream
    Dim ipic As IPicture
   
    ' Get the size of the picture's bits
    On Error GoTo Out
    nLow = LBound(abPic)
    On Error GoTo 0
    cbMem = (UBound(abPic) - nLow) + 1
 
    ' Allocate a global memory object
    hMem = GlobalAlloc(GMEM_MOVEABLE, cbMem)
    If hMem Then
        ' Lock the memory object and get a pointer to it.
        lpMem = GlobalLock(hMem)
        If lpMem Then
            ' Copy the picture bits to the memory pointer and unlock the handle.
            MoveMemory ByVal lpMem, abPic(nLow), cbMem
            GlobalUnlock hMem
            ' Create an ISteam from the pictures bits (we can explicitly free hMem
            ' below, but we'll have the call do it here...)
            If (CreateStreamOnHGlobal(hMem, CTrue, istm) = S_OK) Then
                If (CLSIDFromString(StrPtr(sIID_IPicture), IID_IPicture) = S_OK) Then
                    ' Create an IPicture from the IStream (the docs say the call does not
                    ' AddRef its last param, but it looks like the reference counts are correct..)
                    OleLoadPicture ByVal ObjPtr(istm), cbMem, CFalse, IID_IPicture, PictureFromBits
                End If   ' CLSIDFromString
            End If   ' CreateStreamOnHGlobal
        End If   ' lpMem
        GlobalFree hMem
    End If   ' hMem
   
Out:
End Function
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

hohol_kz
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 05.08.2005 (Пт) 6:21

Сообщение hohol_kz » 10.12.2005 (Сб) 10:45

в понедельник гляну.
ООоооочень интересно и многообещающе.
На правах саморекламмы: "Кофейник" - это тот же "чайник", только круче.

hohol_kz
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 05.08.2005 (Пт) 6:21

Сообщение hohol_kz » 12.12.2005 (Пн) 9:26

Народ, будете смеяться до колик в животе.

Оказалось, проблема решается просто до безобразия.
Сохранять картинку в поле МЕМО!
При этом привязанный OLE-контрол нормально ее востанавливает до рисунка без каких либо заморочек.
БД исправно увеличивается строго на размер файла.

Но это не был бы продукт от Microsoft, если бы не было дегтя, а именно:
1. Без выдачи ошибки получается загрузить только если OLE не привязан к БД а по событию копируешь его значение в МЕМО.
Код: Выделить всё
MEMO.value=OLE.Value

Если совать объект в привязанный контрол, то ругается на строку и всякое такое.
2. При открытии картинки, иногда в его мозгах срабатывает событие Edit и тогда при попытке покинуть запись выдает ту же ошибку, что и при вставке картинки в МЕМО через привязанный OLE-контрол (про длину строки в Unicode)
Вот такие дела.
На правах саморекламмы: "Кофейник" - это тот же "чайник", только круче.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 12.12.2005 (Пн) 9:50

hohol_kz писал(а):Оказалось, проблема решается просто до безобразия.
Сохранять картинку в поле МЕМО!
При этом привязанный OLE-контрол нормально ее востанавливает до рисунка без каких либо заморочек.


Не пробовал, да как-то и не тянет. Ибо OLE я не пользую, а в базе храню не только картинки, а и другие документы (Word, Pdf...) в заархивированном виде...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

hohol_kz
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 05.08.2005 (Пт) 6:21

Сообщение hohol_kz » 12.12.2005 (Пн) 10:27

Просто данный контрол стандартен. А на примере картинки выясняется что работает. Уж конечно все равно, картинку в МЕМО, таблицу или архив пихать.

Спасибо за твой вариант. Я его проработал.
На правах саморекламмы: "Кофейник" - это тот же "чайник", только круче.


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 105

    TopList