Per Button das Makro eines anderen Dokuments starten

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

arkadiuszpaluszek
****
Beiträge: 117
Registriert: So, 09.05.2010 09:53
Wohnort: Coburg
Kontaktdaten:

Per Button das Makro eines anderen Dokuments starten

Beitrag von arkadiuszpaluszek »

Hallo!

Ich würde gerne per Buttonklick im Dokument2.odt ein Makro starten, welches im Dokument1.odt enthalten ist. Dummerweise habe ich gerade gesehen, dass sobald ich auf die Eigenschaften des Kontrollfelds "Button" gehe und dann auf "Makro zuweisen" mir lediglich die Makros des jeweiligen Dokuments zur Verfügung stehen oder die, welche in OpenOffice gespeichert sind.

Nun ist es etwas unglücklich, weil ich innerhalb des Dokumentes1 eine globale Variable (Datenbankverbindung) deklariert habe welche ich dann im Dokument2 brauche, deshalb wollte ich per Tastendruck auf ein Makro des Dokuments1 zugreifen.

Hat jemand einen Lösungsvorschlag?

Gruß

Arek
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Per Button das Makro eines anderen Dokuments starten

Beitrag von DPunch »

Aloha
arkadiuszpaluszek hat geschrieben:Nun ist es etwas unglücklich, weil ich innerhalb des Dokumentes1 eine globale Variable (Datenbankverbindung) deklariert habe welche ich dann im Dokument2 brauche, deshalb wollte ich per Tastendruck auf ein Makro des Dokuments1 zugreifen.
Deine in Dokument1 deklarierte Variable wird auch dann in Dokument2 nicht sichtbar sein.

Eine Lösungsmöglichkeit wäre der ScriptProvider von Dokument1 ala
(in Dokument2)

Code: Alles auswählen

Sub ExecuteMacroInOtherDoc	
	sLibName = "Standard"
	sModuleName = "Module1"
	sMakroName = "ReturnConnection"
	oScript = Dokument1.ScriptProvider.getScript("vnd.sun.star.script:" & sLibName & "." & sModuleName & "." & sMakroName _
				& "?language=Basic&location=document")
	Dim oCon as Object
	oScript.invoke(Array(oCon),Array(),aReturnValues)
	oCon = aReturnValues(0)
End Sub
(In Dokument1 )

Code: Alles auswählen

Sub ReturnConnection(Dummy)
	Dummy = oConnection
End Sub
arkadiuszpaluszek
****
Beiträge: 117
Registriert: So, 09.05.2010 09:53
Wohnort: Coburg
Kontaktdaten:

Re: Per Button das Makro eines anderen Dokuments starten

Beitrag von arkadiuszpaluszek »

O.k., hört sich sehr gut an, aber minimalisieren wir es zunächst auf ein einfacheres Beispiel. Ich habe ein geöffnetes Dokument mit dem Namen "test2.odt" welches fologendes Makro beinhaltet:

Code: Alles auswählen

Sub MakroTest
Msgbox ("Hello World!")
End Sub
Im Dokoment "test.odt" habe ich dagegen Dein Makro, welches ich ein bisschen vereinfach habe:

Code: Alles auswählen

Sub ExecuteMacroInOtherDoc 
   sLibName = "Standard"
   sModuleName = "Module1"
   sMakroName = "MakroTest"
   MyDokument="test2.odt"
   oScript = MyDokument.ScriptProvider.getScript("vnd.sun.star.script:" & sLibName & "." & sModuleName & "." & sMakroName & "?language=Basic&location=document")
   oScript.invoke()
End Sub
Blöderweise führt das ganze zu einem Fehler, es heißt "Objektvariable nicht belegt", wobei die Zeile oScript=MyDokument.... markiert wird - zum "invoke" kommt es erst gar nicht - wo ist der Fehler?

Gruss

Arek
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Per Button das Makro eines anderen Dokuments starten

Beitrag von DPunch »

Aloha
arkadiuszpaluszek hat geschrieben:Blöderweise führt das ganze zu einem Fehler, es heißt "Objektvariable nicht belegt", wobei die Zeile oScript=MyDokument.... markiert wird - zum "invoke" kommt es erst gar nicht - wo ist der Fehler?
"myDocument" muss logischerweise die Referenz auf das Dokumentmodel des jeweils anderen Dokuments beinhalten, dort ist schliesslich Deine "MakroTest"-Prozedur und nur von dort kann der ScriptProvider Dir die Prozedur zur Verfügung stellen.
Da ich Deinen Code nicht kenne (und daher nicht weiss, ob und wie Du das andere Dokument referenzierst), einfach mal mithilfe des ComponentWalkers:

Code: Alles auswählen

	sLibName = "Standard"
	sModuleName = "Module1"
	sMakroName = "MakroTest"
	sOtherDocumentsTitle = "test2.odt"
	
	oComponents = StarDesktop.getComponents
	enumComponents = oComponents.createEnumeration
	Do While enumComponents.hasMoreElements
		thisElement = enumComponents.nextElement
		If thisElement.Title = sOtherDocumentsTitle Then
			MyDokument = thisElement
			Exit Do
		End If
	Loop
	If isEmpty(MyDokument) Then Exit Sub
	
	oScript = MyDokument.ScriptProvider.getScript("vnd.sun.star.script:" & sLibName & "." & sModuleName & "." & sMakroName & _
					"?language=Basic&location=document")
	oScript.invoke(Array(),Array(),Array())
arkadiuszpaluszek
****
Beiträge: 117
Registriert: So, 09.05.2010 09:53
Wohnort: Coburg
Kontaktdaten:

Re: Per Button das Makro eines anderen Dokuments starten

Beitrag von arkadiuszpaluszek »

Super, es funktioniert, danke! Etwas umständlich finde ich allerdings den Weg über den ComponentWalker der sich durch alle offenen Dokumente durchwühlt bis er bei "test2.odt" ankommt, aber es scheint wohl, dass es keine Möglichkeit gibt die Datei z.B. direkt über den Namen anzusprechen, oder? Zumindest wenn ich sage

myDoc=StarDesktop.GetComponents

verfügt dann myDoc nicht über die Methode "GetByName", schade eigentlich! Aber - auch mit dem ComponentWalker funktioniert es, also schon mal herzlichen Dank!

Gruss

Arek
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Per Button das Makro eines anderen Dokuments starten

Beitrag von DPunch »

Aloha
arkadiuszpaluszek hat geschrieben:Etwas umständlich finde ich allerdings den Weg über den ComponentWalker der sich durch alle offenen Dokumente durchwühlt bis er bei "test2.odt" ankommt
Naja, wie viele Dokumente hat man denn schon offen? Die Enumeration und das Finden des anderen Dokuments sieht im Code komplizierter aus, als es im tatsächlichen Makro-Lauf ist, das geht blitzschnell.
arkadiuszpaluszek hat geschrieben:aber es scheint wohl, dass es keine Möglichkeit gibt die Datei z.B. direkt über den Namen anzusprechen, oder?
Da theoretisch zwei Dateien offen sein können mit dem gleichen Titel ("C:\a.ods" und "D:\a.ods" => beides "a.ods") wäre das etwas problematisch.
Man könnte jetzt über die URL gehen - aber was ist dann mit Dateien, die noch nicht gespeichert sind, aber natürlich trotzdem offen?
Du siehst, nicht so einfach, wie man sich das vorstellt ;)
Deshalb werden die geöffneten Dokument nicht aktiv vorgehalten (=mit ihrem Namen/Titel/wasauchimmer in einem Container zwischengespeichert), sondern es wird nur bei Bedarf betrachtet, was genau denn gerade geöffnet ist.

Abgesehen davon:
Bei genauerem Hinsehen frage ich mich gerade, ob Du diesen Weg überhaupt gehen musst.
Die Connection kannst Du doch einfach im fraglichen Dokument neu aufbauen (bzw. die Connection muss bei Standardeinstellungen mit Connection-Pooling in der Regel noch nichtmal neu hergestellt werden, sondern wird ja eh vorgehalten).
Das dürfte Dir einige Umstände ersparen.
Antworten