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

Makro oder Rückruffunktion "GetEnabled" kann nicht ausgeführt werd

106 views
Skip to first unread message

UserOG

unread,
Dec 23, 2007, 12:57:00 PM12/23/07
to
Hallo, ich bekomme bei der Callbackfunktion "cbGetEnabled" immer die
Fehlermeldung (Makro Funktion nicht vorhanden bzw. Parameter falsch) bzw. das
Ribbon wird nicht entsprechend aktualisiert. Nach einer verzweifelten Suche
nach dem Fehler habe ich den noch nicht gefunden! M. E. müsste alles stimmen.
Das ribbon liegt als xml vor und ist in der tb gespeichert. Anbei der xml
Code (Auszug) sowie die Callbacks (die btn Edit etc. sollen je nach
Benutzerrechte aktiviert oder deaktiviert werden).

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"
onLoad="OnRibbonLoad">
<ribbon startFromScratch="true">
...
<group id="grpLock_Unlock" label="Lock - Unlock">
<button id="btnLock" size="large" label="Lock" imageMso="GroupProtect"
onAction="cmdOnActionButton" getEnabled="cbGetEnabled"/>
<button id="btnEdit" size="large" label="Edit"
imageMso="ReviewAcceptChange" onAction="cmdOnActionButton"
getEnabled="cbGetEnabled"/>
<button id="btnDelete" size="large" label="Delete"
imageMso="ReviewRejectChange" onAction="cmdOnActionButton"
getEnabled="cbGetEnabled"/>
</group>
...

Public Sub cbGetEnabled(ctl As IRibbonControl, ByRef enabled)
enabled = bolEnabled
End Sub

Public Sub cbGetEnabledSet(RibbonCtrlID As String, pressed As Boolean)
bolEnabled = pressed
gobjRibbon.InvalidateControl RibbonCtrlID
End Sub

Public Sub OnRibbonLoad(ribbon As IRibbonUI)
Set gobjRibbon = ribbon
End Sub

Wenn ich die Funktion cbGetEnabledSet aufrufe (um den Status zu ändern),
kommt die Fehlermeldung. Interessant ist, wenn ich im Direktfenster den Code
eingeben ... InvalidateControl "btnEdit" dann klappts. Wo kann ich da noch
suchen?

Besten Dank im voraus für Eure Hilfe! Karl-Heinz

Gunter Avenius

unread,
Dec 23, 2007, 1:11:53 PM12/23/07
to
Hallo UserOG,

UserOG schrieb folgendes:


> Wenn ich die Funktion cbGetEnabledSet aufrufe (um den Status zu
> ändern), kommt die Fehlermeldung. Interessant ist, wenn ich im
> Direktfenster den Code eingeben ... InvalidateControl "btnEdit"
> dann klappts. Wo kann ich da noch suchen?

Kann ich nicht nachvollziehen. Es funktioniert Beiedes bei mir:

gobjRibbon.InvalidateControl RibbonCtrlID
gobjRibbon.InvalidateControl "btnEdit"

An welcher Stelle ruft Du "cbGetEnabledSet " auf?

Gruß
Gunter
--
__________________________________________________________
Access FAQ: http://www.donkarl.com
home: http://www.avenius.com - http://www.AccessRibbon.de

UserOG

unread,
Dec 23, 2007, 1:30:02 PM12/23/07
to
Hallo Gunter,

ich rufe von einem Formular aus eine Funktion auf, die sich in einem Modul
befindet . Im folgenden ein Auszug:

Do
If rsMenu!Active = True Then
'Call cbGetEnabledSet(rsMenu!RibbonCtrlID, True)
bolEnabled = True
gobjRibbon.InvalidateControl rsMenu!RibbonCtrlID
Else
'Call cbGetEnabledSet(rsMenu!RibbonCtrlID, False)
bolEnabled = False
gobjRibbon.InvalidateControl rsMenu!RibbonCtrlID
End If
rsMenu.MoveNext

Die callback ist in einem gesondertem Modul - aber alle als public
definiert. Wie Du siehst, habe ich probiert (s.o.) die sub aufzurufen bzw.
den Code direkt in die Funktion zu schreiben.

Ich finde das etwas mysteriös, kann aber nicht daran liegen, dass ich mit
Front End und Back End arbeite und einige Datentabellen und Forms aus einer
alten db übernommen habe? Wäre unlogisch, aber ... Alle Verweise sind
gesetzt.

Gruß
Karl-Heinz

Gunter Avenius

unread,
Dec 23, 2007, 1:40:19 PM12/23/07
to
Hallo UserOG,

UserOG schrieb folgendes:

> ich rufe von einem Formular aus eine Funktion auf, die sich in einem Modul

> befindet . Im folgenden ein Auszug:
>
> Do
> If rsMenu!Active = True Then
> 'Call cbGetEnabledSet(rsMenu!RibbonCtrlID, True)
> bolEnabled = True
> gobjRibbon.InvalidateControl rsMenu!RibbonCtrlID
> Else
> 'Call cbGetEnabledSet(rsMenu!RibbonCtrlID, False)
> bolEnabled = False
> gobjRibbon.InvalidateControl rsMenu!RibbonCtrlID
> End If
> rsMenu.MoveNext
>
> Die callback ist in einem gesondertem Modul - aber alle als public
> definiert. Wie Du siehst, habe ich probiert (s.o.) die sub aufzurufen bzw.
> den Code direkt in die Funktion zu schreiben.
>
> Ich finde das etwas mysteriös, kann aber nicht daran liegen, dass ich mit
> Front End und Back End arbeite und einige Datentabellen und Forms aus einer
> alten db übernommen habe? Wäre unlogisch, aber ... Alle Verweise sind
> gesetzt.

und "rsMenu!RibbonCtrlID" liefert Dir das richtige Ribbon Control?

Wenn Du viele Controls im Ribbon dynamisch auf einmal ändern möchtest
kannst Du auch das komplette Ribbon neu zeichnen lassen:

gobjRibbon.Invalidate

Sascha Trowitzsch

unread,
Dec 23, 2007, 1:40:35 PM12/23/07
to
Hi Karlheinz UserOG,

Ich heiße zwar nicht Gunter....

Bist du dir sicher, dass du nur *einen* Ribbon definiert hast?
Falls ein anderer etwa einem Formular zugewiesen wurde und die OnLoad-Callback
aufruft, dann wird gobjRibbon überschrieben und hat quasi eine andere
RibbonControls-Auflistung.
Wenn mehrere Ribbons, dann brauch man auch mehrere globale IRibbonUI-Variablen
bzw. Collections davon.
Ist nur so ne Vermutung...

Ciao, Sascha

"UserOG" <Use...@domain.com> schrieb im Newsbeitrag
news:C2408B6B-FFAA-4CC0...@microsoft.com...

UserOG

unread,
Dec 23, 2007, 2:01:01 PM12/23/07
to
Ja, dieser recordset rsMenu!RibbonCtrlID baue ich anhand einer Tabelle im
BackEnd auf. Dieses rs enthält quasi alle buttons. M. E. muss ich die alle
individuell aktualisieren, da ggf. je btn diese einzeln aktivieren/
deaktivieren möchte (in Abhängigkeit vom Benutzerprofil). Oder geht das als
batch auch anders?

Auch wenn ich - nach initialisierung - einzelne btn ändern möchte, geht das
auf die Bretter. Hier der Code:

Public Sub RibbonModNotActive()
On Error Resume Next
Call cbGetEnabledSet("btnLock", False)
Call cbGetEnabledSet("btnEdit", False)
Call cbGetEnabledSet("btnDelete", False)
End Sub

Hier sollen die btn deaktiviert werden. Dazu wir die Funktion
cbGetEnabledSet aufgerufen - und dann geht das wieder auf die Bretter!!

Ideen? Grüße Karl-Heinz

UserOG

unread,
Dec 23, 2007, 2:20:00 PM12/23/07
to
Hi Sascha,

ich habe keine Idee, wie mehrere ribbons definiert haben soll? Klar in der
tb UISys sind zwei Datensätze vorhanden, aber über das Access Menü weise ich
nur ein ribbon zu. Und ich habe keine Funktion, dass ich bspw.
Formularabhängig den 2. "Datensatz" aktivieren würde.

Grüße Sascha

Gunter Avenius

unread,
Dec 23, 2007, 2:24:15 PM12/23/07
to
Hallo UserOG,

UserOG schrieb folgendes:


> ich habe keine Idee, wie mehrere ribbons definiert haben soll? Klar in der
> tb UISys sind zwei Datensätze vorhanden, aber über das Access Menü weise ich
> nur ein ribbon zu. Und ich habe keine Funktion, dass ich bspw.
> Formularabhängig den 2. "Datensatz" aktivieren würde.

Hast Du in beiden Ribbon XMls ein ...onLoad="OnRibbonLoad drin?

UserOG

unread,
Dec 23, 2007, 2:37:01 PM12/23/07
to
Hallo, ja, ich hatte in beiden ein OnLoad (war Backup alter xml code). Habe
den EinHalt aber gelöscht, die db geschlossen und neu gestartet. Problem das
gleiche.

Grüße
Karl-Heinz

Sascha Trowitzsch

unread,
Dec 23, 2007, 2:57:29 PM12/23/07
to
Hi Karlheinz,

Und wenn du :
rsMenu!RibbonCtrlID.Value
schreibst?

rsMenu!RibbonCtrlID ist schließlich ein Field-Objekt, kein String.

Ciao, Sascha

"UserOG" <Use...@domain.com> schrieb im Newsbeitrag

news:BC6A2DD9-D6DB-442F...@microsoft.com...

UserOG

unread,
Dec 23, 2007, 3:08:01 PM12/23/07
to
Hi Sascha,

bei folgendem Auruf tritt das Problem auch auch:

Public Sub RibbonModNotActive()
On Error Resume Next
Call cbGetEnabledSet("btnLock", False)
Call cbGetEnabledSet("btnEdit", False)
Call cbGetEnabledSet("btnDelete", False)
End Sub

und da übergebe ich explizit den String. Alles scheint o.k. - könnte es
sein, dass Access beim komprimieren der db irgendwas zerschießt? Nach dem
Import von tb und frms aus einer alten db war die immerhin 45MB groß und nach
dem komprimieren sind es 3.6 MB

Gruß Karl-Heinz

UserOG

unread,
Dec 29, 2007, 4:07:00 AM12/29/07
to
... viele Dank den Userbeiträgen. Das Problem lag u.a. daran, dass in der
Callback Funktion ein Wert immer auf True gesetzt war. Die Lösung des
Problems lautet:

Public Sub GetEnabled(control As IRibbonControl, ByRef enabled)
Select Case control.Id
'Case "tglBtnInfo"
' enabled = False
Case Else
'enabled = True
' Ändern in:
enabled = bolEnabled
End Select
End Sub

Besten Dank an Gunter Avenius.

Gruß
Karl-Heinz

0 new messages