🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Bug in libreoffice 4.1.3? (Problem umgangen)

Alles zur Programmierung im LibreOffice.
Antworten
Koto
Beiträge: 19
Registriert: Do 30. Aug 2012, 17:05

Bug in libreoffice 4.1.3? (Problem umgangen)

Beitrag von Koto » So 29. Dez 2013, 18:40

Hallo,
bis zu libreoffice 3 funktioniere folgendes Makro:

Code: Alles auswählen

SUB Texyl_switchMenuitem (BYVAL MenuName AS STRING, _
						   BYVAL Itemname AS STRING, _
						   Enable AS BOOLEAN) _
						   AS BOOLEAN
	DIM DocFrame AS VARIANT
	DIM MenuRes AS VARIANT
	DIM LayoutManager AS VARIANT
	DIM Menubar AS VARIANT
	DIM Popup AS VARIANT
	DIM MItemId AS INTEGER
	DIM ItemId AS INTEGER
	DIM iString AS STRING
	DIM i AS INTEGER
	DIM IsHere AS BOOLEAN
	
	IsHere = FALSE
	
	REM Erstmal den Frame vom Controller holen
	DocFrame = ThisComponent.getCurrentController().getFrame()
	REM Davon den Layoutmanager
	LayoutManager = DocFrame.LayoutManager()

	REM Jetzt das Element Menubar holen
	MenuRes = LayoutManager.getElement ("private:resource/menubar/menubar")
	MenuBar = MenuRes.XMenuBar
	
	
	REM Nun den Menüpunkt finden
	FOR i = 0 TO MenuBar.getItemCount ()
		MItemId = MenuBar.getItemId (i)
		iString = MenuBar.getItemText (MItemId)
				
		IF iString = MenuName THEN
			IsHere = TRUE
			EXIT FOR
		END IF
	NEXT
	
	IF IsHere THEN
		Popup = MenuBar.getPopupMenu (MItemId)
		
		IsHere = FALSE
							
		REM Endlich die einzelnen Items durchsuchen
		FOR i = 0 TO Popup.getItemCount()
			ItemId = Popup.getItemId (i)
			iString = Popup.getItemText (ItemId)
			
			IF strComp (iString, Itemname, 1) = 0 THEN
				IsHere = TRUE
				EXIT FOR
			END IF
		NEXT
	
		REM und umschalten
		IF IsHere THEN
			Popup.enableItem (ItemId, Enable)
		ELSE
			msgbox "Menüeintrag nicht gefunden"
		END IF
	ELSE
		msgbox "Menü nicht gefunden"
	END IF
END SUB
Nach dem Update auf libreoffice 4.1.3 kollabiert das Programm nach dem zweiten Aufruf der Methode. Der erste Aufruf der Methode erfolgt fehlerfrei. Beim Zweitenmale schaltet libreoffice ab. Schon das Anklicken der Variablen im Inspector der Entwicklungsumgebung führt zum Absturz.

Ich habe den Fehler "nach hinten" verschieben können, indem ich die Variablen Menubar und Popup GLOBAL deklariere und sie nur einmal erzeuge. Beim Schließen des Dokumentes resp. libreoffice ist nichts zu bemerken. Doch muss ich beim Laden des Dokumentes "wiederherstellen". Alle Versuche den Fehler zu finden, schlagen auch nach 3 Tagen fehl.

Da das Makro unter libreoffice 3 funktionierte, sehe ich zwei Möglichkeiten:
1. Es gibt einen Bug
2. Es hat sich was geändert. Aber was? Ich kann ändern, was ich will: Der Fehler bleibt - ohne Meldung!

Habe an den Properties der Eintrage getüfftelt und herausgefunden, dass es eine mit Namen "Enabled" geben kann.
Den Wert kann man auf TRUE oder FALSE setzen:

Code: Alles auswählen

OPTION EXPLICIT

PRIVATE CONST MENURESOURCE = "private:resource/menubar/menubar"

SUB test()
REM Ein Eintrag muß mit Extra->Anpassen in der Menüleiste
REM erzeugt werden.
REM Das Popup befindet sich am Index 9 der Menubar (letzter Eintrag?)
REM Es hat min. 2 Einträge
	setItemEnabled (9, 1, TRUE)
END SUB

SUB setItemEnabled (BYVAL PopupIx AS INTEGER, _
					BYVAL ItemIx AS INTEGER, _
					BYVAL Enable AS BOOLEAN)_
	DIM DocCfgMng AS OBJECT
	DIM Settings AS OBJECT
	DIM ItemContainer AS OBJECT
	DIM Item() AS OBJECT
	DIM Prop AS NEW com.sun.star.beans.PropertyValue
	DIM i AS INTEGER
	DIM Exist AS BOOLEAN
	
	DocCfgMng = ThisComponent.getUIConfigurationManager ()
	IF DocCfgMng.hasSettings (MENURESOURCE) THEN
		Settings = DocCfgMng.getSettings (MENURESOURCE, TRUE)
	
		ItemContainer = getItemContainer (PopupIx, Settings)
		Item = ItemContainer.getByIndex (ItemIx)
		
		REM Poperty "Enabled" suchen
		FOR i = 0 TO uBound (Item)
			IF Item(i).Name = "Enabled" THEN
				Item(i).Value = Enable
				Exist = TRUE
				EXIT FOR
			END IF
		NEXT	
		
		REM Property "Enabled" nicht vorhanden
		IF NOT Exist THEN
			REDIM PRESERVE Item(uBound(Item) + 1)
			Prop.Name = "Enabled"
			Prop.Value = Enable
			Item(uBound(Item)) = Prop
		END IF

		ItemContainer.replaceByIndex (ItemIx, Item)
		DocCfgMng.replaceSettings (MENURESOURCE, Settings)
	END IF
END SUB

FUNCTION getItemContainer (BYVAL PopupIndex AS INTEGER, _
								Settings AS OBJECT) _
								AS OBJECT
	DIM Popup AS OBJECT
	DIM i AS INTEGER
	
	Popup = Settings.getByIndex (PopupIndex)
	FOR i = 0 TO uBound (Popup)
		IF Popup(i).Name = "ItemDescriptorContainer" THEN
			getItemContainer = Popup(i).Value
			EXIT FUNCTION
		END IF
	NEXT
END FUNCTION
So geht's ohne Absturz.


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten