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.

Abbildung 1: Testformular.

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:

  1. VBA schiebt die beiden Listen einmal hinein.
  2. Der Anwender arbeitet vollständig in der Seite – ohne VBA-Zugriffe.
  3. 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.

Dual-List-Selector
Eine kleine Demo über die Funktionalität und Bedienung
0
Views
0
Comments
YouTube
Ansehen

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

LinkedIn

Newsletter

Newsletter