🙏 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. 🤗

Rechner herunterfahren per Makro

Alles zur Programmierung im LibreOffice.
Sephan
Beiträge: 153
Registriert: Mi 26. Jan 2011, 13:16

Re: Rechner herunterfahren per Makro

Beitrag von Sephan » Di 9. Jul 2013, 15:31

Damit liegt dann das Makro irgendwo in LibreOffice. Ist also nicht mehr portabel.

Kann man das auch in eine extra Datei packen?

Und bei deinem Skript klappt das mit der Reihenfolge gar nicht. Da wird LO schon langsam beendet noch bevor er überhaupt nachfragt. Das klappt nur so:

Code: Alles auswählen

sub CloseDB_and_ShutDown_from_LO(oEvent)

   if msgbox("Beenden und Herunterfahren?",4)=6 then
      shell("~/sd_scrpt",0,,false)
      oEvent.Source.Model.Parent.Parent.Parent.Parent.close(true)
      ' hier gegebenenfalls offene Frames suchen und schliessen bevor der .terminate-Befehl kommt
      stardesktop.terminate
      on error resume next
   end if

end sub
Wenn ich das Skript in LibreOffice speichere, kann LO mit dem Skript auch beendet werden, ansonsten nicht. Was aber wie bisher bei scheinbar allen Makros, auch in LO gespeicherte, die ich zum Beenden probiert habe gleich zu sein scheint, ist dass jedes Mal ein Error Log von Java erzeugt wird. So sehen diese aus:
http://pastebin.com/mGCdcc3i

Auch ein einfaches sub nur mit StarDesktop.terminate() manuell gestartet, führt zu diesem error log.

EDIT:
Bei dem Skript:
http://www.oooforum.org/forum/viewtopic ... f6207ff897

Bekomme ich an der Stelle "Call oDocument.Close(True)" die Fehlermeldung:
BASIC-Laufzeitfehler.
Objektvariable nicht belegt.

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: Rechner herunterfahren per Makro

Beitrag von gogo » Mi 10. Jul 2013, 00:14

Der Java-Error kommt ja davon, dass LO nicht beendet, sondern terminiert wird. Daher auch mein Gedanke das über die uno-Bridge zu machen - funktioniert dann auch:

Code: Alles auswählen

Sub Close_and_Shutdown()
	'On Error Resume Next
	Dim oDispatchProvider as Object
	oDispatchProvider = ThisComponent.getCurrentController().getFrame()
	Dim oDispatchHelper as Object
	
	oDispatchHelper = CreateUnoService("com.sun.star.frame.DispatchHelper")
	oDispatchHelper.executeDispatch(oDispatchProvider,_
									".uno:Quit",_
									"_self",_
									com.sun.star.frame.FrameSearchFlag.ALL,Array())
	'zum Herunterfahren bitte das Wiki befragen: http://wiki.ubuntuusers.de/Herunterfahren
	'shell("sh sd_scrpt",0,,false)
	'shell("gnome-session-quit --power-off",0,,false)
End Sub
Was nicht funktioniert, ist das Schließen von Frames die .close nicht unterstützen - da kommt ein uno-Fehler, den man in Basic nicht abfangen kann (oder evtl. doch über einen Listener auf den DispatchHelper?). Ob das für Dich reicht weiß ich nicht.

Die Reihenfolge der Befehle im Makro hat mit dem Schnellstarter zu tun. Der ist - wenn er aktiv ist - ja noch als Prozess am Laufen, daher kann der shell-Befehl nach dem Quit noch auf die LO-Infrastruktur zugreifen - wenn nicht, ist der .terminate-Befehl (oder das Quit im Makro oben) der letzte Ausführbare.
Bekomme ich an der Stelle "Call oDocument.Close(True)" die Fehlermeldung:
"call" sucht nach einer Funktion/Sub, oDocument ist aber eine Variable - lass' das call einfach weg, dann funktioniert's.

Makro "außerhalb" speichern:
unter Extras/Makros/Makros verwalten/LibreOffice Basic auf die Buttons:
"Verwalten", dann auf "Neu" klicken und eine neue Bibliothek anlegen - in der dann das Makro speichern. Diese Bibliothek kann dann als "Bibliothek" oder als "Extension" exportiert werden (Button "Exportieren") es wird dann (bei "Extension") eine *.oxt-Datei erstellt, die man über den Extension Manager (Extras/Extension Manager) importieren kann. Wenn man in einer Umgebung mit mehreren Usern immer mal wieder das eine oder andere Makro ergänzen/umschreiben muss, ist das ein 1a Weg um die Makros einer Anwendung zu pflegen, denn eine Extension (Bib_Version_1.oxt) über den Extension Manager gegen Bib_Version_2.oxt auszutauschen das schafft fast jeder User.
neue_bibliothek_anlegen.png
neue_bibliothek_anlegen.png (67.25 KiB) 5648 mal betrachtet
Wichtig ist, dass Extensions NICHT beim Start von LO geladen werden. Man muss also in das Startmakro einer Applikation diese Ladeprozedur einfügen, sonst werden die Makros dieser Bibliothek NICHT gefunden!:

Code: Alles auswählen

if not BasicLibraries.isLibraryLoaded("NameDerBibliothek") then BasicLibraries.loadLibrary( "NameDerBibliothek")
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

balu
* LO-Experte *
Beiträge: 370
Registriert: Mi 1. Jun 2011, 16:21

Re: Rechner herunterfahren per Makro

Beitrag von balu » Mi 10. Jul 2013, 12:17

Hallo liebe Leute,

ich möchte mal etwas hier einstreuen, auch wenn es vielleicht nicht funktioniert. Es ist jas nur mal so eine dumme kleine Überlegung meinerseits.

Also, ihr wollt LO beenden und anschließend den Rechner runterfahren. Und so weit ich das bis jetzt überblickt habe, wollt ihr das ganze aus einer laufenden Instanz aus LO heraus machen. Dabei wollt ihr mittels SHELL() und einer externen Batch das ganze durchführen.

Jetzt zu meiner Überlegung.
Eine Batch (oder wie auch immer) erstellen ist Okay, denke ich mir. ABER führt nicht diese Batch IN LO aus, also von dort aus starten, sondern startet LO durch diese Batch. Da ja LO, falls sich nichts daran geändert hat, durch Commandline-Modus mit Parameter auch Makros ausführen kann, würde ich also vorschlagen eine Batch zu schreiben die LO mit Parameter startet, und wenn dann LO beendet wird dann die Batch weiter abgearbeitet wird.

Wie gesagt, ist nur ne kleine dumme Überlegung und ich weiß auch nicht wie das in die Tat umgesetzt werden kann. Vielleicht hilft Euch ein Link zu einem anderen Forum etwas weiter:
CALC in command-line modus

Falls meine Überlegung nicht durchführbar sei, weil ihr es schon getestet habt, dann bitte ich um Entschuldigung das ich Euch gestört habe.

Wünsche Euch aber dennoch viel Glück und Erfolg bei der Problembeseitigung.



Gruß
balu

Sephan
Beiträge: 153
Registriert: Mi 26. Jan 2011, 13:16

Re: Rechner herunterfahren per Makro

Beitrag von Sephan » Mi 10. Jul 2013, 12:24

Nun, die Idee kam mir auch schon. Aber ich möchte in Base einen Knopf zum Beenden von LO und das Makro darin sollte LO auch zuverlässig beenden. Tut es aber nicht und auch. Ansonsten ginge das schon. Aktuell rufe ich das LO eigenen Beenden Makro auf und deine Shell Skript Datei. Letztere prüft, ob Base sich richtig geschlossen hat, und killt ihn ansonsten mit dem Parameter 15. Das funktioniert bisher am zuverlässigsten. Das letzte Makro von gogo hab ich aber noch nicht getestet. Kommt heute noch.

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: Rechner herunterfahren per Makro

Beitrag von gogo » Mi 10. Jul 2013, 12:50

... Wie gesagt, ist nur ne kleine dumme Überlegung ...
hahaha :lol: - ohne, dass ich's probiert habe, funktioniert Dein Vorschlag sicher (zumindest auf Linux-Sytemen).

Der Shell-Aufruf in LO-Basic ist verhält sich Betriebsystembezogen übrigens so wie ein Dispatcher - fire and forget. Zumindest dann, wenn der Parameter Nr 4 (bSync) auf False gesetzt ist (=Standardeinstellung):
bSync
Ist dieser Wert auf True gesetzt, so warten der Shell-Befehl und alle anderen LibreOffice-Tasks, bis der so gestartete Shell-Prozess beendet ist. Ist der Wert auf False gesetzt, wird das Kommando sofort wieder zurückübergeben. Der Standardwert ist False.
d.h. Wenn der Shell-Aufruf mit bSync=False abgesetzt wird, dann sollte diese Shell nicht innerhalb von LO laufen, wird also zu einem eigenen Prozess und läuft also nach Benndigung von LO weiter - genau so wie ein Druckauftrag, den man per Dispatcher absetzt.
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

balu
* LO-Experte *
Beiträge: 370
Registriert: Mi 1. Jun 2011, 16:21

Re: Rechner herunterfahren per Makro

Beitrag von balu » Fr 12. Jul 2013, 12:06

Hallo Leute,

alles klar! Da ich mich mit diesem speziellen Thema hier nicht wirklich befasst habe, klinke ich mich wieder aus.

Ich drücke euch beide Daumen das ihr zu einem funktionierenden Ergebnis kommt. Viel Glück, Erfolg, und noch viel Spaß. :)



Gruß
balu

Sephan
Beiträge: 153
Registriert: Mi 26. Jan 2011, 13:16

Re: Rechner herunterfahren per Makro

Beitrag von Sephan » Mo 29. Jul 2013, 22:49

Ich versuche das gerade mit den Extentions, habe damit aber Schwierigkeiten. Unter Windows landet das Makro in LibreOffice Makros unter Ubuntu in Meine Makros. Weiß nicht, ob das nicht noch Probleme machen könnte. Außerdem bekomme ich die Fehlermeldung, dass die Variable ThisDatabasedocument nicht belegt ist.

Hab das UNO Skript auch mal in der odb Datei versucht, damit kommt es auch zu den Java Fehlermeldungen, also einem Terminate.

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: Rechner herunterfahren per Makro

Beitrag von gogo » Mo 5. Aug 2013, 12:13

Sephan hat geschrieben:Ich versuche das gerade mit den Extentions, habe damit aber Schwierigkeiten. Unter Windows landet das Makro in LibreOffice Makros unter Ubuntu in Meine Makros. Weiß nicht, ob das nicht noch Probleme machen könnte.
Wenn Du die Extension auf einem weiteren Ubuntu-Rechner installierst, wird sie auch dort unter "LibreOffice Makros" landen, denn auf dem ersten Ubuntu Rechner hast Du das Makro unter "Meine Makros" programmiert, eine zusätzliche Extension auf einem anderen Rechner wird aber immer unter "LibreOffice Makros" installiert. Der Aufruf einer Prozedur bleibt aber immer der gleiche, egal in welcher "Rubrik" das Makro angezeigt wird:

Code: Alles auswählen

Bibliotheksname.Modulname.Prozedur(Parameter1, Parameter2 ...)
Sephan hat geschrieben:Außerdem bekomme ich die Fehlermeldung, dass die Variable ThisDatabasedocument nicht belegt ist.
Das Objekt ThisDatabasedocument gibt's nur wenn ein Makro in einer odb-Datei gespeichert ist.
Sephan hat geschrieben:Hab das UNO Skript auch mal in der odb Datei versucht, damit kommt es auch zu den Java Fehlermeldungen, also einem Terminate.
Liegt sicher am .uno:Quit-Befehl, da der Dispatch vom Frame (=Datenbank) aus gestartet wird - der wird zwar durchgezogen, aber die Datenbank ist ja in der Hierarchie unter dem StarDesktop - d.h. wenn der StarDesktop die Datenbank schließt ist das ok, wenn umgekehrt, dann tritt dieser Fehler auf.

edit: das ist missverständlich formuliert:
gogo hat geschrieben:...da der Dispatch vom Frame (=Datenbank) aus gestartet wird...
Also: der Befehl im Makro lautet:

Code: Alles auswählen

oDispatchProvider = ThisComponent.getCurrentController().getFrame()
Wenn das Makro in einer Extension oder unter "Meine Makros" gespeichert ist, dann verweist "ThisComponent" auf die BASIC-Umgebung. Aus dieser Umgebung heraus kann der .uno:Quit-Befehl fehlerfrei ausgeführt werden, er steht hierarchisch über einem odb-Dokument. Wenn das Makro in einer Datenbankdatei gespeichert ist, dann verweist "ThisComponent" auf die Datenbank-Datei, diese wiederum kann den Stardesktop nicht (fehlerfrei) schließen.
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu


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