Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

dynamisches Kontextmenü mit VBA

166 views
Skip to first unread message

Daniel Kerk

unread,
Jan 8, 2002, 2:47:16 PM1/8/02
to
Hallo,

ich habe folgendes Problem: in einem Formular soll ein Kontextmenü erzeugt
werden, dessen Einträge aus einer Datenbank kommen, nach dem Auswählen eines
Menüpunktes soll eine Methode aufgerufen werden, an der die ID des
Menüpunktes übergeben werden soll.
Wie läßt sich das realisieren? Die Eigenschaft OnAction von CommandBarButton
unterstützt anscheinend keine Parameter, eine Deklaration mittels "Dim
WithEvents button(20) as CommandBarButton" scheitert, da WithEvents keine
Arrays unterstützt.
Da die Zahl der Einträge im Menü immer unterschiedlich ist, kann ich
schlecht für jeden Eintrag eine eigene Methode implementieren.

Gibt es da überhaupt eine Lösung?

Mfg
Daniel

Günther Ritter

unread,
Jan 9, 2002, 12:43:03 PM1/9/02
to
"Daniel Kerk" <dan...@online.de> schrieb
...

Hallo Daniel
Du kannst Deinem Control in der Symbolleiste eine Funktion übergeben und
damit auch Parameter, die wiederum optional sein können. Auswertung dann in
der Funktion.
Einfaches Beispiel:

Sub Uebergabe()
Dim objComBar As Object 'Office.CommandBar
Set objComBar = CommandBars("Form View")
objComBar.Controls("Drucken...").OnAction = "=test(""123"",""456"")"
End Sub

Public Function test(a As String, Optional b As String)
If a <> "" Then MsgBox a
If b <> "" Then MsgBox b
End Function

Hth
Günther
http://www.access-hilfe.de


Daniel Kerk

unread,
Jan 9, 2002, 2:59:43 PM1/9/02
to
Vielen Dank, da muss man auch erstmal drauf kommen, dass das bei Sub's nicht
funktioniert sondern nur mit Functions....

"Günther Ritter" <gri...@gmx.de> schrieb im Newsbeitrag
news:a1i0o2$qbo97$1...@ID-11508.news.dfncis.de...

Bernd Heumann

unread,
Jan 9, 2002, 10:21:25 AM1/9/02
to
Hallo Daniel.

Daniel Kerk wrote:
>
> Hallo,
>
> ich habe folgendes Problem: in einem Formular soll ein Kontextmenü erzeugt
> werden, dessen Einträge aus einer Datenbank kommen, nach dem Auswählen eines
> Menüpunktes soll eine Methode aufgerufen werden, an der die ID des
> Menüpunktes übergeben werden soll.

Meinst du eine Methode eines Klassenmoduls/Forms?
Die kannst du meines Wissens nicht direkt aus einem Menu aufrufen.
Du kannst aber eine Globale Function definieren, welche den
Methodenaufruf kapselt(s.u.)

> Wie läßt sich das realisieren? Die Eigenschaft OnAction von CommandBarButton
> unterstützt anscheinend keine Parameter, eine Deklaration mittels "Dim
> WithEvents button(20) as CommandBarButton" scheitert, da WithEvents keine
> Arrays unterstützt.
> Da die Zahl der Einträge im Menü immer unterschiedlich ist, kann ich
> schlecht für jeden Eintrag eine eigene Methode implementieren.
>
> Gibt es da überhaupt eine Lösung?

Da gibt es sicher mehrere Lösungen.

>
> Mfg
> Daniel

Anbei poste ich ein paar Codeschnipsel, mit denen ich sowas mal gelöst
habe.

Schau auch bei Annette Becker auf http://www.pc-creativ.de vorbei. Dort
findest du
eine Beispiel MDB und Infos zum dynamischen Umgang mit Menüs.

Ansonsten könntest du auch statt der Commandbar ein eigenes Formular
basteln, welches du bei
rechtem Mouseclick ein-, und bei Verlassen wieder ausblendest.

Grüße Bernd


Sub set_pl_Sort_menu()
'Neue Menüpunkte im Untermenü 'Playlist Sortieren' aus Tabelle anfügen
'Pl_SortMenu ist das Kontextmenu
'Diese Sub dient zur Aktualisierung des Playlist-Kontextmenüs.
Dim rst As Recordset
Dim Auswahl4 'As CommandBarButton

clear_pl_Sort_Menu 'Zunächst alle vorhandenen Menupunkte entfernen

'Tabelle der Menupunkte öffnene
Set rst = CurrentDb.OpenRecordset("Select SO_Name,SO_ID,SO_Group from
tbl_PL_Sort order by SO_Order")

If rst.RecordCount > 0 Then
rst.MoveFirst
While Not rst.EOF 'für jeden Datensatz der Abfrage

'Neuen Menubutton erzeugen/anfügen
Set Auswahl4 = CommandBars("PL_SortMenu").Controls("Playlist
Sortieren").Controls.Add()

' Parameter des Menubuttons setzen
With Auswahl4
.Caption = rst!SO_Name
.ToolTipText = ""
.Style = msoButtonCaption
.Visible = True
.BeginGroup = rst!SO_Group
'Diese Funktion soll der Menuebutton aufrufen (Function muß public
sein)
.OnAction = "=SortPlaylist(" + Str(rst!SO_Id) + ")"
End With
rst.MoveNext
Wend
'Untermenu nicht leer -> Menü aktivieren
If CommandBars("PL_SortMenu").Controls("Playlist
Sortieren").Controls.count > 0 Then
CommandBars("PL_SortMenu").Controls("Playlist Sortieren").Enabled =
True
End If
End If
rst.Close
Set rst = Nothing
End Sub

Sub clear_pl_Sort_Menu()
'Löscht alle Menüpunkte im Untermenü 'Playlist Sortieren'
'Pl_SortMenu ist das Kontextmenu
Dim Auswahl4
For Each Auswahl4 In CommandBars("PL_SortMenu").Controls("Playlist
Sortieren").Controls()
Auswahl4.Delete
Next
Set Auswahl4 = CommandBars("PL_SortMenu").Controls("Playlist
Sortieren")
With Auswahl4
If .Controls.count < 1 Then .Enabled = False 'Untermenu leer ->
Menü ausschalten
End With
End Sub

function sortplaylist(id as long) as boolean
'Wird vom Kontextmenu aufgerufen und dient nur zum kapseln der
Formularmethode

'Formularmethode aufrufen
forms!frm_Playlist.sortiere id
end function

0 new messages