Selbstverständlich können Sie ein Form als Dialog verwenden,
der modal angezeigt wird (die übrigen Forms des Projekts sind so
lange gesperrt, wie das Dialog-Form sichtbar ist). Sie müssen dann
"nur" die im Dialog zu bearbeitenden Werte übergeben, das
Dialog-Form modal aufrufen, und nachdem der Anwender es geschlossen
hat, müssen Sie prüfen, ob der Anwender seine Eingaben mit
"OK" bestätigt hat, oder ob er den Dialog abgebrochen
hat. Insbesondere letzteres kann unter Umständen im Code in ein
ziemliches Hin und Her zwischen aufrufenden Code und dem Dialog-Form
ausarten. Viel praktischer, sicherer und später leichter
nachzuvollziehen wäre es doch, wenn Sie den Aufruf des Dialog-Forms
auf einen einzigen Funktionsaufruf beschränken könnten.
Dies ist gar nicht so kompliziert, wie es auf den ersten Blick
vielleicht erscheinen mag. Sie versehen das Dialog-Form mit einer
öffentlichen Funktion als Aufruf-Methode. Dieser Funktion, nennen
wir sie ShowDlg, übergeben Sie die zu bearbeitenden Werte (und
gegebenenfalls das aufrufende Form). Und wenn die Funktion
zurückkehrt, brauchen Sie nur zu prüfen, ob sie True (für
"OK") zurückgibt. Ist dies der Fall verarbeiten Sie die
zurückgegebenen Werte entsprechend - falls nicht, wurde der Dialog
abgebrochen, und Sie brauchen die Bearbeitungen der Werte nicht zu
berücksichtigen. Ein Aufruf sähe beispielsweise im Code so aus
Private Sub cmdChange_Click()
Dim nDlg As frmDlgTest
Dim nValue As String
nValue = lblValue.Caption
Set nDlg = New frmDlgTest
If nDlg.ShowDlg(nValue, Me) Then
lblValue.Caption = nValue
End If
End Sub
Das Prinzip beruht darauf, die Anzeige des Dialogs dieser Methode
zu überlassen und das Form beim Betätigen der OK- oder
Abbrechen-Schaltflächen nur zu verbergen, statt es zu entladen. So
können Sie noch in dieser Methode die Werte der Steuerelemente, die
zur Bearbeitung der Werte dienen, auslesen und in den
Methoden-Parametern zurückgeben. Ob der Anwender seine Eingaben
bestätigt hat, oder ob er den Dialog abgebrochen hat, wird in der
Form-lokalen Variablen mCancel festgehalten. Ist nach dem Anzeigen
des Forms (Me.Show) mCancel immer noch False, hat der Anwender die
OK-Schaltfläche betätigt - die geänderten Werte werden in die
Übergabe-Parameter zurückgeschrieben und die Methode ShowDlg
erhält den Rückgabewert True. Zuletzt wird noch das Form wieder
sauber entladen.
Der Code des aufgerufenen Dialog-Forms:
Private mCancel As Boolean
Public Function ShowDlg(Value As String, _
Optional ParentForm As Form) As Boolean
txtValue.Text = Value
mCancel = False
Me.Show vbModal, ParentForm
If Not mCancel Then
Value = txtValue.Text
ShowDlg = True
End If
Unload Me
End Function
Private Sub cmdCancel_Click()
mCancel = True
Me.Hide
End Sub
Private Sub cmdOk_Click()
Me.Hide
End Sub
Damit auch das Schließen des Dialog-Forms über das Systemmenü
bzw. die entsprechende Schaltfläche in der Titelleiste
berücksichtigt werden kann, müssen Sie noch das QueryUnload-Ereignis
des Dialog-Forms berücksichtigen. Wenn der Anwender das Form
schließt, enthält der Parameter UnloadMode des Ereignisses den
Konstanten-Wert vbFormControlMenu. In der Regel bedeutet dies einen
Abbruch eines Dialogs - die Variable mCancel sollte hier also auf
True gesetzt werden. Sie können natürlich diese Konvention
eigenwillig ins Gegenteil verkehren und mCancel gleich False lassen
- das Schließen des Dialogs würde dann als Bestätigung gelten.
Damit das Dialog-Form jedoch jetzt noch nicht entladen wird, sondern
erst ausdrücklich zum Abschluss der ShowDlg-Methode, ist der
Cancel-Parameter auf True zu setzen und stattdessen das Form mit
Me.Hide zu verbergen.
Private Sub Form_QueryUnload(Cancel As Integer, _
UnloadMode As Integer)
If UnloadMode = vbFormControlMenu Then
Cancel = True
mCancel = True
Me.Hide
End If
End Sub
Das Form des Beispiel-Projekts (siehe Download)
können Sie auch als Vorlage in Ihrem Templates-Verzeichnis im
Visual Basic-Ordner ablegen - Sie können es dann jederzeit als
Vorlage laden und beliebig modifizieren.
|