Flexible Schaltflächen
Wenn Sie auf einem selbstprogrammierten Dialog viele Textboxen mit Bedienungselementen brauchen, können Sie den Aufwand mit einem einfachen Trick reduzieren: Anstatt zu jeder Textbox die passenden Buttons vorzubereiten, verschieben Sie diese einfach immer nur zur gerade aktiven Textbox. Das macht sowohl den Dialog übersichtlicher als auch den VBA-Code erheblich kürzer, wie Lorenz Hölscher weiß.
Flexible Schaltflächen
Auf vielen selbstprogrammierten Dialogen gibt es Eingabefelder mit der Möglichkeit, deren Inhalt fett, kursiv o. ä. zu formatieren. Das führt dann oft dazu, dass neben jedem Eingabefeld die Format-Schaltflächen eingebaut werden, wie es das folgende Beispiel zeigt:
Ein schlecht gestalteter Dialog, der mit Schaltflächen überladen ist
Zwar "weiß" dann jede Schaltfläche, zu welchem Eingabefeld sie gehört, aber dafür müssen Sie auch jedes ihrer Klick-Ereignisse einzeln programmieren. Im obigen Beispiel sind das für 7 Eingabefelder schon 21 ..._Click-Prozeduren. Das ist nicht nur optisch überladen, sondern auch ein riesiger Code-Aufwand.
Stattdessen benötigen Sie lediglich ein Schaltflächen-Paket, welches Sie jeweils zum gerade aktuellen Eingabefeld schieben. Dieses lässt sich immer mit Me.ActiveControl ermitteln, am besten beim ..._Enter-Ereignis des Eingabefeldes, denn nur dann ändert es sich sinnvollerweise.
Damit sich das ActiveControl nicht versehentlich ändert (z. B. beim Klick auf eine Schaltfläche!!), speichern Sie dieses sofort in einer Modul-öffentlichen Variablen m_ctlEdit. Jedes der Eingabefelder wird später diese Variable beeinflussen und die Schaltflächen zu sich heranholen. Daher können Sie das sofort in eine eigene Prozedur HoleButtons auslagern, welche von allen Eingabefeldern aus aufgerufen wird:
Option Explicit
Dim m_ctlEdit As TextBox
Dim m_strNameAktiv As String
Private Sub edtVorname_Enter()
HoleButtons
End Sub
Private Sub edtNachname_Enter()
HoleButtons
End Sub
Private Sub edtStrasse_Enter()
HoleButtons
End Sub
Private Sub edtPLZOrt_Enter()
HoleButtons
End Sub
Private Sub edtTelefon_Enter()
HoleButtons
End Sub
Private Sub edtFax_Enter()
HoleButtons
End Sub
Private Sub edtEmail_Enter()
HoleButtons
End Sub
Private Sub HoleButtons()
m_strNameAktiv = Mid(Me.ActiveControl.Name, 4)
Set m_ctlEdit = Me.Controls("edt" & m_strNameAktiv)
End SubHier heißen die Beschriftungsfelder lbl... und die Eingabefelder edt... mit dem gleichen Namen, wie es die so genannte Ungarische Notation sowieso nahe legt. Das hat unter anderem den Vorteil, dass zu jedem Eingabefeld immer das zugehörige Beschriftungsfeld ermittelbar ist.
