Hallo zusammen.
Ich habe eine Frage. Da ich aber ziemlicher Neuling bin, weiß ich nicht, ob die lösbar ist.
Ich habe Bilder in einem Formular verknüpft (pro Datensatz ein Bild). Der Bildpfad und der Dateiname sind dabei getrennt in einer Tabelle abgespeichert. Nun würde ich in dem entsprechenden Formular, wenn ich ein neues Bild verknüpfen möchte, per Kombinationsfeld den Pfad (Ordner) wählen können und in dem anderen Feld (Listenfeld?) werden dann alle Dateien in dem gewählten Ordner angezeigt. Beides soll dann entsprechend getrennt in der Tabelle gespeichert werden.
Danke für Hinweise.
Manus
Hallo,
vielleicht hilfts ...
http://www.access-o-mania.de/forum/index.php?topic=6117.0 (http://www.access-o-mania.de/forum/index.php?topic=6117.0)
Danke erstmal. So richtig ist das aber nicht das, was ich gemeint habe. Es sollen ja nicht die Dateien mit Pfad auszuwählen sein, sondern nur der Pfad und in einem anderen Feld die Dateien aus dem Pfad.
Ich habe es jetzt mal anders probiert. Aber es funktioniert auch nicht: Ich habe in ein Steuerelement mit Namen "Bildpfad" als Steuerelementinhalt den relativen Pfad angegeben (=CurrentProject.Path) und die Datei jeweils manuell eingegeben. Das würde mir schon reichen. Die Datenbank habe ich natürlich in den Bilderordner verschoben. Der Pfad und Bildname wird auch korrekt angezeigt, allerdings nicht das Bild. Woran kann das liegen?
Gruß.
Manus
Hallo,
dann musst Du das halt so anpassen, dass es Deinem Wunsch genügt... Der Link ist ja nur ein prinzipieller Vorschlag und keine fertige Lösung für Deine Aufgabe.
Das erste Kombi(listen)feld füllst Du mit den gefundenen Verzeichnissen, das zweite mit den Dateien, die im ausgewählten Verzeichnis zu finden sind.
Alternativ könnte das auch über den Verzeichnis-Dialog und den Filedialog realisiert werden.
Sorry, aber ich kenn mich nicht mit der Programmierung aus. Wie lasse ich den Access nach den Verzeichnissen und den Dateien suchen, die dann im Kombifeld angezeigt werden sollen?
Habe nun nach langer Suche zumindest die Verzeichnisauswahl hinbekommen:
Option Compare Database
Option Explicit
Private Type BROWSEINFO
hOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias _
"SHGetPathFromIDListA" (ByVal pidl As Long, _
ByVal pszPath As String) As Long
Private Declare Function SHBrowseForFolder Lib "shell32.dll" Alias _
"SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) _
As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal Msg As Long, wParam As Any, _
lParam As Any) As Long
Private Const BIF_RETURNONLYFSDIRS = &H1
Private Const BFFM_SETSELECTION = &H466
Private Const BFFM_INITIALIZED = 1
Global StartDir As String
Public Function VerzeichnisSuchen(szDialogTitle As String, _
StartVerzeichnis As String) As String
Dim X As Long
Dim bi As BROWSEINFO
Dim dwIList As Long
Dim szPath As String
Dim wPos As Integer
StartDir = StartVerzeichnis
With bi
.hOwner = hWndAccessApp
.lpszTitle = szDialogTitle
.ulFlags = BIF_RETURNONLYFSDIRS
.lpfn = DummyFunc(AddressOf BrowseCallbackProc)
End With
dwIList = SHBrowseForFolder(bi)
szPath = Space$(512)
X = SHGetPathFromIDList(ByVal dwIList, ByVal szPath)
If X Then
wPos = InStr(szPath, Chr(0))
VerzeichnisSuchen = Left$(szPath, wPos - 1)
Else
VerzeichnisSuchen = ""
End If
End Function
Public Function BrowseCallbackProc(ByVal hWnd As Long, ByVal uMsg As Long, _
ByVal lParam As Long, ByVal lpData As Long) As Long
Dim pathstring As String
Dim retval As Long
Select Case uMsg
Case BFFM_INITIALIZED
pathstring = StartDir
retval = SendMessage(hWnd, BFFM_SETSELECTION, _
ByVal CLng(1), ByVal pathstring)
End Select
BrowseCallbackProc = 0
End Function
Public Function DummyFunc(ByVal param As Long) As Long
DummyFunc = param
End Function
Wie kann ich nun die Dateien aus dem so ausgewählten Verzeichnis in ein anderes Kombinationsfeld/liste zur Auswahl übergeben?
Grüße.
Manus
Anbei ein bsp die auch deinen oben angegebenen code verwendet.
[Anhang gelöscht durch Administrator]
Vielen Dank! Das hat mir schonmal weitergeholfen. Wie kann ich nun die Liste so ändern, dass ich daraus eine Datei per Klick auswählen kann, die in das Feld "Dateiname" geschrieben/gespeichert wird? Kann ich aus dem Listenfeld einfach ein Kombinationsfeld machen?
Gruß.
Manus
Also irgendwas ist immer noch falsch. Ich bin jetzt nochmal die Datenbank angegangen und nun werden gar keine Bilder angezeigt.
Die Bildpfad-Auswahl wird über eine Befehlsfäche mit Klick ausgelöst:
Private Sub Verzeichnisauswahl_Click()
Dim strBildpfadName As String
If IsNull(Me!Bildpfad) Then
Me!Bildpfad = ""
End If
strBildpfadName = VerzeichnisSuchen _
("Wählen Sie bitte das Verzeichnis aus!", Me!Bildpfad)
If ((Not IsNull(strBildpfadName)) And (strBildpfadName <> "")) Then
Me!Bildpfad = strBildpfadName
End If
End Sub
Den Namen der Datei trage ich per Hand in ein Feld ein.
Außerdem habe ich einen Aktualisierungsbutton, der beim Klicken und beim öffnen des Formulars nochmal aktualisieren soll.
Private Sub cmdAktualisieren_Click()
BildAktualisieren
End Sub
Private Sub Form_Current()
BildAktualisieren
End Sub
Private Sub BildAktualisieren()
On Error GoTo BildAktualisieren_Err
Dim strBildpfad As String
strBildpfad = Nz(Me!Bildpfad & Me!Bilddatei, "")
If Dir(strBildpfad) = "" Then
strBildpfad = ""
End If
BildAktualisieren_Exit:
Me!picBildVerknuepft.Picture = strBildpfad
Exit Sub
BildAktualisieren_Err:
MsgBox "Das Bild konnte nicht geladen werden." & vbCrLf & "Fehler-Nr: " & Err.Number & vbCrLf & "Fehler-Beschreibung: " & Err.Description
strBildpfad = ""
Resume BildAktualisieren_Exit
End Sub
Beide Daten stehen nun korrekt in den jeweiligen Feldern und werden auch gespeichert. Das Bild wird aber trotzdem nicht angezeigt.
Wer kann mir da weiterhelfen?
Danke und Gruß.
Manus
Hallo,
setz mal einen Haltepunkt und prüfe mittels Einzelschritt den Ablauf des Codes und die Inhalte der Variablen...
Mindestens aber drucke den Inhalt von "strBildpfad" mit Debug.Print in das Direktfenster.
(Vermutlich fehlt der Backslash zwischen Pfad-und Dateiname)
Beim manuellen Durchlauf gibt es keine Fehler.
Wie und wo genau muss ich den debug.print-Befehl einsetzen?
Das Bild wird auch nicht angezeigt, wenn ich die Datenbank in denselben Ordner wie die Bilder kopiere und als Bildpfad (=CurrentProject.Path) angebe (siehe 3. Post). Wäre in diesem Fall die Lösung dieselbe? Diese Variante wäre mir fast noch lieber.
Hallo,
"Beim manuellen Durchlauf gibt es keine Fehler"
heißt was? Kein Syntax-Fehler oder logische/inhaltliche Fehler?
Direktbereich über Menüleiste/Ansicht/Direktfenster einblenden und mit Debug.Print ausgeben:
.
.
.
BildAktualisieren_Exit:
Debug.Print strBildpfad
Me!picBildVerknuepft.Picture = strBildpfad
.
.
btw: IsNull(strBildpfadName) ist bei Variablen des Datentyps "String" nicht anwendbar, nur bei "Variant" sinnvoll
Es gibt keine Syntaxfehler. Die Lösung ist wohl der fehlende Backslash zwischen Pfad und Dateiname. Wenn ich ihn manuell einfüge und dann aktualisiere, wird das Bild angezeigt. Allerdings wird er auch nicht automatisch geschrieben, wenn ich
BildAktualisieren_Exit:
Debug.Print strBildpfad
Me!picBildVerknuepft.Picture = strBildpfad
in das Direktfenster schreibe. Oder hab ich das falsch verstanden?
Versuchs mal so:
Private Sub BildAktualisieren()
On Error GoTo BildAktualisieren_Err
dim sPath as string
Dim strBildpfad As String
sPath = nz(Me!Bildpfad)
sPath = sPath & iif(len(sPath) > 0 And Right$(Me!Bildpfad, 1) <> "\", "")
strBildpfad = sPath & Nz(Me!Bilddatei, "")
If Dir(strBildpfad) = "" Then
strBildpfad = ""
End If
BildAktualisieren_Exit:
Me!picBildVerknuepft.Picture = strBildpfad
Exit Sub
BildAktualisieren_Err:
MsgBox "Das Bild konnte nicht geladen werden." & vbCrLf & "Fehler-Nr: " & Err.Number & vbCrLf & "Fehler-Beschreibung: " & Err.Description
strBildpfad = ""
Resume BildAktualisieren_Exit
End SubZitat von: ManusDei am Dezember 29, 2011, 12:11:29
Allerdings wird er auch nicht automatisch geschrieben, wenn ich
BildAktualisieren_Exit:
Debug.Print strBildpfad
Me!picBildVerknuepft.Picture = strBildpfad
in das Direktfenster schreibe. Oder hab ich das falsch verstanden?
Das solltest du nicht ins direktfenster schreiben, sondern in deinen Code
Funktioniert nicht so richtig.
sPath = sPath & iif(len(sPath) > 0 And Right$(Me!Bildpfad, 1) <> "\", "")
Fehler beim Kompilieren: Argument ist nicht optional.
Hallo,
in deiner IIF fehlt der Else - Teil!
Die besagt wenn die Länge der Variablen Pfad > 0 und das äußerst rechte Zeichen kein \ ist dann .... sollte ein \ eingefügt werden, sonst nix
versuch daher mal so
sPath = sPath & iif(len(sPath) > 0 And Right$(Me!Bildpfad, 1) <> "\", "\","")
HTH
Uups da hatte ich doch glatt den else Teil unterschlagen.
Aber wieso den Path per Auswahlmenue und die Datei dann per Hand eintragen?
Zitat von: DF6GL am Dezember 20, 2011, 16:53:51
...
Alternativ könnte das auch über den Verzeichnis-Dialog und den Filedialog realisiert werden.
Ich glaub jetzt auch das das Filedialog eher für dich zutrifft als sich alle dateien eines verzeichnisses im Formular anzeigen zu lassen.
Anbei mal ein Bsp.
[Anhang gelöscht durch Administrator]
Danke, das würde auch funktionieren.
Allerdings habe ich nun versucht, alles ein wenig zu automatisieren.
Der Name der Bilddatei besteht immer aus der individuellen Inventarnummer des entsprechenden Datensatzes (+.jpg). Daher ist der Steuerelementinhalt des Bildnamens =[Inventarnummer] & ".jpg"
Der Bildpfad soll besser relativ zu Datenbank angegeben werden, also =CurrentProject.Path & "\Unterverzeichnis\"
Beides wird nun im Formular korrekt in die Felder geschrieben. Das Bild wird jedoch nicht angezeigt. Und ich weiß nicht, warum...
Hallo,
nochmal:
fahre im Einzelschritt durch den Code und prüf die Inhalte der Variablen....
Alles klar. Der Fehler lag bei mir. Im Beispiel vorher hatte es ja auch funktioniert. Jetzt geht es auch mit der neuen Version.
Danke an alle.