"soffice .uno:NewDoc" mittels Shell ausführen

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

Moderator: Moderatoren

Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

"soffice .uno:NewDoc" mittels Shell ausführen

Beitrag von Stephan »

Hallo,

ich möchte in einem StarBasic-Makro den Aufruf "soffice .uno:NewDoc" ausführen (Hinweis: .uno:NewDoc öffnet das Dokumentvorlagenfenster von LO). Per Terminal klappt das aber per Shell im Makro bekomme ich es nicht hin.

Das hier tut buchstäblich Garnichts:

Code: Alles auswählen

Shell("/usr/lib/libreoffice/program/soffice",1,".Uno:NewDoc")
und das hier gibt Laufzeitfehler (Datei nicht gefunden):

Code: Alles auswählen

Shell(soffice,1,".Uno:NewDoc")

Das Ganze 'spielt' unter Ubuntu 18.04 und LO 6.x.

Hat jemand einen Tipp?

Wozu brauche ich das?
Ich öffne Initial einen Dialog per Shellscript mit:

Code: Alles auswählen

soffice --invisible macro:/// [...]
und habe in dieser Situation (weil nur der Dialog sichtbar ist und kein LO-Fenster (Frame)) keinen direkten Zugriff auf den Dispatcher. Ich könnte nun zwar ein Fenster öffnen aber ich habe die Hoffnung das es auch über "soffice" plus .UNO-Befehl gehen sollte.


Gruß
Stephan
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: "soffice .uno:NewDoc" mittels Shell ausführen

Beitrag von Stephan »

Nachtrag:

Code: Alles auswählen

Shell("soffice",1,".Uno:NewDoc")
(mit "" bei soffice)

funktioniert aus der geöffneten IDE heraus gestartet, aber nicht von einem Dialog aus, wenn kein LO-Programmfenster offen ist. Keine Ahnung warum nicht.
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: "soffice .uno:NewDoc" mittels Shell ausführen

Beitrag von marcel_at_work »

Hallo Stephan,

dies habe ich im OOME gefunden:
11.1.1. Zwei unterschiedliche Methoden, OOo zu steuern
Die flexibelste Methode zur Manipulation eines OOo-Dokuments ist der Zugriff auf die internen
UNO-Objekte. Der Weg über das Modell bietet bedeutende Steuerungsmöglichkeiten, aber man
muss die unterschiedlichen Services und Interfaces gut verstehen.

Ein anderer Weg, der sehr wenig Verständnis der OOo-Interna voraussetzt, geht über einen UNO-
Dispatcher. Der Dispatcher übernimmt eine Anweisung wie „.uno:Undo“ und kümmert sich um den
Rest der Details. Der Frame stellt die für die Arbeit benötigten Dispatcher bereit. Vereinfacht gesagt,
stellen Sie sich einen Dispatch wie die Auswahl einer Aktion aus dem Menü vor.

Obwohl die direkte Kontrolle über UNO-Services weitest reichende Funktionalität und Flexibilität
bietet, sind doch manche Operationen leichter mit dem Dispatcher erledigt, manchmal ist der Dispat-
cher auch die einzige Möglichkeit, eine Aufgabe durchzuführen. Zum Beispiel ist für die Nutzung
des Zwischenspeichers der Dispatcher die beste Lösung. Sogar der Makrorecorder erledigt fast alle
Aufgaben mit einem Dispatcher.

Drei Dinge werden für die Arbeit mit einem Dispatcher benötigt: (1) der Dispatch-Befehl, (2) Argu-
mente zur Steuerung des Dispatch und (3) ein Objekt, das den Dispatch-Befehl ausführen kann (der

Dispatch-Provider, normalerweise ein Frame). Jedes Dokument hat einen Controller, der sozusagen
als Schnittstelle zwischen der Außenwelt und dem Dokument fungiert. Mit dem Controller wählen
Sie zum Beispiel Text aus, suchen die aktuelle Cursorposition oder ermitteln das aktive Tabellenblatt
in der Tabellenkalkulation. Der aktuelle Controller kann auch den Frame des Dokuments zurückge-
ben, der den Dispatch-Befehl unterstützt.
Ich kenne mich mit UNO nicht aus, aber ohne Frame scheint diese Anweisung nicht zu funktionieren.
Letztens hatte ich mal gelesen, daß es überhaupt erst ein UNO-Objekt bzw. -Service benötigt, um UNO benutzen zu können.

Wenn du dies also vorher vielleicht noch erstellst?

Code: Alles auswählen

oDispHelper = CreateUnoService("com.sun.star.frame.DispatchHelper")
oDispHelper.executeDispatch(oProvider,".uno:NewDoc", "", , Array())
Aus deiner Argumentation ergibt sich aber die Frage, wohin du eine Vorlage laden möchtest, wenn Office gar nicht geöffnet ist? Im Vorlagen-Picker selbst hat man schließlich keine Möglichkeit mehr, Office zu starten?!
Aber wenn LO erwartet wird, starte es doch vorher einfach (mittels Shell) unsichtbar im Hintergrund?

Viele Grüße und einen guten Rutsch,

Marcel
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: "soffice .uno:NewDoc" mittels Shell ausführen

Beitrag von Stephan »

Wenn du dies also vorher vielleicht noch erstellst?
Dann wird es funktionieren. Deshalb schrieb ich bereits:
Ich könnte nun zwar ein Fenster öffnen
Ja, stimmt diese Aussage ist etwas anders formuliert als Dein Vorschlag inhaltlich läuft das aber auf Dasselbe hinaus.


Gruß
Stephan
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: "soffice .uno:NewDoc" mittels Shell ausführen

Beitrag von marcel_at_work »

Hey Stephan,

zwei Lösungsansätze könnte ich anbieten...

1) Beendigung des LO-Schnellstarters vor dem Start deines Dialoges aus dem System heraus - dies eliminiert natürlich jedes geöffnete LO-Fenster. Wie man dies ohne Taskmanager umsetzt, ist mir auf die Schnelle allerdings nicht bewußt.

2) Ausführung deines Dialogs statt mit .execute per .setVisible.

Beides sollte problemlos laufen.

Viele Grüße,

Marcel
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
Antworten