Windows Explorerbar als Style-Element

By , 25. März 2007

Die Windows XP Explorer Bar ist ein Element das unter Windows z.B. zur Darstellung von gruppierten Menüfunktion eingesetzt wird, aber auch der Suchdialog von WinXP ist letztlich eine Explorerbar. Da ich diese Darstellung für sehr gefällig in Formularen, z.B. zur Navigation, finde, bin ich just dabei einen Assistenten zu erstellen der mir bequem aus den Eingaben für Gruppe, Menüpunkt, Befehl und Argument ein Formular erstellt das in der Unterformularansicht eingebunden wird.

Theoretisch läuft das ab wie beim bekannten Ãœbersichtsmanager von Access, der eine Tabelle „SwitchboarItems“ und ein Formular „Ãœbersicht“ erzeugt. Was beim Ãœbersichtsmanager die Einträge in der Hauptübersicht sind sind im Explorer Bar die Gruppen.

Bei der Arbeit lernte ich viele neue Technikten kennen, über die ich hier berichten möchte. Zum einen muss ja mit jedem neuen Menüeintrag in das erzeugende Formular Code geschrieben werden zur Ausführung der gewählten Befehle. Außerdem muss ja auch die Möglichkeit gegeben sein per Click ein Menüeintrag wieder zu löschen und mit ihm auch der Code. Außerdem müssen die verschiedensten Controls erzeugt werden, gewählte Icons aus einer ImageList extrahiert werden und dem Bildsteuerelement zugeordnet werden, etc. Des weiteren sollen ja auch die Gruppen minimiert und maximiert werden können. Eine Menge an Code für diesen kleinen Effekt.

Die Themen im Einzelnen:

Codezeilen automatisiert in den Modulcode schreiben:

Ã"hnlich wie beim Ãœbersichtsmanager werden die auszuführende Befehle codiert, d.h. die 1 entspricht Formular öffnen, die 2 entspricht Bericht öffnen etc, siehe Bild unten.

Assistent zum Einfügen von Menüeinträgen

Der neuerstellte Eintrag besteht aus einem Bildfeld und einem Bezeichnungsfeld. Bei Klick auf Bild- oder Bezeichnungsfeld soll das Formular „frm_Demo“ geöffnet werden. Die zugehörigen Prozeduren sehen so aus:

Private Sub lbl_entry21_Click()
    DoCmd.OpenForm "frm_Demo"
End Sub

bzw.

Private Sub pic_entry21_Click()
    DoCmd.OpenForm "frm_Demo"
End Sub

Die 21 steht für die 2. Gruppe und für den ersten Eintrag in der Gruppe 2. Die Leerzeile nach dem Befehl wird automatisch eingefügt und spielt eigentlich nur bei der Löschung des Codes eine Rolle. Der Code der beim Klicken auf „neuer Eintrag“ ausgeführt wird ist in Auszügen folgender:

Dim frmName As String
Dim frm As Form
Dim lngPointer As Long
frmName = "neu_erstelltes_Formular"
DoCmd.OpenForm frmName, acDesign, , , , acHidden
Set frm = Forms(frmName)
lngPointer = frm.Module.CreateEventProc("Click", "lbl_entry" & Gruppennummer & Eintragsnummer)
frm.Module.InsertLines lngPointer + 1, vbTab & "Call doCommand  & Me!Argument & , " & CInt(Me!Befehl)
lngPointer = frm.Module.CreateEventProc("Click", "pic_entry" & Me!gruppe & entryNumber)
frm.Module.InsertLines lngPointer + 1, vbTab & "Call doCommand  & Me!Argument & , " & CInt(Me!Befehl)

Zuerst wird das Formular im Entwurfsmodus verdeckt geöffnet, dann wird die leere Prozedur mit frm.Module.CreateEventProg() eingefügt. Diese Funktion gibt die Zeile im Modulcode zurück wo die Prozedur eingefügt wurde. Dazu verwenden wird die Variable lngPointer, um im nächsten Schritt zu wissen wo der Befehlsaufruf eingefügt werden muss, nämlich in der nachfolgende Zeile lngPointer + 1. Damit der Befehlsaufruf gut sichtbar ist wird er eingerückt, dafür steht das vbTab.

Suchen im Modulcode und löschen/ersetzen von Codestellen:

Wird zum späteren Zeitpunkt veröffentlicht

Erstellen von Formular und Steuerelemente per Code:

Wird zum späteren Zeitpunkt veröffentlicht

Steuerelemente per Code löschen:

Wird zum späteren Zeitpunkt veröffentlicht

IDE (VBA Editor) per Code aufrufen:

Wird zum späteren Zeitpunkt veröffentlicht

Ausdrucksgenerator per Code aufrufen und Werte übernehmen:

Wird zum späteren Zeitpunkt veröffentlicht

Bilder aus Imagelist Control extrahieren und als Bilder speichern:

Dazu verwende ich folgenden Code, der in einer beliebigen Ereignisprozedur sein kann. Dabei wird das Icon mit der Keybezeichnungs als Namen auf Laufwerk C: gespeichert. Erforderlich dafür ist, dass der Verweiss OLE Automation eingebunden wird.

Dim i As long
For i = 1 To Me.ImageList1.ListImages.count
    SavePicture Me.ImageList1.ListImages(i).Picture, "C:" & Me.ImageList1.ListImages(i).Key & i & ".bmp"
Next i

Leave a Reply

You must be logged in to post a comment.

OfficeFolders theme by Themocracy