Seite 1 von 1

Menü deaktivieren

Verfasst: Di, 12.01.2010 15:36
von Tictac
Hallo alle zusammen

Ich bin neu auf dem Gebiet Macroprogrammierung. Leider komme ich aus beruflichen Gründen nun nicht darum.
Ein paar Kleinigkeiten habe ich bereits hinbekommen.

Nun stehe ich vor einem Problem.

Es geht um ein Spreadsheat mit mehreren Arbeitsblättern (Zum Beispiel "A" und "B")
Nun will ich das Arbeitsblatt "B" ausblenden. Dies geht ja noch relativ einfach.
Dafür habe ich sogar ein kleines Macro erstellt ("Es lebe die Macro aufzeichnung")
Nun will ich allerdings verhindern dass man diese Versteckte Tabelle über
Menüleiste-->Format-->Tabelle-->Einblenden
Arbeitsblatt B wieder einblenden kann.

Im Klartext, suche ich nach einem Weg die Funktion "Einblenden" zu deaktivieren.
Dies müsste denke ich mit einem Macro machbar sein allerdings sind meine Macrokenntnisse relativ miserabel.
Wenn jemand eine bessere Idee hat und ich somit um macros rumkomme bin ich dafür gerne offen.

Vielleicht kann mir jemand helfen.

Zum Abschluss noch ein kleines Java Beispiel zur verdeutlichung nach was ich suche.
Angenommen das Menüfeld heißt "MenueFeldABC"

Dann wäre der Java Befehl für das was ich machen will

MenueFeldABC.setEnabled(false);

Re: Menü deaktivieren

Verfasst: Di, 12.01.2010 19:04
von DPunch
Wie das direkte Abfangen von Menubefehlen funktioniert, ist in Andrew Pitonyaks Makro-Dokument zu finden:
http://www.pitonyak.org/AndrewMacro.odt
( 4.4. Intercept menu commands using Basic)

Ansonsten kannst Du das Ganze auch per PropertyChangeListener regeln, indem Du einfach die Tabelle direkt wieder ausblendest, sobald sie jemand eingeblenden will:

Code: Alles auswählen

Option Explicit

Global propsObject as Object
Global oListener as Object

Const sProperty as String = "IsVisible"
'**********************************************
Const sTableToStayHidden as String = "Tabelle2"  'Hier muss Dein Tabellenname stehen
'**********************************************
Sub StartMyPropertyListener
	Dim sListenerName as string, sProperty as string
	sListenerName = "com.sun.star.beans.XPropertyChangeListener"
	
	If IsNull(propsObject) Then
		oListener = CreateUnoListener( "myChangeListener_", sListenerName )
		propsObject = ThisComponent.CurrentController
		propsObject.addPropertyChangeListener(sProperty, oListener)
	End If
End Sub

Sub StopMyPropertyListener
	If NOT IsNull(propsObject) Then
		propsObject.removePropertyChangeListener(sProperty,oListener)
		propsObject = Nothing
		oListener = Nothing
	End If
End Sub

Sub myChangeListener_disposing(oEvt As Object)
	propsObject = Nothing
	oListener = Nothing
End Sub

Sub myChangeListener_propertyChange(oEvt As Object)
	Dim oSheet as Object
	oSheet = oEvt.Source.ActiveSheet
	If oSheet.Name = sTableToStayHidden Then
		If oSheet.isVisible Then
			thisComponent.Sheets.getByName(sTableToStayHidden).isVisible = False
		End If
	End If
End Sub
sTableToStayHidden muss in Deinem Fall natürlich nicht "Tabelle2" sein, sondern entsprechend "B" (oder wie auch immer das Tabellenblatt heisst)
Bei >>Extras -> Anpassen -> Ereignisse -> Dokument öffnen<< die Prozedur "StartMyPropertyListener" zuweisen
Bei >>Extras -> Anpassen -> Ereignisse -> Dokument wird geschlossen<< die Prozedur "StopMyPropertyListener" zuweisen

Willst Du zwischenzeitlich selber an dem Tabellenblatt arbeiten, musst Du die sozusagen-Sperre manuell entfernen (>>Makro ausführen -> "StartMyPropertyListener"<<).

Re: Menü deaktivieren

Verfasst: Mi, 13.01.2010 13:23
von Tictac
Hallo DPunch

Erst einmal Danke für deine Antwort.
Irgendwie bekomme ich den Teil von Andrew Pitonyak nicht zum laufen. Ist aber auch egal, da ich ja nicht die Auswirkung abfangen will, sondern lediglich das Menü deaktivieren.

Deine Lösung bringt mich leider auch nicht weiter, da ich diese relativ leicht umgehen kann, wenn ich einfach makros deaktiviere.

Also habe ich weiter gesucht und gesucht, da ich überzeugt war, es muss einen einfacheren Weg geben. In der OpenOfficeApi bin ich dann schließlich fündig geworden.
Dort ist unter com.sun.star.awt.xMenu eine Funktion "enableItem" gestolpert. http://api.openoffice.org/docs/common/r ... enableItem

Diese müsste eigentlich genau das bewirken was ich will, wenn ich ihr als MenuItem die richtige ID übergebe. Eine ID liste habe ich hier gefunden http://framework.openoffice.org/files/d ... 1beta.html

Jetzt kommen wir zu meinem Problem. Ich bekomme das irgendwie nicht zum laufen, da ich wie gesagt bisher nie mit Makros arbeiten musste.
Ich habe mir ein funktionierendes aufgezeichnetes Makro gezogen und dieses verändert.

Hier ist mein Code

Code: Alles auswählen

sub Test1

rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim oXMenu as object

rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
oXMenu = createUnoService("com.sun.star.awt.xMenu")
oXMenu.enableItem(5301, false)

rem ----------------------------------------------------------------------

end sub
Vielleicht kann mir jemand hier helfen und mir sagen, was ich falsch mache. Für die Zeile oXMenu.enableItem(...) erhalte ich immer die Fehlermeldung Objektvariable nicht belegt.
Was genau heißt das eigentlich?

Re: Menü deaktivieren

Verfasst: Mi, 13.01.2010 15:17
von DPunch
Aloha

Wie das ganze mit deaktivierten Makros funktioneren soll, da habe ich ehrlich gesagt keine Ahnung.
Für die Zeile oXMenu.enableItem(...) erhalte ich immer die Fehlermeldung Objektvariable nicht belegt.
Was genau heißt das eigentlich?
Das heisst, dass die Variable oXMenu nicht belegt (Null) ist.
Könnte daran liegen, dass "com.sun.star.awt.xMenu" ein Interface ist, kein Service.

Re: Menü deaktivieren

Verfasst: Mo, 18.01.2010 09:45
von Tictac
Hallo,

Hab mittlerweile einen relativ einfachen Weg gefunden, wie ich das erreichen kann was ich will.
Sobald ich das gesammte "Workbook" speere ist alles so wie ich es will.

Das geht relativ einfach über ein Makro.

Code: Alles auswählen

Sub sperren (passwort as String)
ThisComponent.protect(passwort)
End Sub
Trotzdem vielen Dank nocheinmal für die Mühen und die Hilfe