17. juni 2003 - 14:30Der er
13 kommentarer og 2 løsninger
OLE Objeckt - link/embed - Access 97
Hej! Har en database hvor jeg opbevarer billeder som OLE objekter. Tidligere skulle strukturen af DB'en vaere mobil (eks kopierbar til CD osv.), men nu skal projektet udbygges til at kunne ligge paa en server hvor billederne tilfoejes server-side, mens brugeren linker til back-enden med tabeller og linkede OLE-objekter. Eller det troede jeg da ihvertfald :-) Jeg bruger en form til at tilfoeje nye billeder, hvor brugere laver drag'n drop med billeder ind paa en boks i formen. Dette OLE-objekt er sat til kun at have linked OLE Type tilladt i den nye version af DB'en. Men problemet er nu at hvis jeg begynder at slaebe billeder ind vokser stoerrelsen paa DB'en lige saa hurtgit som da billederne blev embedded. Hvis jeg flytter billederne viser de sig stadig i DB'en hvilket staerkt indikerer at de stadig bliver embedded. Men hvordan hulen kan de det naar det OLE-objekt de bliver placeret igennem kun har linked som tilladt type? Er der nogle generelle seeting for DB'en jeg har glippet. Er der ikke noget der kan aendres paa tabel-niveau der kun vil tillade linkede objekter istedet?
Jeps - det har jeg gjort. Saa den gik fra 270mb til 4.3mb. Derefter smed jeg to bmp-filer ind i hvad der skulle vaere den linkede struktur, men DB'en hoppped til 12.6 mb. Efter endnu en komprimering endte den paa 10.6.......
henkrik -> tak for det. Det er en rimelig loesning hvis man skal bruge billeder som ligger paa ens egen computer/taster path til billedet ind. Men jeg er noed til at bibeholde drag & drop effekten, da db'en skal kunne benyttes uden at skulle til at skrive UNC-stier til serveren osv. Det kunne maaske lade sig goere vha. en eller anden form for "openfile boks" hvor man tager stien og laegger i en string, men saa forsvinder UNC-stien til fordel for computeren egen mapping af netvaerk. Jeg forstaar stadig ikke hvorfor OLE-objektet lader til at blive embedded naar jeg har sat det til kun at maate blive linket. Jeg koerer win2k paa et lamt bruger-nivaeu hvor jeg faar nogle halv-gustne fejl-meldinger omkring OLE naar jeg starter visse programmer men ikke Access! Jeg kan pt heller ikke viewe jp og gif filer pga fil-associering, men det skulle ikek anedre noget hvis jeg arbejder med et bmp billede.
ok, jeg har nu forsoegt at benytte noget a' la henriks foreslag. Men for at bevare drag'n drop funktionalitet ligger stien til en fil som et hyperlink i tabellen istedet. Dette virker fint naar man traekker et billede ned, og der benyttes automatisk en UNC-sti. Men naar jeg saa indsaetter et Picture og proever at faa billedet vist ved at string hyperlinket som sti til billedet, virker skidtet ikke:
Dim strPath As String strPath = Me.path Me.imgPic.Picture = strPath
hvor me.path er en usynlig tekstboks som indeholder hyperlinket. Men fremfor at bibeholde UNC-stien ser den ud til at blive fordoblet, og billedet vil ikke vises da den ikke kan finde stien:
"Run-time error 2220
Microsoft access can't open the file '\\servernavn\shared\billeddb\mitbillede.tif#\\servernavn\shared\billeddb\mitbillede.tif' "
what in Bob's name is going on?? ( skal nok laegge flere point hvis det bliver en lang loesning)
Jeg har ikke tid til lige nu, at nærlæse indlæggende, men kan forstå at en del af problemet er at "omsætte" en del af en hyperlink til en tekststreng. Jeg indsætter denne kode i en formular:
Me.Kommandoknap20.HyperlinkAddress = LaunchCD(Me) Me.felt1 = Me.Kommandoknap20.HyperlinkAddress 'Hvis der er et billede, så hvis det ellers et tomt felt If Not IsNull(Me!felt1) Then Me!Billede.Picture = Me.felt1 Else Me!Billede.Picture = "" End If
Og modulert ser således ud:
Option Explicit Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _ "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long Private Type OPENFILENAME lStructSize As Long hwndOwner As Long hInstance As Long lpstrFilter As String lpstrCustomFilter As String nMaxCustFilter 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 lCustData As Long lpfnHook As Long lpTemplateName As String End Type
Function LaunchCD(strform As Form) As String Dim OpenFile As OPENFILENAME Dim lReturn As Long Dim sFilter As String OpenFile.lStructSize = Len(OpenFile) OpenFile.hwndOwner = strform.Hwnd sFilter = "All Files (*.*)" & Chr(0) & "*.*" & Chr(0) & _ "bmp Files (*.BMP)" & Chr(0) & "*.BMP" & Chr(0) OpenFile.lpstrFilter = sFilter OpenFile.nFilterIndex = 1 OpenFile.lpstrFile = String(257, 0) OpenFile.nMaxFile = Len(OpenFile.lpstrFile) - 1 OpenFile.lpstrFileTitle = OpenFile.lpstrFile OpenFile.nMaxFileTitle = OpenFile.nMaxFile 'OpenFile.lpstrInitialDir = "c:\company shared folders\relief" OpenFile.lpstrInitialDir = "D:\VBA funktioner\VBA"
OpenFile.lpstrTitle = "Vælg en fil og tryk på Åbn." OpenFile.flags = 0 lReturn = GetOpenFileName(OpenFile) If lReturn = 0 Then MsgBox "Manglende fil!", vbInformation, _ "Du har ikke valgt en fil fra Stifinderen." Else LaunchCD = Trim(OpenFile.lpstrFile) End If End Function
Koden åbner stifinderen hvor brugeren vælger et billede, der ligger udenfor databasen.
Koden er oprindelig skrevet i Access97, men fungerer også i 2000 / xp. Jeg skal gerne senere idag sende en konverteret version. Blot læg din e-mail.
hey mugs Jeps, men at faa billedet ind som et hyperlink var egentligt ikke problemet laengere (jvf. 17/06-2003 17:10:34) da man kan drag'n drop filen for at faa et hyperlink, som agiver UNC-stien fint. Problemet ligger i at konvertere dette link til en streng bagefter - naar man skal se billederne i en form. Hyperlinket ligger i tabellen, men kan aabenbart ikke konverteres direkte til string - for saa bliver stien/linket fordoblet med"#" i midten. Alternativet kan selvf. blive at bruge din metode hvis jeg ikke kan faa drag & drop til at virke, men det skal helst vaere en relativt nemt og hurtigt metode som lader brugeren tilfoeje billeder. Databasen er designet til at indeholde taksonomisk information om en raekke marine arter (smaa dyr), og man skal vaere istand til at smide billeder ind under hver art naar man har taget et digitalt billede via ens mikroskop. Disse skal derfor helt kunne behnadles hurtigt da dette kun er et "side-projekt" til hoved-analysen :-)
Jeg gentager: Jeg har ikke haft tid til at nærlæse indlæggene, så måske ved jeg slet ikke hvad jeg taler om.
Men så vidt jeg kan se, konverterer "min" kode ("eller hvor jeg nu har stjålet den fra" netop en hyperlink til en tekststreng. Der er et tekstfelt i tabellen der oberført til formularens OnCurrent event henter billedet fra billedmappen. Hvis brugeren så vil skifte billede, trykkes blot på en kommandoknap, og stifinderen å¨bner i en default mappe for valg af billede. Denne adresse overføres så til formularens tekstfelt, som herefter angiver hvor det nye billede skal hentes.
Ja, det goer den godt nok, men jeg er ikke helt 100 paa at jeg forstaar tricket i koden.... OpenFile.lpstrFile = String(257, 0) ... LaunchCD = Trim(OpenFile.lpstrFile)
hvad foregaar der lige der? Min string-length er varaible pga filnanve..
Jeg forstår heller ikke det hele i koden. Det var et spørgsmål på e, der handlede om at indsætte billeder der ligger udenfor db. Det svarede jeg på, hvorefter der kom et andet spørgsmål der gik ud på at indsætte et valgfrit, eller at skifte et eksisterende billede via stifinderen. Jeg søgte på e, og fandt denne kode der åbner stifinderen.
Og siden har jeg ikke beskæftiget mig med koden, da jeg ikke skal bruge den til noget.
Bortset fra idag, da jeg synes den kunne relatere til dit spørgsmål
Det tror jeg ogsaa den goer, jeg mener bare at den arbejder med at fastsat laengde af string, hvilket ikke er saa godt i mit tilfaelde. Hmmm... eftersom jeg ved at strengen dobles og at der er et "#" i midten kunne jeg vel traekke end fra, og tage halvdelen... noget i retning af:
strHlink = me.Hyperlinkthingy
strHlink = left(strHlink,((strhlink-1)/2))
Det vil jeg lige afproeve imorgen naar jeg kommer paa arbejde, og laegger en post med hvordan det gik.
Jeps det virkede! Det er ikke en optimal loesning, da det bliver svart svaert af verificere eller "previewe" billederne paa samme tidpunkt som de bliver lagt ind, men det burde kunne virke alligevel. Saa bare for reference:
Jeg skifter fra et OLE-objekt, som tidligere blev brugt til at opbevare billederne direkte i databasen i en anden version, til hyperlink til billederne. Problemet med hyperlink var at jeg fik en "dobbeltsti" ud naar jeg proevede at konvertere det til en streng der kunne bruges som sti-inidkator for mit billede paa en formular. For at omgaa dette bliver streng-udtrykket istedet: strHlink = left(me.path, (len(me.path)-2)/2) hvor me.path indeholder hyperlinket, og strHlink bliver stien til mit billede Tak til baade Henkrik og mugs for hjaelpen, i faar begge point :-)
"svaert af verificere eller "previewe" billederne paa samme tidpunkt som de bliver lagt ind"
Når jeg skifter et billede kommer det omgående på skærmen. Må jeg sende min testdb, der er lavet efter princippet fra Teknologisk Institut.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.