Zusammenfassung
Lernen Sie eine Bildverwaltung mit vielen Features für Access kennen.
Techniken
Bilder, GDI+, VBA, TreeView, ListView
Voraussetzungen
Access 2000 und höher
Beispieldateien
Notizverwaltung00.mdb, Notizverwaltung02.mdb, MSCOMCTL.msi
André Minhorst, Duisburg
In der letzten Ausgabe hat Access im Unternehmen Ihnen die Notizverwaltung vorgestellt, die Ordnung ins Zettelchaos bringen kann: Ein übersichtliches TreeView-Steuerelement verschafft dabei einen überblick über die in verschiedenen Kategorien gespeicherten Notizen. In dieser Ausgabe erhält die Notizverwaltung weitere Funktionen wie eine Möglichkeit zum Speichern von Dateiverweisen und eine Suchfunktion. Im nachfolgenden Text finden Sie Details zu den verwendeten Techniken.
Gegenüber der im ersten Teil dieser Beitragsreihe vorgestellten Version enthält die aktuelle Fassung zwei zusätzliche interessante Funktionen: Die erste bietet die Möglichkeit, zu jeder Notiz beliebig viele Verknüpfungen zu Dateien zu erstellen. Das Verzeichnis und der Dateiname der Dateien werden in einem ListView-Steuerelement unten rechts im Hauptfenster der Anwendung angezeigt (siehe Bild 1).
Der Clou ist, dass sich die Informationen zu den verknüpften Dateien durch einfaches Ziehen der Datei in das ListView-Steuerelement in der Tabelle tblDateien speichern lassen und anschließend im ListView angezeigt werden.
Die zweite Neuerung ist die Such-Funktion, die sich über die Schaltfläche Suche öffnen lässt. Die Suchfunktion befindet sich in einem eigenen Formular, das ein Textfeld zum Eingeben der Suchbegriffe enthält und die Ergebnisse in einer Liste anzeigt (siehe Bild 2). Es lassen sich einer oder mehrere Suchbegriffe in das Textfeld eingeben, die durch „und“ oder „oder“ verknüpft werden können.
Hyperlinks lassen sich leicht in den Text einer Notiz einfügen, wieder herauskopieren und im Browser anzeigen. Bei Dateien ist das ein wenig schwieriger: Die lassen sich nicht so schnell öffnen, wenn nur der Pfad in der Notiz enthalten ist – und außerdem lassen sie sich nicht auf einfache Weise aus dem URL-Textfeld des Browsers in ein Access-Steuerelement ziehen. Mit Dateinamen funktioniert das schon: Deshalb beherbergt die Notizverwaltung in Zusammenhang mit der aktuellen Notiz stehende Dateien in einem ListView-Steuerelement, von dem aus die Dateien per Doppelklick mit der passenden Anwendung geöffnet werden können.
Damit das funktioniert, benötigen Sie die Funktionalität aus dem Beitrag Dateinamen per Drag and Drop (Shortlink 326). Dieser Beitrag stellt die Klasse CDragDrop vor, die unter anderem die beiden Methoden FileDropped und ManyFilesDropped enthält.
Bild 1: Das Hauptformular der Notizverwaltung mit dem ListView zur Anzeige verknüpfter Dateien
Bild 2: Die Suchfunktion liefert eine Liste aller Notizen mit den angegebenen Suchbegriffen.
Hinweis
Die in der Notizverwaltung verwendete Klasse CDragDrop unterscheidet sich unwesentlich von der im oben genannten Beitrag. Beachten Sie außerdem, dass die Klasse Subclassing einsetzt, was bei geöffnetem VBA-Editor zu Problemen führen kann. Im schlimmsten Fall lähmt die Datenbankanwendung das ganze System und es hilft nur das Abschießen über den Task-Manager, den Sie in dem Fall auch nur über die Tastenkombination Strg + Alt + Entf erreichen. Aber wie gesagt: Probleme gibt es nur bei geöffnetem VBA-Editor. Und den sollte der normale Benutzer eigentlich nicht zu Gesicht bekommen.
Um die Methoden der Klasse in einem Formular einsetzen zu können, deklariert man die Klasse im Formularmodul etwa folgendermaßen:
Private WithEvents CDrag As CDragDrop
Die beiden Ereignisse werden ausgelöst, wenn der Benutzer eine oder mehrere Dateien auf ein bestimmtes Steuerelement im Formular zieht. Dazu müssen Sie dem passenden Objekt mitteilen, welches Steuerelement es beobachten soll. Im Falle des Formulars frmNotizen passiert dies in der Prozedur, die durch das Ereignis Beim Laden ausgelöst wird. Die folgenden Zeilen instanzieren das CDrag-Objekt, weisen ihm als Zielsteuerelement der Drag and Drop-Operationen das ListView-Steuerelement zur Anzeige der verknüpften Dateien zu und rufen die Methode SubClassHookForm auf, um das Formular zu „subclassen“.
Set CDrag = New CDragDrop CDrag.SubClassHook ctlListView.hwnd
Interessant sind die beiden Ereignisprozeduren, die das Objekt CDrag bereitstellt, wenn es als WithEvents deklariert ist. Diese lassen sich leicht über die beiden Kombinationsfelder des VBA-Codefensters des Formularmoduls anlegen (siehe Bild 3).
Was passiert nun mit diesen Methoden Man legt sie wie ganz normale Ereignisprozeduren an und fügt dort den Code ein, der beim Ziehen einer Datei auf das angegebene Steuerelement ausgelöst werden soll. Im vorliegenden Fall soll der Pfad in das Verzeichnis und den Dateinamen aufgeteilt und in der Tabelle tblDateien gespeichert werden (siehe Bild 4).
Jeder neue Datensatz enthält außerdem die ID der Notiz, mit dem die hinzugefügte Datei verknüpft ist. Außerdem soll das ListView-Steuerelement ctlListView die Dateiinformationen anzeigen (siehe Bild 5).
Bild 3: Anlegen der Ereignisprozeduren des CDrag-Objekts
Bild 4: Die Tabelle tblDateien speichert die Dateiinformationen und die ID der Notiz, mit der diese Datei verknüpft ist.
Bild 5: Aus der Liste der mit einer Notiz verknüpften Dateien lässt sich eine Datei per Kontextmenü öffnen.
Dies alles erledigen die beiden Ereignisse FileDropped und ManyFilesDropped – je nachdem, ob der Benutzer eine oder mehrere Dateien ausgewählt und auf das ListView-Steuerelement gezogen hat. Quellcode 1 zeigt die Routine, die beim Ziehen einer einzelnen Datei auf die Liste ausgelöst wird (die Variante für mehrere Dateien sieht ähnlich aus).
Die Routine prüft zunächst, ob im TreeView-Steuerelement überhaupt gerade eine Notiz und nicht etwa eine Kategorie markiert ist.
Handelt es sich um eine Notiz, schreibt sie zunächst einen neuen Datensatz mit den entsprechenden Informationen in die Tabelle tblDateien und fügt dann einen Eintrag zum ListView-Steuerelement hinzu (Know-how zum ListView-Steuerelement finden Sie in den Beiträgen mit den Shortlinks 336, 337, 338 und 339).
Was hilft schon eine Datenbank zum Anlegen von Notizen, wenn man nicht per Volltextsuche darin suchen kann
Also haben wir der Notizverwaltung auch noch eine Suchfunktion verpasst. Diese lässt sich über die Schaltfläche Suche im oberen Teil des Hauptformulars aktivieren und erwartet die Eingabe eines oder mehrerer mit „und“ oder „oder“ verknüpfter Suchbegriffe.
Die Schaltfläche zum Aufrufen des Suchformulars löst zunächst die folgende Anweisung aus und öffnet damit das Suchformular als modalen Dialog:
DoCmd.OpenForm "frmSuche", _ WindowMode:=acDialog
Das Suchformular sieht im Entwurf wie in Bild 6 aus. Das Textfeld txtSuchbegriffe erwartet die Eingabe der Suchbegriffe, während die Optionsgruppe ogrVerknuepfung zwei Optionen zur Auswahl der Verknüpfung der einzelnen Suchbegriffe enthält.
Zur Anzeige des Suchergebnisses dient schließlich ein ListView-Steuerelement namens ctlListView.
Quellcode 1: Diese Routine schreibt Informationen zu Dateien, die in das ListView-Steuerelement des Formulars gezogen wurden, in die Tabelle tblDateien und in das ListView-Steuerelement.
Private Sub CDrag_FileDropped(Filename As String) Dim objListItem As ListItem Dim db As DAO.Database Dim rst As DAO.Recordset Dim lngID As Long Dim strDateiname As String Dim strVerzeichnis As String If Not IsNull(Me.NotizID) Then strDateiname = Mid(Filename, _ InStrRev(Filename, "\") + 1) strVerzeichnis = Left(Filename, _ InStrRev(Filename, "\")) Set db = CurrentDb Set rst = db.OpenRecordset("tblDateien", dbOpenDynaset) rst.AddNew rst!Dateiname = strDateiname rst!Verzeichnis = strVerzeichnis rst!NotizID = Me.NotizID lngID = rst!DateiID rst.Update Set objListItem = ctlListView.ListItems.Add _ (, "a" & lngID, strDateiname) objListItem.ListSubItems.Add , , strVerzeichnis rst.Close Set rst = Nothing Set db = Nothing End If End Sub
Ein Klick auf die Schaltfläche cmdSuchen ruft ebenso wie das Ereignis, das nach dem Aktualisieren des im Textfeld txtSuchbegriffe ausgelöst wird, die Routine SucheStarten auf (s. Quellcode 2):
Private Sub cmdSuchen_Click() SucheStarten End Sub
Diese Routine ist in Quellcode 2 abgebildet. Sie prüft zunächst, ob das Textfeld txtSuchbegriff überhaupt einen Text enthält. Falls ja, teilt die Split-Funktion die enthaltene Zeichenkette in alle durch ein Leerzeichen getrennten Teile auf und speichert diese in einem String-Array namens strSuchbegriffe.
Die folgende For Next-Schleife iteriert über alle im Array enthaltenen Suchbegriffe, ergänzt jeden Suchbegriff zu einem Ausdruck wie Notiz LIKE “*<Suchbegriff>*“, wobei es <Suchbegriff> durch den aktuellen Suchbegriff ersetzt und die einzelnen Bedingungen getrennt vom ausgewählten Verknüpfungsoperator aneinanderfügt.
Wenn das Textfeld txtSuchbegriffe etwa den Inhalt „Access Formular“ hätte und die Suchbegriffe durch „und“ verknüpft werden sollten, sähe der erzeugt Ausdruck folgendermaßen aus:
AND Notiz LIKE “*Access*“ AND Notiz LIKE *Formular*“
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo