BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!

❤️ DANKE >><< DANKE ❤️

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 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 nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten