von DPunch » Di, 03.05.2011 22:07
Aloha
geimist hat geschrieben:Das einfachste wäre, ich könnte auf ein Bildfeld in der DB-Tabelle zugreifen
Ich wüsste nicht, dass das geht - da das Bild ja direkt als Binärdatei in die Datenbank geschrieben wird, bliebe höchstens, das Bild temporär wieder auf den jeweiligen Rechner zu schreiben.
geimist hat geschrieben:Ein Notbehelf ist dieser: Man erstellt in einem Formular der DB ein Imagecontrol und speichert darin (!nicht als Verknüpfung!) das gewünschte Bild.
Auf diese Weise ist das prinzipiell kein Problem (siehe auch
Bild in Dialog).
geimist hat geschrieben:Da ich das Formular aber nicht öffnen möchte, will ich "von auserhalb" darauf zugreifen.
Das Auslesen der internen URLs, ohne das entsprechende Formular störend zu öffnen wäre entweder über das versteckte Öffnen oder über das Auslesen der content.xml des entsprechenden Formulars zu bewerkstelligen.
Das versteckte Öffnen ist die deutlich einfachere Methode, aber ansonsten hier mal ein Beispiel, wie das Auslesen ohne jegliches Öffnen funktionieren würde:
(die Bilder werden dabei über den Namen des ImageControls im Formular identifiziert).
Code: Alles auswählen
Function getImage(sImageName as String, sFormName as String, Optional DataSource as Object)
If isMissing(DataSource) Then
DataSource = thisDatabaseDocument
End If
If NOT DataSource.FormDocuments.hasByName(sFormName) Then Exit Function
oForm = DataSource.FormDocuments.getByName(sFormName)
sPersistantName = oForm.PersistentName
oForms = DataSource.getDocumentSubStorage("forms",1)
oForm = oForms.getByName(sPersistantName)
If NOT oForm.hasByName("Pictures") Then Exit Function
oImages = oForm.getByName("Pictures")
oInputStream = oForm.openStreamElement("content.xml",1)
oTextStream = createUnoService("com.sun.star.io.TextInputStream")
oTextStream.InputStream = oInputStream
aDelimiter = Array(ASC("<"))
Do While NOT oTextStream.isEOF
sLine = oTextStream.readString(aDelimiter,True)
nStart = Instr(sLine,"image-frame form:name=")
If nStart > 0 Then
nStart = nStart + 23
nEnd = Instr(nStart,sLine,"""")
sResultingPicName = Mid(sLine,nStart,nEnd-nStart)
If sResultingPicName = sImageName Then
nStart = Instr(sLine,"/")+1
nEnd = Instr(nStart,sLine,"""")
sURL = Mid(sLine,nStart,nEnd-nStart)
Exit Do
End If
End If
Loop
oTextStream.closeInput
oImage = oImages.getByName(sURL)
oGraphicProvider = createUnoService("com.sun.star.graphic.GraphicProvider")
Dim args(1)as new com.sun.star.beans.PropertyValue
args(0).Name = "InputStream"
args(0).Value = oImage.InputStream
getImage = oGraphicProvider.queryGraphic(args)
End Function
Anwendung:
Code: Alles auswählen
Sub Main
oMeinImageControl = meinDialog.getControl("meinImageControlImDialog") 'z.B. "ImageControl1"
sNameDesImageControlsImFormular = "NameMeinesImageControlsImFormular" 'am besten mit sprechendem Namen, z.B. "Bild1"
sNameDesFormularsMitDenEmbeddedImages = "NameDesFormulars" 'z.B. "Formular1"
'Verwendung aus demselben .odb File heraus:
oMeinImageControl.Model.Graphic = getImage(sNameDesImageControlsImFormular,sNameDesFormularsMitDenEmbeddedImages)
'*oder: aus einem beliebigen File:
'*oDatabaseContext = CreateUNOService("com.sun.star.sdb.DatabaseContext")
'*oDataSource = oDatabaseContext.getByName("meineRegistrierteDatenbank") 'bzw die URL der .odb
'*oMeinImageControl.Model.Graphic = getImage(sNameDesImageControlsImFormular,sNameDesFormularsMitDenEmbeddedImages,oDataSource.DatabaseDocument)
End Sub
Edit: Nochmal daraufhin angepasst, dass man es von jedem beliebigen Dokument aus benutzen kann (in diesem Fall muss das DatabaseDocument mit übergeben werden).
Aloha
[quote="geimist"]Das einfachste wäre, ich könnte auf ein Bildfeld in der DB-Tabelle zugreifen[/quote]
Ich wüsste nicht, dass das geht - da das Bild ja direkt als Binärdatei in die Datenbank geschrieben wird, bliebe höchstens, das Bild temporär wieder auf den jeweiligen Rechner zu schreiben.
[quote="geimist"]Ein Notbehelf ist dieser: Man erstellt in einem Formular der DB ein Imagecontrol und speichert darin (!nicht als Verknüpfung!) das gewünschte Bild.[/quote]
Auf diese Weise ist das prinzipiell kein Problem (siehe auch [url=http://de.openoffice.info/viewtopic.php?f=18&t=43396&start=0]Bild in Dialog[/url]).
[quote="geimist"]Da ich das Formular aber nicht öffnen möchte, will ich "von auserhalb" darauf zugreifen.[/quote]
Das Auslesen der internen URLs, ohne das entsprechende Formular störend zu öffnen wäre entweder über das versteckte Öffnen oder über das Auslesen der content.xml des entsprechenden Formulars zu bewerkstelligen.
Das versteckte Öffnen ist die deutlich einfachere Methode, aber ansonsten hier mal ein Beispiel, wie das Auslesen ohne jegliches Öffnen funktionieren würde:
(die Bilder werden dabei über den Namen des ImageControls im Formular identifiziert).
[code]Function getImage(sImageName as String, sFormName as String, Optional DataSource as Object)
If isMissing(DataSource) Then
DataSource = thisDatabaseDocument
End If
If NOT DataSource.FormDocuments.hasByName(sFormName) Then Exit Function
oForm = DataSource.FormDocuments.getByName(sFormName)
sPersistantName = oForm.PersistentName
oForms = DataSource.getDocumentSubStorage("forms",1)
oForm = oForms.getByName(sPersistantName)
If NOT oForm.hasByName("Pictures") Then Exit Function
oImages = oForm.getByName("Pictures")
oInputStream = oForm.openStreamElement("content.xml",1)
oTextStream = createUnoService("com.sun.star.io.TextInputStream")
oTextStream.InputStream = oInputStream
aDelimiter = Array(ASC("<"))
Do While NOT oTextStream.isEOF
sLine = oTextStream.readString(aDelimiter,True)
nStart = Instr(sLine,"image-frame form:name=")
If nStart > 0 Then
nStart = nStart + 23
nEnd = Instr(nStart,sLine,"""")
sResultingPicName = Mid(sLine,nStart,nEnd-nStart)
If sResultingPicName = sImageName Then
nStart = Instr(sLine,"/")+1
nEnd = Instr(nStart,sLine,"""")
sURL = Mid(sLine,nStart,nEnd-nStart)
Exit Do
End If
End If
Loop
oTextStream.closeInput
oImage = oImages.getByName(sURL)
oGraphicProvider = createUnoService("com.sun.star.graphic.GraphicProvider")
Dim args(1)as new com.sun.star.beans.PropertyValue
args(0).Name = "InputStream"
args(0).Value = oImage.InputStream
getImage = oGraphicProvider.queryGraphic(args)
End Function[/code]
Anwendung:
[code]Sub Main
oMeinImageControl = meinDialog.getControl("meinImageControlImDialog") 'z.B. "ImageControl1"
sNameDesImageControlsImFormular = "NameMeinesImageControlsImFormular" 'am besten mit sprechendem Namen, z.B. "Bild1"
sNameDesFormularsMitDenEmbeddedImages = "NameDesFormulars" 'z.B. "Formular1"
'Verwendung aus demselben .odb File heraus:
oMeinImageControl.Model.Graphic = getImage(sNameDesImageControlsImFormular,sNameDesFormularsMitDenEmbeddedImages)
'*oder: aus einem beliebigen File:
'*oDatabaseContext = CreateUNOService("com.sun.star.sdb.DatabaseContext")
'*oDataSource = oDatabaseContext.getByName("meineRegistrierteDatenbank") 'bzw die URL der .odb
'*oMeinImageControl.Model.Graphic = getImage(sNameDesImageControlsImFormular,sNameDesFormularsMitDenEmbeddedImages,oDataSource.DatabaseDocument)
End Sub[/code]
Edit: Nochmal daraufhin angepasst, dass man es von jedem beliebigen Dokument aus benutzen kann (in diesem Fall muss das DatabaseDocument mit übergeben werden).