Rubrik: Oberfläche · Menüs | VB-Versionen: VB4, VB5, VB6 | 04.08.06 |
![]() ![]() In diesem Tipp verraten wir Ihnen, wie Sie Probleme mit PopUp-Menüs umgehen können, wenn diese unter bestimmten Umständen einfach nicht angezeigt werden. | ||
Autor: ![]() | Bewertung: ![]() ![]() ![]() ![]() ![]() | Views: 27.535 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Vista, Win7, Win8, Win10 | ![]() |
Folgendes Szenario:
- Auf einem Formular befindet sich ein ListView-Control
- Bei Rechtsklick auf einen Eintrag soll ein PopUp-Menü angezeigt werden (via Me.PopUpMenu ...)
- Im Click-Event des Menü-Eintrags wird eine zweite Form modal aufgerufen, die ebenfalls ein ListView oder TreeView-Control enthält
- Auch im zweiten Formular soll per Rechtsklick auf einen Listeneintrag wieder ein PopUp-Menü aufgerufen werden können
- Leider Fehlanzeige! Das PopUp-Menü wird nicht angezeigt!
Ursache:
Beim Aufruf des PopUp-Menüs im ersten Formular beansprucht das Menü alle Tastatur- und Mausereignisse für sich und zwar solange, bis das Click-Event des PopUp-Menüs vollständig abgearbeitet wurde. Dadurch dass die zweite Form aber modal geladen wird, bleibt die Ausführung des Codes in Form1 zunächst nach Aufruf der "Form2.Show vbModal"-Methode stehen.
Abhilfe schafft hier der Einsatz eines Timers.
Anstelle die zweite Form im Click-Event des PopUp-Menüs aufzurufen wird der Timer mit einer kurz eingestellten Intervallzeit gestartet. Die Click-Prozedur hat nun genügend Zeit den restlichen Code abzuarbeiten, ehe dann das Timer-Ereignis eintritt. Von hier aus wird dann die zweite Form aufgerufen und schon funktioniert's mit dem PopUp-Menü in der zweiten Form.
Beispiel:
Erstellen Sie ein neues Projekt:
- Platzieren Sie auf die Form1 einen CommandButton (Command1) und ein Timer-Control (Timer1)
- Öffnen Sie den VB-Menüeditor und erstellen einen neuen Menü-Eintrag "MyPopUp" mit Visible = False
- Fügen Sie ein paar Untermenüs ein (mnuPopUp(0), mnuPopUp(1), etc.)
- Fügen Sie dem Projekt eine neue Form hinzu (Form2)
- Platzieren Sie auf die 2. Form ebenfalls wieder einen CommandButton (Command1)
- Erstellen Sie für die zweite Form das gleiche PopUp-Menü wie für die erste Form
Code für die Form1
Fügen Sie nachfolgenden Code in den Codeteil der Form1:
Private Sub Command1_Click() ' Bei Klick auf den Button, PopUp-Menü öffnen Me.PopupMenu MyPopUp End Sub
Private Sub mnuPopUp_Click(Index As Integer) ' Test: ohne Timer wird die zweite Form ' zwar korrekt angezeigt, jedoch wird dort dann kein ' weiteres PopUp-Menü mehr angezeigt ' If Index = 0 Then ' Load Form2 ' Form2.Show vbModal ' End If ' Exit Sub ' Form2 öffnen ' Umweg über Timer! Timer1.Tag = Index Timer1.Interval = 20 Timer1.Enabled = True End Sub
Private Sub Timer1_Timer() Dim Index As Integer ' Timer deaktivieren Timer1.Enabled = False ' mnuPopUp_Click hier auswerten! Index = Val(Timer1.Tag) If Index = 0 Then ' Bei Auswahl des ersten Menü-Eintrags, Form2 anzeigen Load Form2 Form2.Show vbModal End If End Sub
Code für die Form2:
Fügen Sie nachfolgenden Code in den Codeteil der Form2 ein:
<code>Private Sub Command1_Click() ' Bei Klick auf den Button, PopUp-Menü öffnen Me.PopupMenu MyPopUp End Sub