Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Pfad/Ordner wählen per Kombinationsfeld & Anzeigen der Dateien des Ordners

Begonnen von ManusDei, Dezember 20, 2011, 11:51:42

⏪ vorheriges - nächstes ⏩

ManusDei

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


ManusDei

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

DF6GL

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.

ManusDei

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?

ManusDei

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

daolix

Anbei ein bsp die auch deinen oben angegebenen code verwendet.


[Anhang gelöscht durch Administrator]

ManusDei

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

ManusDei

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

DF6GL

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)

ManusDei

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.

DF6GL

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

ManusDei

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?

daolix

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 Sub


Zitat 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

ManusDei

Funktioniert nicht so richtig.

  sPath = sPath & iif(len(sPath) > 0 And Right$(Me!Bildpfad, 1) <> "\", "")

Fehler beim Kompilieren: Argument ist nicht optional.