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