|
Folgen in einem Menü mehrere Trennstriche unmittelbar aufeinander, weil die dazwischen liegenden Menüpunkte nicht vorhanden sind oder ausgeblendet wurden, sieht das weder schön noch sonderlich professionell aus. Natürlich können und sollten Sie sich die Mühe machen, bei dynamisch generierten oder sich verändernden Menüs vor dem Öffnen zu prüfen, welche Trennstriche überflüssig sind, und die überflüssigen dann verbergen. Bei vielen einzelnen Menüpunkten ist das mitunter, wenn viele Bedingungen zu prüfen sind, eine kniffelige Angelegenheit.
Einfacher wird es, wenn alle Menüpunkte, zumindest die in dem sich dynamisch verändernden Bereich, in einem Feld (Control-Array) zusammengefasst sind. Denn dann können Sie die folgende Hilfsfunktion verwenden, die sich um die Anzeige der Trennlinien automatisch kümmert. Sie brauchen ihr lediglich den Basisnamen des Control-Arrays zu übergeben. Wenn sich ergeben sollte, dass kein einziges Element sichtbar ist bzw. bleibt, gibt die Funktion True zurück. Bei Popup-Menüs rufen Sie die Funktion vor dem Aufruf der PopupMenu-Methode auf - anhand des Rückgabewerts können Sie entscheiden, ob das Menü überhaupt angezeigt werden soll. Bei anderen Menüs rufen Sie die Funktion am besten nach jeder Änderung des Inhalts auf und entscheiden auch hier anhand des Rückgabewertes, mit welchen Maßnahmen Sie eine Anzeige des Menüs unterdrücken. Leider können Sie die Funktion nicht im Click-Ereignis des übergeordneten Menüs aufrufen, da sich Visual Basic hier dagegen sperrt, die Sichtbarkeit von Menüpunkten zu ändern.
Public Function MenuHideSeparators(MenuItems As Object) As Boolean
Dim i As Integer
Dim nMenu As Menu
Dim nNextVisible As Boolean
Dim nItemVisible As Boolean
Dim nLastVisibleSepMenu As Menu
On Error Resume Next
For i = MenuItems.UBound To MenuItems.LBound Step -1
Set nMenu = MenuItems(i)
If Err.Number Then
Err.Clear
Else
With nMenu
If .Caption = "-" Then
If nNextVisible Then
.Visible = True
Set nLastVisibleSepMenu = MenuItems(i)
Else
.Visible = False
End If
nNextVisible = False
Else
If .Visible Then
nNextVisible = True
nItemVisible = True
Set nLastVisibleSepMenu = Nothing
End If
End If
End With
End If
Next 'i
If Not (nLastVisibleSepMenu Is Nothing) Then
nLastVisibleSepMenu.Visible = False
End If
MenuHideSeparators = nItemVisible
End Function
|