Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Collegamento immagine in database

Database Access con DAO, da escludere controlli Data.
Dovrei poter inserire in un campo un'immagine (o, meglio, un collegamento
alla stessa) di tipo anche incompatibile con i file grafici gestiti da VB e
in modo che se la stessa cambia, se ne veda la versione aggiornata esponendo
quanto previsto dal campo del database.
Non l'ho mai fatto, ma credo che occorra usare un campo di tipo LongBinary,
il fatto č che (non dovendo depositare l'immagine, congelandola, ma dovendo
depositare un collegamento a programma+immagine) non so come aprire
l'immagine col suo programma e depositare quel che devo nel campo, nč come
esporre l'immagine stessa letta dal campo.
Devo passare attraverso l'oggetto OLE e depositare la proprietą Object?
Vorrei tanto non dover fare questa cosa, ma non riesco a trovare
un'alternativa che non sia quella di depositare nome del file e programma e
avviare, in fase di visualizzazione, il programma stesso. Non capisco
inoltre come potrei stampare quell'immagine se di tipo diverso da quelle
previste da una picture o image di VB...
Grazie per ogni consiglio.

 diverso da quelle previste da una picture o image di VB...
giuro che cio' capito pochissimo
tu cmq sai le estensioni dei file quindi potresti fare che : quei file che
puoi aprire con una picture li apri, per quelli esterni prtroppo, non vedo
altra strada se non affidarsi ad altri programmi, magari con un msgbox di
avvertimento : "File associato a un programma  esterno: se vuoi stamparlo
fallo tu pigrone ! "
-- 
-Gigio@Work(?)-


Se vuoi memorizzare solo il percorso dell'immagine (il collegamento), 
memeorizzi in un campo di testo il percorso. Idem per il programma da 
utilizzare: memorizzi in un campo "Programma associato" il programma del 
percorso associato.
Non ho capito il riferimento al LongBinary visto che non sembri 
interessato ad immagazzinare l'immagine stessa nel db.
ciao
	maxx
-- 
NOSPAM: Rimuovere i trattini dallo username!
Cut hyphens from my username!

 database.
tu vuoi memorizzare in un db il path di una immagine, in modo da poterla
visualizzare in una form di una tua applicazione, e questo anche se il
formato della tua immagine non è tra quelli gestiti nativamente da picture e
image?
se ho capito correttamente devi appoggiarti a controlli di terze parti, io
conosco il gvbox.ocx, che puoi trovare qui
http://jcoconsulting.com/index.asp
, segnalatomi da java.
se vuoi anche modificare, o comunque se non ho capito, passo :-)
--
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo

 esterno: se vuoi stamparlo fallo tu pigrone ! "
Il punto non č questo. E' che, da quello che ho capito, un LongBinary puņ
riportare il collegamento OLE al programma+immagine. Non so come ottenere la
stessa cosa.

 interessato ad immagazzinare l'immagine stessa nel db.
Come faccio a depositare in un database un collegamento (non il semplice
percorso e nome del file, perchè sarebbe, per esempio, un'immagine AutoCad
che VB non vede) all'immagine, senza depositare l'immagine stessa e con la
garanzia che non si tratti di "incorporazione", ma di "collegamento vero,
ovvero se l'immagine cambia (usando il programma che può gestirla), i ne


[*CSSoft* = 
news...@cssoft2001.com
 in
news:bq4t1e$1tjfi9$
1...@ID-173193.news.uni-berlin.de
] ha scritto:

No. Memorizzare il percorso o l'intera immagine ci riesco, ma con la prima
devo avviare l'applicativo specifico (e già lo faccio con una tabella e una
Shell), ma come faccio a interfacciarmi (per esempio per fare una stampa)?,
con la seconda l'immagine sarebbe congelata e potenzialmente diversa da
quella attuale.
Insomma, quando si inserisce in Word (o in Publisher) un'immagine, mi pare
che ci sia modo di collegarla (l'immagine "vera" è una sola) o di
incorporarla (l'immagine viene duplicata e congelata) ...

 
Quello che vuoi fare si ottiene con un campo OLE e poi con un oggetto 
OLE salverai il dato come "Crea da file" -> "Collegamento" alla 
pressione di F4 sull'oggetto, oppure come OLE1.OleTypeAllowed = vbOLELinked.
Sinceramente non so se questo può esserti veramente utile, perchè deve 
esserci un'applicazione OLE associata installata sul client.
Con che strumento vuoi stampare di preciso?
Ciao

 tabella e una Shell), ma come faccio a interfacciarmi (per esempio
Vediamo se ti posso essere d'aiuto:
Pressapoco il codice seguente legge dal registry l'estensione e ti indica
quali operazioni fare e quali applicazioni sono associate.
Option Explicit
Private Const MAX_PATH_LENGTH As Long = 260
Private Const HKEY_CLASSES_ROOT As Long = &H80000000
Private Const STANDARD_RIGHTS_READ As Long = &H20000
Private Const KEY_QUERY_VALUE As Long = &H1
Private Const KEY_ENUMERATE_SUB_KEYS As Long = &H8
Private Const KEY_NOTIFY As Long = &H10
Private Const SYNCHRONIZE As Long = &H100000
Private Const KEY_READ As Long = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE
Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
Private Const GOOD_RETURN_CODE As Long = 0
Private Const REG_SZ = (1)
Private Const REG_EXPAND_SZ = (2)
Private Declare Function GetWindowsDirectory Lib "Kernel32" _
         Alias "GetWindowsDirectoryA" _
         (ByVal lpBuffer As String, ByVal nSize As Long) As Long
Private Declare Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyA"
(ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, ByVal
cbName As Long) As Long
Private Declare Function RegQueryValueExString Lib "advapi32.dll" Alias
"RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal
lpReserved As Long, lpType As Long, ByVal lpData As String, lpcbData As
Long) As Long
Private Declare Function RegQueryValueExNULL Lib "advapi32.dll" Alias
"RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal
lpReserved As Long, lpType As Long, ByVal lpData As Long, lpcbData As Long)
As Long
Private Declare Function RegEnumKeyEx Lib "advapi32" Alias "RegEnumKeyExA"
(ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, lpcbName
As Long, ByVal lpReserved As Long, ByVal lpClass As String, lpcbClass As
Long, lpftLastWriteTime As FILETIME) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long)
As Long
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias
"RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal
ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
Private sRegSubkey As String * MAX_PATH_LENGTH
Private sRegKeyClass As String * MAX_PATH_LENGTH
Private ftime As FILETIME
Private Type FILETIME: dwLowDateTime As Long: dwHighDateTime As Long: End
Type
Private vValue As Variant
Private sValue As String
Dim Elenco As Collection
Private Function FillComandi(sFileExtension As String) As String
    On Error Resume Next
    Dim Operazione As COperazioni
    Dim lResult As Long
    Dim lResultEnumKey As Long
    Dim lRegKeyIndex As Long
    Dim lrc As Long
    Dim rc1 As Long
    Dim rc2 As Long
    Dim rc3 As Long
    Dim sKey As String
    Dim sAction As String
    Dim sActionKey As String
    Dim sActionValue    As String
    Dim sActionCommand    As String
    lResult = 0
    lRegKeyIndex = 0
    rc1 = RegOpenKeyEx(HKEY_CLASSES_ROOT, sFileExtension, 0, KEY_READ,
lResult)
    If rc1 = 0 Then
       rc2 = QueryValueEx(lResult, vbNullString, vValue)
       TrimValue
       sKey = sValue
       rc2 = QueryValueEx(lResult, "content type", vValue)
       TrimValue
    End If
    RegCloseKey HKEY_CLASSES_ROOT
    rc1 = RegOpenKeyEx(HKEY_CLASSES_ROOT, sKey & "\shell", 0, KEY_READ,
lResult)
    RegCloseKey HKEY_CLASSES_ROOT
    Do While RegEnumKeyEx(lResult, lRegKeyIndex, sRegSubkey,
MAX_PATH_LENGTH, 0, sRegKeyClass, MAX_PATH_LENGTH, ftime) = GOOD_RETURN_CODE
       Set Operazione = New COperazioni
       sAction = TrimNull(sRegSubkey)
       Operazione.Comando = sAction
       sActionKey = sKey & "\shell\" & sAction
       rc1 = RegOpenKeyEx(HKEY_CLASSES_ROOT, sActionKey, 0, KEY_READ,
lResultEnumKey)
       If rc1 = 0 Then
          rc2 = QueryValueEx(lResultEnumKey, vbNullString, vValue)
          TrimValue
          sActionValue = sValue
       Else
          sActionValue = ""
       End If
       If sActionValue = "" Then
          sActionValue = sAction
       End If
       sActionKey = sKey & "\shell\" & sAction & "\command"
       rc1 = RegOpenKeyEx(HKEY_CLASSES_ROOT, sActionKey, 0, KEY_READ,
lResultEnumKey)
       If rc1 = 0 Then
          rc2 = QueryValueEx(lResultEnumKey, vbNullString, vValue)
          TrimValue
          sActionCommand = sValue
          Operazione.Operazioni = sActionCommand
       Else
          sActionCommand = ""
       End If
       Elenco.Add Operazione, Operazione.Comando
       lRegKeyIndex = lRegKeyIndex + 1
    Loop
    RegCloseKey HKEY_CLASSES_ROOT
End Function
Private Function TrimNull(startstr As String) As String
    On Error Resume Next
    Dim ipos As Integer
    ipos = InStr(startstr, Chr$(0))
    If ipos Then
       TrimNull = Left$(startstr, ipos - 1)
       Exit Function
    End If
    TrimNull = startstr
End Function
Function QueryValueEx(ByVal lhKey As Long, ByVal szValueName As String,
vValue As Variant) As Long
      On Error GoTo QueryValueExError
      Dim lType As Long
      Dim cch As Long
      Dim rc3 As Long
      Dim lrc As Long
      rc3 = RegQueryValueExNULL(lhKey, szValueName, 0&, lType, 0&, cch)
      If rc3 <> 0 Then Error 5
      Select Case lType
             Case REG_SZ, REG_EXPAND_SZ:
                  sValue = String(cch, 0)
                  lrc = RegQueryValueExString(lhKey, szValueName, 0&, lType,
sValue, cch)
                  If lrc = 0 Then
                     vValue = Left(sValue, cch)
                  Else
                     vValue = Empty
                  End If
             Case Else
                  vValue = Empty
                  lrc = -1
      End Select
QueryValueExExit:
    QueryValueEx = lrc
    Exit Function
QueryValueExError:
      vValue = Empty
      Resume QueryValueExExit
End Function
Private Sub TrimValue()
    On Error Resume Next
    If vValue = "" Then
       sValue = ""
    Else
       sValue = vValue
       sValue = TrimNull(sValue)
    End If
End Sub
Private Function CreaComando(sStringa As String, sFileName As String)
    Dim sComando    As String
    Dim npos        As Integer
    Dim sWindowDir  As String * MAX_PATH_LENGTH
    npos = InStr(1, LCase(sStringa), "%systemroot%")
    If npos > 0 Then
        Call GetWindowsDirectory(sWindowDir, Len(sWindowDir))
        npos = InStr(1, sWindowDir, Chr(0)) - 1
        sStringa = Left(sWindowDir, npos) & Mid(sStringa,
Len("%systemroot%") + 1, Len(sStringa))
    End If
    npos = InStr(1, sStringa, "%1")
    If npos > 0 Then
        sComando = Left(sStringa, npos - 2) & " " & sFileName
        Shell sComando, vbMaximizedFocus
    Else
        Shell sStringa & " " & Chr(34) & sFileName & Chr(34),
vbMaximizedFocus
    End If
End Function
Public Function LoadFile(sFileName As String)
    Dim sEstensione As String
    Dim Operazione  As COperazioni
    LoadFile = False
    Set Elenco = New Collection
    sEstensione = Right(sFileName, 4)
    FillComandi sEstensione
    If Elenco Is Nothing Then Exit Function
    For Each Operazione In Elenco
        If LCase(Operazione.Comando) = "open" Then
            CreaComando Operazione.Operazioni, sFileName
        End If
    Next Operazione
    LoadFile = True
    Set Elenco = Nothing
End Function
-- 
MAX
http://www.birreonline.net
Chi beve birra campa cent'anni

 quali operazioni fare e quali applicazioni sono associate.
E tutta questa pappardella a cosa potrebbe servire? :)
Ciao


Legga dal registry a quali operazioni e programmi  è associata un
estensione.


 indica quali operazioni fare e quali applicazioni sono associate.
Massi, ti ringrazio per quel popo' di codice, ma leggi bene quanto ho
scritto sopra: "... e già lo faccio con una tabella e una Shell..."
Evidentemente non riesco a spiegarmi (e io stesso, non avendolo mai fatto,
non ci capisco molto), ma, in breve, "com'è possibile collegare (non
includere!!!) un oggetto OLE in un campo di database Acces usando DAO e
nessun controllo Data"?... Ecco, forse dicendo meno, si condiziona meno.

 meno, si condiziona meno.
Ops scusa avevo capito un altra cosa.


 ottenere la stessa cosa.
Bhe che posso dirti se non : Auguri ^_^
-- 
-Gigio@Work(?)-

 nessun controllo Data"?... Ecco, forse dicendo meno, si condiziona meno.
Beh, se mi hai plonkato non lo saprai mai :PPP
Ciao