EdgeBrowser - Ein Dual-List Control
Ein kostenfreies Steuerelement für Microsoft Access, das zwei Listen nebeneinander zeigt. Der Anwender verschiebt Einträge per Klick oder Drag & Drop, VBA lädt sie hinein und liest das Ergebnis wieder aus – gerendert im acEdgeBrowser, angesprochen über eine schlanke Klasse.
Zwei Listen nebeneinander, dazwischen wandern Einträge hin und her: das ist ein Muster, das man in Access immer wieder braucht – Felder auswählen, Spalten zusammenstellen, Empfänger zuordnen. Mit Bordmitteln bleibt es umständlich. Der DualList Selector löst das als fertiges Steuerelement, das im acEdgeBrowser rendert und sich aus VBA über eine einzige Klasse ansprechen lässt.
Was das Steuerelement macht
Das Steuerelement zeigt eine Liste Available (verfügbar) und eine Liste Selected (ausgewählt). Der Anwender ordnet die Einträge an, die Anwendung liest sie danach aus. Alles läuft nach dem Prinzip Laden → Bearbeiten → Speichern:
- VBA schiebt die beiden Listen einmal hinein.
- Der Anwender arbeitet vollständig in der Seite – ohne VBA-Zugriffe.
- VBA liest das Ergebnis nur dann, wenn es danach fragt.
Zwischen Laden und Speichern gibt es keine laufende Synchronisation. Das hält die Bedienung flüssig und die Formularlast gering.
In fünf Minuten eingebaut
Voraussetzung ist ein acEdgeBrowser-Steuerelement namens webDualList auf dem Formular. Der komplette Einbau:
Private WithEvents m_dl As clsDPdualList
Private Sub Form_Load()
Set m_dl = New clsDPdualList
m_dl.SetLists "Apple;Banana;Cherry", "Lemon;Mango" ' gepuffert
m_dl.InsertDelete = True
Me.OnTimer = "[Event Procedure]" ' im Code erforderlich
Me.TimerInterval = 250
End Sub
Private Sub Form_Timer() ' einmalig laden, wenn das Formular steht
Me.TimerInterval = 0
m_dl.Init Me.webDualList, "webDualList"
End Sub
Private Sub webDualList_DocumentComplete(URL As Variant)
If Not m_dl Is Nothing Then m_dl.HandleNavigationComplete
End Sub
Private Sub Form_Unload(Cancel As Integer)
If Not m_dl Is Nothing Then m_dl.Destroy
Set m_dl = Nothing
End Sub Das Ergebnis liest man beim Speichern in einem Aufruf:
Dim sAvail As String, sSel As String
m_dl.GetBoth sAvail, sSel Nicht in Form_Load navigieren: m_dl.Init lädt die Seite und gehört in den einmaligen Form_Timer, nicht in Form_Load – navigiert man den acEdgeBrowser zu früh, bleibt das Steuerelement schwarz. Und Me.OnTimer = "[Event Procedure]" muss im Code gesetzt werden; der Import eines Formularmoduls setzt die Ereigniseigenschaft nicht.
Bedienung
Diese Interaktionen finden vollständig in der Seite statt – ohne einen einzigen VBA-Aufruf:
| Aktion | Bedienung |
|---|---|
| Auswählen | Klick |
| Mehrfachauswahl | Strg+Klick (einzeln), Umschalt+Klick (Bereich) |
| Verschieben | Doppelklick, oder Ziehen per Drag & Drop |
| Umsortieren | Ziehen innerhalb derselben Liste |
| Filtern | Suchfeld über jeder Liste, das X löscht die Suche |
| Kontextmenü | Rechtsklick: sortieren, verschieben, an den Anfang/das Ende, sowie Insert und Delete |
Beim Ziehen zeigt eine Einfüge-Linie die Zielposition; zieht man den Cursor an den oberen oder unteren Rand, scrollt die Liste automatisch mit. Die Reihenfolge der Einträge bleibt erhalten und wird beim Auslesen zurückgemeldet.
Daten laden und lesen
Die Daten liegen wahlweise als Zeichenkette oder als Array vor. Als Zeichenkette:
m_dl.SetLists "Apple;Banana;Cherry", "Lemon;Mango"
' ... Anwender arbeitet ...
Dim sAvail As String, sSel As String
m_dl.GetBoth sAvail, sSel Als Array:
Dim vAvail As Variant, vSel As Variant
m_dl.SetArrays Array("Apple", "Banana", "Cherry"), Array("Lemon", "Mango")
' ... Anwender arbeitet ...
m_dl.GetBothArrays vAvail, vSel SetLists und SetArrays dürfen vor dem Laden aufgerufen werden – die Werte werden gepuffert und automatisch eingespielt, sobald die Seite bereit ist.
Ein Aufruf für beides: GetBoth bzw. GetBothArrays liest beide Listen in einem Round-Trip. Das ist dem zweifachen GetAvailable + GetSelected vorzuziehen.
Eigenschaften und Grenzen
| Eigenschaft | Typ | Standard | Bedeutung |
|---|---|---|---|
InsertDelete | Boolean | True | zeigt/verbirgt Insert und Delete im Kontextmenü |
IsReady | Boolean (Get) | – | True, sobald die Seite geladen ist |
Version | String (Get) | – | Versionszeichenkette der Komponente |
Einträge werden intern mit einem Semikolon aneinandergereiht.
Kein Semikolon im Eintrag: Ein Eintrag darf das Trennzeichen ; nicht enthalten – er würde beim Auslesen als zwei Einträge interpretiert. Enthalten die Daten Semikolons, ist das Trennzeichen in der Seite (SEP) zu ändern.
Einbindung
Das Laufzeitpaket besteht aus drei Dateien, die in dieser Reihenfolge importiert und danach kompiliert werden:
DPcoreDL.bas ' reduzierter, mitgelieferter Laufzeit-Kern
clsDPwebBridgeDL.cls ' Kommunikationsbrücke Access <-> Seite
clsDPdualList.cls ' das Steuerelement (die Seite ist darin eingebettet) Der Kern DPcoreDL wird mitgeliefert; eine separate Installation entfällt. Der Namenszusatz DL sorgt dafür, dass mehrere freie DIETERLE-Komponenten kollisionsfrei in derselben Datenbank leben.
Formular: Ein Form_*.cls lässt sich nicht über den VBA-Editor importieren. Das Demoformular frmDPdualList legt man mit den Steuerelementen an, fügt den Code ein und setzt die Ereigniseigenschaften auf [Ereignisprozedur]. Die Dateien sind UTF-8 mit CRLF – so importieren, nicht mit LF neu speichern.
Download
Kostenfreies Dual-List-Steuerelement für Microsoft Access auf Basis des acEdgeBrowser. Zwei Listen, Einträge per Mehrfachauswahl und Drag & Drop verschieben, das Ergebnis in einem Aufruf auslesen.
Voraussetzungen: Microsoft 365, Access 2024+, 32/64-bit




