PDA

Vollständige Version anzeigen : PopupMenu: Eine Klasse zur einfachen Erstellung von Kontextmenüs


Struppi73
01.02.2007, 23:47
PopupMenu


Mich nervt die Programmierung von Menüs und Kontextmenüs immer irrsinnig. Jede Menge stupiden Code runtertippen, nur damit danach bei einem Rechtsklick so ein kleines Popup aufgeht, war mir immer ein Dorn im Auge. Hinzu kommt, dass die CommandBars für Newbies häufig ein Buch mit sieben Siegeln sind, und sie die streng hierarchische Erstellung nicht ohne weiteres durchschauen. Aus diesem Grund möchte ich euch mit der Demo-Datenbank ein kleines Klassenmodul zur Verfügung stellen, das ich mir für die stressfreie Erstellung von benutzerdefinierten Kontextmenüs geschrieben habe. Ein weiteres Klassenmodul für benutzerdefinierte Symbol- und Menüleisten wird ggf. bei Gelegenheit folgen.

Das Klassenmodul ist selbstverständlich frei verwendbar. Würde mich freuen, wenn ihr den Copyrightvermerk drinlassen würdet, und stelle für das Herunterladen, Auspropieren und Verwenden nur zur Bedingung, dass ihr hier im Thread ein Feedback hinterlasst. Anregungen und Verbesserungsvorschläge sind natürlich willkommen!

Die Enummerationen:
<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="REM">'Enummeration der Konstanten von msoControlType</span>
<span class="TOKEN">Public</span> <span class="TOKEN">Enum</span> PupCtlType
pButton = 1 <span class="REM">'Schaltfl&auml;che (Button)</span>
pEdit = 2 <span class="REM">'ein Eingabefeld</span>
pDropdown = 3 <span class="REM">'&auml;hnlich dem vorhergehenden, mit aufklappbarer Liste (z.B.Schriftgr&ouml;&szlig;e)</span>
pComboBox = 4 <span class="REM">'ein Kombinationsfeld</span>
pPopUp = 10 <span class="REM">'Das typische Men&uuml;element, das beim Klicken ein Untermen&uuml; &ouml;ffnet</span>
<span class="TOKEN">End</span> <span class="TOKEN">Enum</span>
&nbsp;
<span class="REM">'Enummeration zur Style-Methode bei CommandBarButton</span>
<span class="TOKEN">Public</span> <span class="TOKEN">Enum</span> PupBtnStyle
pAutomatic = 0 <span class="REM">'Automatische Styleanpassung</span>
pCaption = 2 <span class="REM">'Nur Text</span>
pIcon = 1 <span class="REM">'Nur Icon</span>
pIconAndCaption = 3 <span class="REM">'Text und Icon</span>
<span class="TOKEN">End</span> <span class="TOKEN">Enum</span>
&nbsp;
<span class="REM">'Enummeration zur zur Style-Methode bei CommandBarComboBox</span>
<span class="TOKEN">Public</span> <span class="TOKEN">Enum</span> PupCmbStyle
pNormal = 0 <span class="REM">'ohne Beschriftung</span>
pLabel = 1 <span class="REM">'mit Beschriftung</span>
<span class="TOKEN">End</span> <span class="TOKEN">Enum</span>
&nbsp;</pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

Im Enum PupCtlType sind zwar alle möglichen Konstanten von msoControlType aufgeführt, in Kontextmenüs verwendet man jedoch üblicherweise nur Buttons und Popups (für Untermenüs), daher werden die restlichen nicht weiter unterstützt.

Die Methoden:

Create
Erzeugt das Kontextmenü. Parameter:
sPupName As String: Der Name des Kontextmenüs, frei wählbar.

AddItem
Fügt einen Menüeintrag zum Kontextmenü hinzu. Parameter:
eCtlType As PupCtlType: (siehe Enummerationen)
sCaption As String: Die Beschriftung des Menüeintrags
sAction As String: Der Name der Funktion, die beim Klick auf den Menüeintrag aufgerufen werden soll. (Subs funktionieren hier nicht, nur Funktionen!)
iFaceID As Integer: Die FaceID der Access-internen Icons (sehr hilfreich: Klick mich: FaceID browser for Microsoft Office (http://skp.mvps.org/faceid.htm))
eBtnStyle As PupBtnStyle: Standard pAutomatic (siehe Enummerationen)
eCmbStyle As PupCmbStyle: Standard pNormal (siehe Enummerationen)
bGroup As Boolean: Wenn True, wird vor dem Menüeintrag eine Trennlinie eingefügt. Standard False.
bEnabled As Boolean: Wenn False, wird der Menüeintrag gegraut (nicht anklickbar). Standard True.
Rückgabewert: Verweis auf ein Objekt vom Typ CommandBarControl

AddSubItem
Fügt einen Untermenüeintrag zum Kontextmenü hinzu. Parameter:
Die selben wie bei der Methode AddItem, und zusätzlich:
oPupItem As CommandBarPopup: Verweis auf die Popupschaltfläche, die das Untermenü öffnet. Wurde von AddItem zurückgegeben.
Rückgabewert: Verweis auf ein Objekt vom Typ CommandBarControl
Da es der Ethik von Windows entspricht, dass ein Kontextmenü Untermenüs, aber keine UnterUntermenüs enthält, gibt es auch kein AddSubSubItem ;)

Catch
Verweist auf ein bereits bestehendes Kontextmenü. Parameter:
sPupName As String: Der Name des Kontextmenüs

Show
Zeigt das Kontextmenü an. Parameter: Keine.

ExistsPopup
prüft das Vorhandensein eines Kontextmenüs. Parameter:
sPupName As String: Der Name des Kontextmenüs
Rückgabewert: True falls ein Kontextmenü dieses Namens bereits existiert, False wenn nicht.

Wie simpel ein Kontextmenü mit diesen paar Methoden nun erstellt werden kann, könnt ihr der Demo-Datenbank entnehmen. Um das Klassenmodul in eigenen Anwendungen verwenden zu können, muss ein Verweis auf die Microsoft Office x.0 Object Library gesetzt werden. Getestet ist das Ganze mit Access2000 und der Microsoft Office 9.0 Object Library.

Viel Spaß!! :)

Struppi73
08.02.2007, 14:56
22 Downloads der Demo, und nicht in einziger Beitrag als Feedback.. Gestattet mir die Bemerkung, aber ich finde das schwach! Und wenn ihr das Teil auch total mies und überflüssig finden solltet, so fände ich eine kurze Bemerkung hierzu wirklich gut.

Linus1971
08.02.2007, 16:24
Ich habe mir das Beispiel auch runter geladen. Bin bisher nur nicht dazu gekommen es zu testen.

Habe Deine berechtigte Kritik aber zum Anlass genommen, es jetzt zu tun.

Mir gefällt das Beispiel. Funktioniert sehr gut.

Werde es jetzt mal Versuchsweise in meine kleine Datenbank einbauen. Habe auch schon eine sehr gute Verwendung dafür.

Ich werde es bei der DVD-Verwaltung einbauen als Kontextmenü zum Einbinden von Bilder. So kann man eine Menge Buttons von der Oberfläche verbannen.

Und noch eine Anmerkung: Mies und schlecht ist keines Der Beispiele hier. Ich sehe so etwas immer als Anregung.

Struppi73
09.02.2007, 00:48
Mies und schlecht ist keines Der Beispiele hier
Ich sehe das ganz genauso! Wollte damit aber ausdrücken, dass Feedback auch dann willkommen ist, wenn jemand sagen möchte, was ihm nicht gefällt.

Dass nun positive Rückmeldung kommt, freut mich natürlich umso mehr. Konnte die Popup-Menu-Klasse selbst noch nicht richtig testen, da ich zur Zeit noch an einer Undo/Redo-Funktionalität bastle. Ist noch kniffliger als ich dachte, werde noch ein paar Tage brauchen. Danach ist auf jeden Fall noch eine analoge Klasse für Symbol- und Menüleisten geplant, insofern wäre es cool, wenn es bis dahin ggf. ein paar Anregungen oder Verbesserungsvorschläge zum Thema gäbe.

Danke dir!

Linus1971
18.02.2007, 18:08
Hallo Dirk,

ich habe ein Problem beim Einbinden deines Beispiel.

Habe die Module alle in meine Datenbank eingebunden. Soweit funktioniert das ganze auch, aber wenn ich mit der rechten Maustaste das Kontextmenü aufrufe, dann aber mit der linken Maustaste in einen anderen Bereich des Formulars klicke, schmiert meine Datenbank ab.

Wenn ich eine Funktion in dem Kontextmenü auswähle, wird diese auch ausgeführt. Das urspüngliche Kontektmenu (was von Access kommt) wird dann nach dem Ausführen der Funktion auch noch geöffnet.

Was mache ich falsch?

bubaonline
18.02.2007, 22:28
Hallo,

Super Tool. :)
Bislang habe ich Kontextmenues "von Hand" erstellt.

Gruß
Buba

Linus1971
18.02.2007, 22:41
Habe meinen Fehler gefunden. Man sollte auch das Standardkontextmenü deaktivieren.

Struppi73
20.02.2007, 14:22
@Linus: Sorry, gerade viel zu tun, konnte nicht sofort antworten. Aber richtig, das Standard-Kontextmenü sollte deaktiviert werden :-)
@Buba: vielen Dank!

Struppi73
20.02.2007, 14:54
Da ich mittlerweile die Klasse nicht nur für Kontextmenüs verwende, sondern auch für Symbolleisten, nachstehend die angepasste Version. Einfach austauschen:

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="REM">'******************************************************************************* *************</span>
<span class="REM">' cEasyMenu</span>
<span class="REM">' (Version 0.2 v. 11.02.2007)</span>
<span class="REM">' Men&uuml;-Klasse f&uuml;r VBA</span>
<span class="REM">' &copy; 2007 Dirk Staudenmaier &lt;dirkstau@arcor.de&gt;</span>
<span class="REM">'</span>
<span class="REM">'Versionshistorie:</span>
<span class="REM">'Version 0.1 v. 29.01.2007 (cPopupMenu) Einfache Erstellung von Kontextmen&uuml;s</span>
<span class="REM">'Version 0.2 v. 11.02.2007 Umbenennung in cEasyMenu, zus&auml;tzl. Unterst&uuml;tzung von Symbolleisten</span>
<span class="REM">'******************************************************************************* *************</span>
&nbsp;
<span class="TOKEN">Option</span> <span class="TOKEN">Compare</span> <span class="TOKEN">Database</span>
<span class="TOKEN">Option</span> <span class="TOKEN">Explicit</span>
&nbsp;
<span class="REM">'Enummeration der Men&uuml;position</span>
<span class="REM">'Standardm&auml;&szlig;ig erzeugt die Add-Methode der Commandbars-Collection eine Symbolleiste.</span>
<span class="REM">'--&gt; &quot;emKontext&quot; f&uuml;r Kontextmen&uuml;, &quot;emMenuBar&quot; f&uuml;r Men&uuml;leiste</span>
<span class="TOKEN">Public</span> <span class="TOKEN">Enum</span> EMPosition
emLeft <span class="REM">'Plaziert am linken Fensterrand</span>
emTop <span class="REM">'Plaziert am oberen Fensterrand</span>
emRight <span class="REM">'Plaziert am rechten Fensterrand</span>
emBottom <span class="REM">'Plaziert am unteren Fensterrand</span>
emFloating <span class="REM">'Bestimmt, das die Befehlsleiste nicht verankert wird</span>
emKontext <span class="REM">'erstellt die Befehlsleiste als Kontextmen&uuml;</span>
emMenuBar <span class="REM">'erstellt die Befehlsleiste als Men&uuml;leiste</span>
<span class="TOKEN">End</span> <span class="TOKEN">Enum</span>
&nbsp;
<span class="REM">'Enummeration der Konstanten von msoControlType</span>
<span class="TOKEN">Public</span> <span class="TOKEN">Enum</span> EMCtlType
emButton = 1 <span class="REM">'Schaltfl&auml;che (Button)</span>
emEdit = 2 <span class="REM">'ein Eingabefeld</span>
emDropdown = 3 <span class="REM">'&auml;hnlich dem vorhergehenden, mit aufklappbarer Liste (z.B.Schriftgr&ouml;&szlig;e)</span>
emComboBox = 4 <span class="REM">'ein Kombinationsfeld</span>
emPopup = 10 <span class="REM">'Das typische Men&uuml;element, das beim Klicken das Men&uuml; &ouml;ffnet und Untermen&uuml;</span>
<span class="TOKEN">End</span> <span class="TOKEN">Enum</span>
&nbsp;
<span class="REM">'Enummeration zur Style-Methode bei CommandBarButton</span>
<span class="TOKEN">Public</span> <span class="TOKEN">Enum</span> EMBtnStyle
emAutomatic = 0
emCaption = 2
emIcon = 1
emIconAndCaption = 3
<span class="TOKEN">End</span> <span class="TOKEN">Enum</span>
&nbsp;
<span class="REM">'Enummeration zur zur Style-Methode bei CommandBarComboBox</span>
<span class="TOKEN">Public</span> <span class="TOKEN">Enum</span> EMCmbStyle
emNormal = 0
emLabel = 1
<span class="TOKEN">End</span> <span class="TOKEN">Enum</span>
&nbsp;
<span class="REM">'Memberveriablen</span>
<span class="TOKEN">Private</span> moMenu <span class="TOKEN">As</span> CommandBar
<span class="TOKEN">Private</span> msName <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Private</span> mePos <span class="TOKEN">As</span> EMPosition
<span class="TOKEN">Private</span> mbMainMenu <span class="TOKEN">As</span> <span class="TOKEN">Boolean</span>
<span class="TOKEN">Private</span> mbTemp <span class="TOKEN">As</span> <span class="TOKEN">Boolean</span>
&nbsp;
&nbsp;
<span class="TOKEN">Private Sub</span> Class_Initialize()
<span class="REM">'* Datum : 29.01.2007</span>
<span class="REM">'* Autor : Dirk Staudenmaier</span>
<span class="REM">'* LastEdited : 29.01.2007</span>
<span class="REM">'******************************************************************************* *************</span>
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span><hr><span class="REM">'******************************************************************************* *************</span>
&nbsp;
&nbsp;
<span class="TOKEN">Private Sub</span> Class_Terminate()
<span class="REM">'* Datum : 29.01.2007</span>
<span class="REM">'* Autor : Dirk Staudenmaier</span>
<span class="REM">'* LastEdited : 29.01.2007</span>
<span class="REM">'******************************************************************************* *************</span>
<span class="TOKEN">Set</span> moMenu = <span class="TOKEN">Nothing</span>
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span><hr><span class="REM">'******************************************************************************* *************</span>
&nbsp;
&nbsp;
<span class="TOKEN">Public Sub</span> Create(<span class="TOKEN">ByVal</span> sMenuName <span class="TOKEN">As</span> String, _
<span class="TOKEN">Optional</span> <span class="TOKEN">ByVal</span> eMenuPos <span class="TOKEN">As</span> EMPosition = emKontext, _
<span class="TOKEN">Optional</span> <span class="TOKEN">ByVal</span> bMainmenu <span class="TOKEN">As</span> <span class="TOKEN">Boolean</span> = False, _
<span class="TOKEN">Optional</span> <span class="TOKEN">ByVal</span> bTemp <span class="TOKEN">As</span> <span class="TOKEN">Boolean</span> = <span class="TOKEN">True</span>)
<span class="REM">'* Datum : 29.01.2007</span>
<span class="REM">'* Autor : Dirk Staudenmaier</span>
<span class="REM">'* LastEdited : 29.01.2007</span>
<span class="REM">'* Zweck : Erzeugt das Menu</span>
<span class="REM">'******************************************************************************* *************</span>
<span class="TOKEN">On Error GoTo</span> Hell
msName = sMenuName: mePos = eMenuPos: mbMainMenu = bMainmenu: mbTemp = bTemp
<span class="TOKEN">If</span> ExistsMenu(msName) <span class="TOKEN">Then</span> CommandBars(msName).Delete
<span class="TOKEN">Set</span> moMenu = CommandBars.Add(msName, mePos, mbMainMenu, mbTemp)
<span class="TOKEN">Exit Sub</span>
Hell:
CatchError &quot;cEasyMenu.Create(sMenuName)&quot;, sMenuName, , , &quot;moMenu&quot;, moMenu
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span><hr><span class="REM">'******************************************************************************* *************</span>
&nbsp;
&nbsp;
<span class="TOKEN">Public Function</span> AddItem(<span class="TOKEN">ByVal</span> eCtlType <span class="TOKEN">As</span> EMCtlType, _
<span class="TOKEN">ByVal</span> sCaption <span class="TOKEN">As</span> String, _
<span class="TOKEN">Optional</span> <span class="TOKEN">ByVal</span> sAction <span class="TOKEN">As</span> <span class="TOKEN">String</span> = &quot;&quot;, _
<span class="TOKEN">Optional</span> <span class="TOKEN">ByVal</span> iFaceID <span class="TOKEN">As</span> <span class="TOKEN">Integer</span> = 1, _
<span class="TOKEN">Optional</span> <span class="TOKEN">ByVal</span> eBtnStyle <span class="TOKEN">As</span> EMBtnStyle = emAutomatic, _
<span class="TOKEN">Optional</span> <span class="TOKEN">ByVal</span> eCmbStyle <span class="TOKEN">As</span> EMCmbStyle = emNormal, _
<span class="TOKEN">Optional</span> <span class="TOKEN">ByVal</span> bGroup <span class="TOKEN">As</span> <span class="TOKEN">Boolean</span> = False, _
<span class="TOKEN">Optional</span> <span class="TOKEN">ByVal</span> bEnabled <span class="TOKEN">As</span> <span class="TOKEN">Boolean</span> = <span class="TOKEN">True</span>) <span class="TOKEN">As</span> CommandBarControl
<span class="REM">'* Datum : 29.01.2007</span>
<span class="REM">'* Autor : Dirk Staudenmaier</span>
<span class="REM">'* LastEdited : 31.01.2007</span>
<span class="REM">'* Zweck : F&uuml;gt einen Men&uuml;eintrag zum Menu hinzu</span>
<span class="REM">'******************************************************************************* *************</span>
<span class="TOKEN">On Error GoTo</span> Hell
<span class="TOKEN">Set</span> AddItem = moMenu.Controls.Add(eCtlType)
<span class="TOKEN">With</span> AddItem
.Caption = sCaption
.BeginGroup = bGroup
.Enabled = bEnabled
&nbsp;
Select Case TypeName(AddItem)
Case &quot;CommandBarButton&quot;
.OnAction = sAction
.Style = eBtnStyle
.FaceId = iFaceID
Case &quot;CommandBarComboBox&quot;
.Style = eCmbStyle
<span class="TOKEN">End</span> Select
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">With</span>
<span class="TOKEN">Exit Function</span>
Hell:
CatchError &quot;cEasyMenu.AddItem()&quot; <span class="REM">', , , , &quot;&quot;, Array()</span>
<span class="TOKEN">End</span> <span class="TOKEN">Function</span><hr><span class="REM">'******************************************************************************* *************</span>
&nbsp;
&nbsp;
<span class="TOKEN">Public Function</span> AddSubItem(<span class="TOKEN">ByRef</span> oPupItem <span class="TOKEN">As</span> CommandBarPopup, _
<span class="TOKEN">ByVal</span> eCtlType <span class="TOKEN">As</span> EMCtlType, _
<span class="TOKEN">ByVal</span> sCaption <span class="TOKEN">As</span> String, _
<span class="TOKEN">Optional</span> <span class="TOKEN">ByVal</span> sAction <span class="TOKEN">As</span> <span class="TOKEN">String</span> = &quot;&quot;, _
<span class="TOKEN">Optional</span> <span class="TOKEN">ByVal</span> iFaceID <span class="TOKEN">As</span> <span class="TOKEN">Integer</span> = 1, _
<span class="TOKEN">Optional</span> <span class="TOKEN">ByVal</span> eBtnStyle <span class="TOKEN">As</span> EMBtnStyle = emAutomatic, _
<span class="TOKEN">Optional</span> <span class="TOKEN">ByVal</span> eCmbStyle <span class="TOKEN">As</span> EMCmbStyle = emNormal, _
<span class="TOKEN">Optional</span> <span class="TOKEN">ByVal</span> bGroup <span class="TOKEN">As</span> <span class="TOKEN">Boolean</span> = False, _
<span class="TOKEN">Optional</span> <span class="TOKEN">ByVal</span> bEnabled <span class="TOKEN">As</span> <span class="TOKEN">Boolean</span> = <span class="TOKEN">True</span>) <span class="TOKEN">As</span> CommandBarControl
<span class="REM">'* Datum : 30.01.2007</span>
<span class="REM">'* Autor : Dirk Staudenmaier</span>
<span class="REM">'* LastEdited : 31.01.2007</span>
<span class="REM">'* Zweck : F&uuml;gt einen Untermen&uuml;eintrag zum Menu hinzu</span>
<span class="REM">'******************************************************************************* *************</span>
<span class="TOKEN">On Error GoTo</span> Hell
<span class="TOKEN">Set</span> AddSubItem = moMenu.Controls(oPupItem.Caption).Controls.Add(eCtlType)
<span class="TOKEN">With</span> AddSubItem
.Caption = sCaption
.BeginGroup = bGroup
.Enabled = bEnabled
Select Case TypeName(AddSubItem)
Case &quot;CommandBarButton&quot;
.OnAction = sAction
.Style = eBtnStyle
.FaceId = iFaceID
Case &quot;CommandBarComboBox&quot;
.Style = eCmbStyle
<span class="TOKEN">End</span> Select
<span class="TOKEN">End</span> <span class="TOKEN">With</span>
<span class="TOKEN">Exit Function</span>
Hell:
CatchError &quot;cEasyMenu.AddSubItem()&quot; <span class="REM">', , , , &quot;&quot;, Array()</span>
<span class="TOKEN">End</span> <span class="TOKEN">Function</span><hr><span class="REM">'******************************************************************************* *************</span>
&nbsp;
&nbsp;
<span class="TOKEN">Public Sub</span> Catch(<span class="TOKEN">ByVal</span> sPupName <span class="TOKEN">As</span> <span class="TOKEN">String</span>)
<span class="REM">'* Datum : 30.01.2007</span>
<span class="REM">'* Autor : Dirk Staudenmaier</span>
<span class="REM">'* LastEdited : 30.01.2007</span>
<span class="REM">'* Zweck : Weist dem Objekt ein bestehendes Menu zu</span>
<span class="REM">'******************************************************************************* *************</span>
<span class="TOKEN">Set</span> moMenu = CommandBars(sPupName)
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span><hr><span class="REM">'******************************************************************************* *************</span>
&nbsp;
&nbsp;
<span class="TOKEN">Public Sub</span> ItemEnabled(<span class="TOKEN">ByRef</span> sItemName <span class="TOKEN">As</span> String, _
<span class="TOKEN">ByVal</span> bEnabled <span class="TOKEN">As</span> <span class="TOKEN">Boolean</span>)
<span class="REM">'* Datum : 18.02.2007</span>
<span class="REM">'* Autor : Dirk Staudenmaier</span>
<span class="REM">'* LastEdited : 18.02.2007</span>
<span class="REM">'* Zweck : Aktiviert oder deaktiviert einen Men&uuml;punkt</span>
<span class="TOKEN">Dim</span> Ctl <span class="TOKEN">As</span> CommandBarControl
<span class="REM">'******************************************************************************* *************</span>
<span class="TOKEN">On Error GoTo</span> Hell
<span class="TOKEN">Set</span> Ctl = moMenu.Controls(sItemName)
Ctl.Enabled = bEnabled
<span class="TOKEN">Set</span> Ctl = <span class="TOKEN">Nothing</span>
<span class="TOKEN">Exit Sub</span>
Hell:
ErrRlsObjs Ctl
CatchError &quot;cEasyMenu.ItemEnabled(sItemName,bEnabled)&quot;, Array(sItemName, bEnabled)
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span><hr><span class="REM">'******************************************************************************* *************</span>
&nbsp;
&nbsp;
<span class="TOKEN">Public Sub</span> Show()
<span class="REM">'* Datum : 29.01.2007</span>
<span class="REM">'* Autor : Dirk Staudenmaier</span>
<span class="REM">'* LastEdited : 29.01.2007</span>
<span class="REM">'* Zweck : Zeigt das PopupMenu</span>
<span class="REM">'******************************************************************************* *************</span>
<span class="TOKEN">On Error GoTo</span> Hell
<span class="TOKEN">If</span> <span class="TOKEN">Not</span> moMenu <span class="TOKEN">Is</span> <span class="TOKEN">Nothing</span> <span class="TOKEN">Then</span>
<span class="TOKEN">If</span> mePos = emKontext <span class="TOKEN">Then</span>
moMenu.ShowPopup
<span class="TOKEN">Else</span>
moMenu.Visible = <span class="TOKEN">True</span>
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">Exit Sub</span>
Hell:
CatchError &quot;cEasyMenu.Show()&quot;, , , , &quot;moMenu&quot;, moMenu
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span><hr><span class="REM">'******************************************************************************* *************</span>
&nbsp;
&nbsp;
<span class="TOKEN">Public Function</span> ExistsMenu(<span class="TOKEN">ByVal</span> sPupName <span class="TOKEN">As</span> <span class="TOKEN">String</span>) <span class="TOKEN">As</span> <span class="TOKEN">Boolean</span>
<span class="REM">'* Datum : 29.01.2007</span>
<span class="REM">'* Autor : Dirk Staudenmaier</span>
<span class="REM">'* LastEdited : 29.01.2007</span>
<span class="REM">'* Zweck : pr&uuml;ft Vorhandensein von PopupMenu</span>
<span class="TOKEN">Dim</span> oP <span class="TOKEN">As</span> CommandBar
<span class="REM">'******************************************************************************* *************</span>
<span class="TOKEN">On Error GoTo</span> Hell
ExistsMenu = <span class="TOKEN">False</span>
<span class="TOKEN">For</span> <span class="TOKEN">Each</span> oP <span class="TOKEN">In</span> CommandBars
<span class="TOKEN">If</span> oP.Name = sPupName <span class="TOKEN">Then</span>
ExistsMenu = <span class="TOKEN">True</span>
<span class="TOKEN">Exit For</span>
<span class="TOKEN">End</span> <span class="TOKEN">If</span> <span class="REM">'oP.Name = sPupName</span>
<span class="TOKEN">Next</span> <span class="REM">'oP</span>
<span class="TOKEN">Exit Function</span>
Hell:
CatchError &quot;cEasyMenu.ExistsMenu(sPupName)&quot;, sPupName, , , &quot;ExistsPopup&quot;, ExistsMenu
<span class="TOKEN">End</span> <span class="TOKEN">Function</span><hr><span class="REM">'******************************************************************************* *************</span>
&nbsp;
&nbsp;</pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

Neue Methode ItemEnabled:
Aktiviert oder deaktiviert zur Laufzeit einen Menüpunkt. Parameter:
sItemName As String: Die Caption des Menüpunktes
bEnabled As Boolean: True für aktiviert, False für deaktiviert.

Kontextmenüs dürften weiterhin ohne Änderung funtionieren. Um statt einem Kontextmenü eine Symbolleiste zu erzeugen, muss nur die Create-Methode mit einem anderen Parameter aufgerufen werden, alles andere funktioniert analog. (Die Methode AddSubItem wird bei einer Symbolleiste natürlich nicht benötigt, aber die Klasse soll ja irgendwann für alle Menüarten verwendbar sein.) Beispielprozedur, die eine Symbolleiste erzeugt (einfach meiner aktuellen DB entnommen):

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Public Sub</span> CreateSybMain()
<span class="REM">'* Datum : 11.02.2007</span>
<span class="REM">'* Autor : Dirk Staudenmaier</span>
<span class="REM">'* LastEdited : 11.02.2007</span>
<span class="REM">'* Zweck : Erzeugt die Haupt-Symbolleiste</span>
<span class="TOKEN">Dim</span> oEM <span class="TOKEN">As</span> cEasyMenu
<span class="REM">'******************************************************************************* *************</span>
<span class="TOKEN">On Error GoTo</span> Hell
<span class="TOKEN">Set</span> oEM = <span class="TOKEN">New</span> cEasyMenu
<span class="TOKEN">With</span> oEM
<span class="REM">' If Not .ExistsMenu(&quot;TaskSymb&quot;) Then</span>
.Create &quot;TaskSymb&quot;, emTop
.AddItem emButton, &quot;R&uuml;ckg&auml;ngig&quot;, &quot;SybUndo&quot;, 128, emIcon, , , <span class="TOKEN">False</span>
.AddItem emButton, &quot;Wiederholen&quot;, &quot;SybRedo&quot;, 129, emIcon, , , <span class="TOKEN">False</span>
.AddItem emButton, &quot;Vorgangs&uuml;bersicht schlie&szlig;en&quot;, &quot;CloseMainForm&quot;, 330, emIcon, , <span class="TOKEN">True</span>
<span class="REM">' Else</span>
<span class="REM">' .Catch &quot;TaskSymb&quot;</span>
<span class="REM">' End If 'Not .ExistsMenu(&quot;TaskSymb&quot;)</span>
.Show
<span class="TOKEN">End</span> <span class="TOKEN">With</span> <span class="REM">'oEM</span>
<span class="TOKEN">Set</span> oEM = <span class="TOKEN">Nothing</span>
<span class="TOKEN">Exit Sub</span>
Hell:
ErrRlsObjs oEM
CatchError &quot;mMenus.CreateSybMain()&quot;
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span><hr>&nbsp;</pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

Zur Verwendung der neuen Methode ItemEnabled ebenfalls ein Beispiel (aktiviert oder deaktiviert bei mir die beiden Symbolleistenschalter Undo und Redo):

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Public Sub</span> MenuEnableUndoRedo(<span class="TOKEN">ByVal</span> eItem <span class="TOKEN">As</span> MenuUndoRedo, _
<span class="TOKEN">ByVal</span> bEnabled <span class="TOKEN">As</span> <span class="TOKEN">Boolean</span>)
<span class="REM">'* Datum : 18.02.2007</span>
<span class="REM">'* Autor : Dirk Staudenmaier</span>
<span class="REM">'* LastEdited : 18.02.2007</span>
<span class="REM">'* Zweck : aktiviert oder deaktiviert die Men&uuml;punkte Undo/Redo</span>
<span class="TOKEN">Dim</span> oEM <span class="TOKEN">As</span> cEasyMenu, s <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="REM">'******************************************************************************* *************</span>
<span class="TOKEN">On Error GoTo</span> Hell
<span class="TOKEN">Set</span> oEM = <span class="TOKEN">New</span> cEasyMenu
<span class="TOKEN">With</span> oEM
.Catch &quot;TaskSymb&quot;
<span class="TOKEN">If</span> eItem = MenuUndo <span class="TOKEN">Then</span> s = &quot;R&uuml;ckg&auml;ngig&quot; <span class="TOKEN">Else</span> s = &quot;Wiederholen&quot;
.ItemEnabled s, bEnabled
<span class="TOKEN">End</span> <span class="TOKEN">With</span>
<span class="TOKEN">Set</span> oEM = <span class="TOKEN">Nothing</span>
<span class="TOKEN">Exit Sub</span>
Hell:
<span class="REM"> 'ErrRlsObjs</span>
CatchError &quot;mMenus.MenuEnableUndoRedo(eItem,bEnabled)&quot;, Array(eItem, bEnabled), , , &quot;&quot;, Array()
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span><hr>&nbsp;</pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

Achtung: Die Fehlerbehandlungsroutinen in dem Code der Klasse müsst ihr natürlich gegen eure eigenen austauschen.

bubaonline
03.03.2007, 16:58
Hallo Struppi73,

erstelle ich mehr als ein Kontextmenü, erscheinen beim Versuch, das zweite zu öffnen nur Fehlermeldungen (Err 5 und 91).
Weist du warum? (Demo im Anhang)

Gruß
Buba

P.S. Habe Access 2003, Windops XP home SP2 alle Updates

Struppi73
06.03.2007, 11:15
Ja, ich weiß warum. In der Methode "ExistsPopup" war ein Fehler. Ist zwischenzeitlich ausgemerzt (siehe letzten Beitrag von mir). Nachstehend die berichtigte Funktion, damit funktioniert´s. Vielen Dank für deinen Hinweis!

Public Function ExistsPopup(ByVal sPupName As String) As Boolean
'* Datum : 29.01.2007
'* Autor : Dirk Staudenmaier
'* LastEdited : 06.03.2007
'* Zweck : prüft Vorhandensein von PopupMenu
Dim oP As CommandBar
'******************************************************************************* *************
On Error GoTo Hell
ExistsPopup = False
For Each oP In CommandBars
If oP.Name = sPupName Then
ExistsPopup = True
Exit For
End If
Next 'oP
Exit Function
Hell:
MsgBox "Err: " & Err & " (" & Err.Description & ")" & vbLf & _
"in cPopupMenu.ExistsPopup"
End Function
'******************************************************************************* *************

cpac
08.03.2007, 16:23
Kannst Du hier eine aktualisierte Demo-Datenbank reinstellen? Sieht bisher recht interessant aus.

Struppi73
09.03.2007, 13:19
Komme zur Zeit leider nicht dazu, eine aktualisierte Demo zu erstellen. Wird aber baldmöglichst nachgeholt!

bubaonline
12.03.2007, 09:10
Hallo Struppi73,

habe den Code geändert, jetzt funktioniert es! :)

Danke
Buba

Ja, ich weiß warum. In der Methode "ExistsPopup" war ein Fehler. Ist zwischenzeitlich ausgemerzt (siehe letzten Beitrag von mir). (...)

B&G
14.03.2007, 10:08
Hi ,
hir ist die finale version. Habe es getestet und es funktioniert recht gut .

27030

B&G
14.03.2007, 14:09
Hi,

ich braechte die liste mit numern der Icons welche man fur den PopUp benutzen kann , und wie kann man ein eigenes icon verwenden.

danke

cpac
14.03.2007, 16:17
Evtl. hilft Dir der FaceID-Browser (http://skp.mvps.org/faceid.htm) weiter.

B&G
15.03.2007, 08:07
danke ,
das Hilft gut weiter ...

Struppi73
15.03.2007, 10:59
...wie in Beitrag #1 erwähnt.. ;)

cpac
15.03.2007, 13:46
...wie in Beitrag #1 erwähnt.. ;)

Beitrag #1 ist sooooo weit oben..... :watch:

Struppi73
16.03.2007, 11:41
Klar, kein Thema! Es schadet nichts, es nochmal zu erwähnen, zumal es sich um ein echt nützliches und komfortables Tool für diesen Zweck handelt.

Ich hoffe, ich finde bald Zeit, die Beispieldemo mal auf den neuesten Stand zu bringen.

desoya
12.04.2007, 17:04
Hallo Dirk,

vielen Dank für deine Mühe, deine Popup-Klassen funktionieren spitze. Für den der es braucht, habe ich mir erlaubt eine optionale Parameterübergabe zu integrieren:


Public Function AddItem(ByVal eCtlType As EMCtlType, _
ByVal sCaption As String, _
Optional ByVal sAction As String = "", _
Optional ByVal iFaceID As Integer = 1, _
Optional ByVal eBtnStyle As EMBtnStyle = emAutomatic, _
Optional ByVal eCmbStyle As EMCmbStyle = emNormal, _
Optional ByVal bGroup As Boolean = False, _
Optional ByVal bEnabled As Boolean = True, _
Optional ByVal sParams As String) As CommandBarControl
'* Datum : 29.01.2007
'* Autor : Dirk Staudenmaier
'* LastEdited : 31.01.2007
'* Zweck : Fügt einen Menüeintrag zum Menu hinzu
'* Modifiziert : Optionale Parameterübergabe 12.04.2007
'******************************************************************************* *************
On Error GoTo Hell
Set AddItem = moMenu.Controls.Add(eCtlType)
With AddItem
.Caption = sCaption
.BeginGroup = bGroup
.Enabled = bEnabled

Select Case TypeName(AddItem)
Case "CommandBarButton"
.Parameter = sParams
.OnAction = sAction
.Style = eBtnStyle
.FaceId = iFaceID
Case "CommandBarComboBox"
.Style = eCmbStyle
End Select

End With
Exit Function
Hell:
CatchError "cEasyMenu.AddItem()" ', , , , "", Array()
End Function '******************************************************************************* *************

So übergebe ich dir Parameter (eine einfache Komma getrennte Liste):

cEasyMenu.AddItem emButton, "MyButton", "initMyFunction", , , , , False, params

Und so liest man die Parameter in der aufgerufenen Function wieder auf:

Function initMyFunction()
Dim params() As String
'parse parameter string
params = Split(CommandBars.ActionControl.Parameter, ",")
myFunctionWithParams params(1), params(2), params(3)
End Function


Das bestimmt noch ein bisschen smarter, aber so funktionierts schon mal.

Gruß
Bernd

benne36
24.04.2007, 11:34
Ich bin gerade dabei, die Datei zu laden.
Als neu angemeldeter Benutzer habe ich aber noch irgendwie keine Rechte dazu.

Linus1971
24.04.2007, 13:30
Hallo Benne36

Willkommen im Forum. Du hast noch eine EMail-Bestätigung in deinem Mail-Postfach, welches du bei der Anmeldung angegeben hast. Schau doch mal danach. Da ist ein Link drin der noch angeklickt werden muss.

benne36
27.04.2007, 15:39
Hallo im Forum,

auf der Suche nach den Grundlagen über Popup Menüs bin ich auf diesen Beitrag gestoßen.
Ich war schon zur Hälfte dabei, mit eine eigene Toolbox zu basteln.

Für Menüs, die man mal schnell so braucht, habe ich aber eine andere Variante gewählt.

In der Eigenschaft "onAction" steht bei mir immer die selbe Funktion, die dann nur die Caption des gewählten Menüs zurückgibt.
Diese werte ich dann aus und erreiche somit den folgenden Ablauf :

Mouse_up ...

call Define_item(1,"Caption .... usw.
call define_item(2,"Capition 2 ...

select case UseMenu(2)
case 1:
Befehlskette

case 2 :
Befehlskette
end select


Der Vorteil ist, dass ich das aufrufende Modul nicht verlassen muss und somit auch auf interne Daten zugreifen kann.

Beim Define werden nur minimalste Zeilen geschrieben, es wird auch immer die selbe Commandbar erzeugt und danach wieder gelöscht.

Ich finde diese Anordnung recht übersichtlich.

wen es interessiert, soll sich melden.

Grüße aus dem Donautal

benne

benne36
27.04.2007, 15:40
Meine Schuld !

... wer lesen kann, ist oft deutlich im Vorteil .

Die Anmeldebestätigung ging auf einen anderen Mail Account, den ich nicht abgerufen habe.

Beim nächsten mal wird alles besser ...

Gruß

Benne

claferberg
11.08.2007, 09:54
Vielen Dank.
Ich bitte um Verzeihung, aber die deutsche ist meine Muttersprache nicht.
Ich habe ein Problem mit Commandbars: zum Beispiel, ich habe zwei Forms, dessen ihre eigene Commandbars mit Code erstellung sind.
Wenn ich von Forms1 zu Forms2 (und umgekehrt) gehen will, wie kann ich die commandbar aktivieren und deaktivieren (und löschen)?
Vielen Dank.

Claudio

Peter2100
23.05.2014, 07:39
Hallo zusammen !

Kann man auch noch weitere Ebenen einfügen ? Wie muß man hierfür den Code abwandeln ?

Gruß Peter

AnnaM
24.08.2014, 19:59
Hallo B & D,

ich verwende deine PopupMenu Klasse und sie funktioniert bestens in meiner Anwendung. Ich würde allerdings gerne eigene Icons für die Buttons verwenden.

Ich bräuchte dabei aber etwas Hilfe oder einen Tipp wie man das realisieren könnte.

LG
Anna