Dialog als Autostartmakro

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

Moderator: Moderatoren

DITA
***
Beiträge: 91
Registriert: Fr, 16.11.2012 16:23

Dialog als Autostartmakro

Beitrag von DITA »

Hallo zusammen,

beim Überarbeiten meines Projektes brauche ich nochmals eure geschätzte Hilfe.

Habe mir ein "Autostartmakro" gebastelt, indem ein Dialogfenster geöffnet wird, dass mit Name und Mitarbeiter-Nr. usw. gefüttert werden muss, um weiter zu kommen. Dieses Makro lass ich momentan noch bei Dokument öffnen, automatisch starten, was (wie ich damals fand, ausreichend war, weil man ja beim Start kurz das eigentliche Tabellenblatt sieht). Im "Alltagsbetrieb" führt das jedoch zu Problemen, weil bei älteren Rechnern es doch schon mal mehrere Sekunden dauert, bis das Dialogfenster erscheint, und so für Verwirrung sorgt.

Als ich damals fragte, schien mir das eine akzeptable Lösung, eine andere Antwort war auch, wenn ich es richtig verstanden hatte und nun wiedergeb, ich müsste die Datei selbst per Makro starten. Und das ist nun mein Problem.

Wenn ich das jetzt richtig verstehe, müßte ich eine zweite Datei bauen, wo es nur ein Dialogfenster gibt und zwei makros, einmal zum Dialog starten und einmal um dann die andere Datei (ohne den Dialog) zu starten. Nur wenn ich das dann wieder bei Dokument starten als "Autostartmakro" hinterlege, habe ich doch den gleichen Effekt oder???

Habe schon im Netz, unter anderem auch hier im Forum gesucht, entweder such ich nach den falschen Kriterien, oder ich versteh (leider) nur Bahnhof.
Bitte gebt mir einen Tipp wie ich das hinbekomme - danke schon mal im Voraus

Gruss Dirk
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Dialog als Autostartmakro

Beitrag von balu »

Hallo Dirk,

kann sein das Du mit den falschen Kriterien suchst. Wie wäre es mit dem Suchwort "komandozeile"?
Schau dir mal folgedes Thema an. Makro Starten per Batch
Dort ist die Antwort von Stephan für dich vielleicht ganz interessant. Zumindest hättest Du dann schon mal einen ersten Einstieg um weiter zu Forschen.




Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
DITA
***
Beiträge: 91
Registriert: Fr, 16.11.2012 16:23

Re: Dialog als Autostartmakro

Beitrag von DITA »

Hallo balu,

lange nichts mehr voneinander gehört, schön mal wieder von Dir zu lesen.

Also, Komandozeile, danach hab ich bestimmt nicht gesucht, wäre ich wahrscheinlich nie drauf gekommmen.
Die von Dir verlinkte Seite hatte ich schon mal versucht, aber irgendwie klappt es nicht wie gwollt.

Habe auch schon mit Shell experimentiert oder Dannenhöfer 2.3.20.

beim "Schnellnachbau" schaffte ich es eben, dass zumindest das OpenOffice Zeichen kurz erschien und schwups, war wieder alles weg, obwohl ich direkt nach dem von Stephan's Code den Dialog starte.

Vermutlich mach ich irgendwas falsch, nur was
Wäre dankbar für einen weiteren Schubs in die richtige Richtung - danke

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

Re: Dialog als Autostartmakro

Beitrag von Stephan »

(a)
Wäre es nicht ausreichend ein Tabellenblatt der Datei als 'Dialog-Fenster' zu benutzen indem man dort ein Formular einrichtet?

(b)
Was passiert denn wenn Du im Autostartmakro als Erstes versuchst das Dokument unsichtbar zu machen? Das sollte so gehen:

Code: Alles auswählen

'*...
ThisComponent.CurrentController.Frame.ContainerWindow.Visible = False
'...
Das sollte bewirken das zunächst Nichts zu sehen ist, was ja ggf. für Deine Zwecke besser ist als ein Tabellenblatt. Richtig gut ist das wohl auch nicht, weil der Nutzer nun statt "verwirrt" zu sein sich fragt warum es so lange dauert das die Datei öffnet, andererseits KÖNNTE die Nicht-Sichbarkeit des Fensters auch den Start des Dialogs beschleunigen, Du musst das ausprobieren.

Ich hänge mal eine Testdatei, allerdings nur mit Msgbox statt Dialog, an.



Wieso der Code der Kommandozeile nicht läuft kann ich nicht direkt sagen und ich weiß auch auf die Schnelle nicht was ich Dich überhaupt fragen könnte um dem Fehler auf die Spur zu kommen.



Gruß
Stephan
Dateianhänge
Testdatei.ods
(8.09 KiB) 184-mal heruntergeladen
DITA
***
Beiträge: 91
Registriert: Fr, 16.11.2012 16:23

Re: Dialog als Autostartmakro

Beitrag von DITA »

Hallo Stephan,

auch Dir erstmal danke, dass Du versuchst mir zu helfen.

Deine Version mit dem ausblenden nutze ich bereits, habe sogar ausprobiert vor dem beenden auszublenden, aber beim Start in der jetzigen Version (wie Deine Testdatei) wird es beim Start bis zum abarbeiten des Autostartmakros das erste Tabellenblatt angezeigt.

Da ich mich mit Batch und so nicht wirklich auskenne, zeig ich mal wie ich es gemacht habe. zur Probe hab ich mal die Anführungszeichen weggemacht, dann scheint auch etwas zu passieren, denn die Startleiste zuckt ein wenig. Mit Anführungszeichen kommt ein Fenster (schwarz)mit zweizeiligem Text, den man aber nicht lesen kann, bevor das OpenOffice Zeichen kurz auf dem Bildschirm erscheint.

Inhalt von der Test.bat:

"C:\Program Files (x86)\OpenOffice 4\program\scalc.exe" "macro:///Standard.AutoStart.Main("C:\Users\...\Desktop\Test.ods")"

Pfad bei den Pünktchen leicht geändert.

In der Test- Datei ist nur das makro welches den Dialog öffnen soll (so hab ich es zumindest verstanden)
Test.ods
(10.17 KiB) 168-mal heruntergeladen
vielleicht siehst Du ja meinen Fehler

Danke

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

Re: Dialog als Autostartmakro

Beitrag von Stephan »

Ich kann keinen Fehler erkennen.

Ich würde testweise die *.bat nicht per Doppelklick starten sondern per Aufruf von cmd.exe dann dort ins Fenster die bat-Datei 'ziehen' und mit Enter bestätigen dann gibt es im cmd-Fenster eine Rückgabe der bat, die man lesen kann. Dort könnte sich dann ein Hinweis finden.

Ich habe selbst auch nochmals den Aufruf kontrolliert weil mir die einfachen Anführungszeichen (hier rot markiert) verdächtig erschienen, aber das funktioniert bei mir so:

"C:\Program Files (x86)\OpenOffice 4\program\scalc.exe" "macro:///Standard.AutoStart.Main("C:\Users\...\Desktop\Test.ods")"


Gruß
Stephan
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Dialog als Autostartmakro

Beitrag von balu »

Hallöchen Dirk,
lange nichts mehr voneinander gehört, schön mal wieder von Dir zu lesen.
Ja ja, meine Gesundheit zwingt mich momentan in andere Bahnen.

Aber dennoch habe ich mich heut mal bei diesem echt ekligen Wetter, hatte kurzzeitig sogar geschneit (oh welch schauderhafte Überraschung, kann momentan keinen Schnee gebrauchen *grrrrr*), mich mit deinem Problem befasst.

Also das mit der Batch-Datei, und was Du da beobachtet hast, ist nicht weiter tragisch. Wenn ich noch die Befehle wüsste wie man die Bildschirmausgabe unterdrücken kann, so würde ich sie dir sagen. Aber das spielt jetzt im Endeffekt auch überhaupt keine Rolle.

Um es schon mal in einer Kurzfassung vorweg zu nehmen: Du mustt leider einen anderen Weg gehen, den Du sogar schon selber genannt hattest.


Jetzt ausführlicher.
Um überhaupt festzustellen ob dein Makro wegen dem Dialog in deiner Datei *Test.ods* funzt, hatte ich Plöti natürlich nicht den einfachsten Weg gewählt :lol:, sondern mich auf das aktuelle Problem konzentriert. Dabei störte mich aber das erstellen einer neuen und leeren Datei. Und dann eine kleine Batch für mich erstellt um deine Datei durch die Batch zu starten. Ergebnis war negativ. Im Makro hatte ich vor dem Dialog-Aufruf eine kleine MsgBox geschaltet, um zu sehen ob ich überhaupt bis dahin komme, doch nix dergleichen geschah.

Also Stephans Datei angeschaut, und da sah ich auch den Grund warum es bei dir nicht funzen kann. Und da kommt jetzt auch der von dir genannte Hinweis zu Dannenhöfer zum tragen. An dieser Stelle bedanke ich mich bei dir für den Hinweis. Danke schön! Prima gemacht :-)
[url=http://www.dannenhoefer.de/faqstarbasic/KannmaneinMakroberdieKommandozeilemitsta.html#Zweig57 hat geschrieben:2.3.20 Kann man ein Makro über die Kommandozeile mitstarten?[/url]]
Ein Makro aus der Datei zu starten die aufgerufen wird geht nicht. Das sollte man dann dem Ereigniss "Dokument öffnen" verknüpfen.
Uns dem Ereigniss "Dokument öffnen" habe ich in deiner Datei das dementsprechende Makro zugeordnet. Jetzt erschien auch die von mir eingefügte MsgBox. Na endlich ein Schritt weiter!
Doch mein mir vorgestelltes Ziel war noch nicht in Sicht. Also weiter im Text.

Jetzt habe ich von Stephan mir noch was abgeschaut, und zwar das hier,

Code: Alles auswählen

ThisComponent.CurrentController.Frame.ContainerWindow.Visible = False
Ah! Ja!
Schon besser.

Aber noch nicht wirklich gut. Denn ich sah für einen gaaaanz kurzen Augenblick das Tabellenblatt. Auch wenn es wirklich nur für den Bruchteil einer Sekunde war, so sah ich es halt leider. Und mein Rechensklave ist nicht grad der aller langsamste, aber auch nicht der aller schnellste (AMD FX 4300 Quad-Core 3,82 GHz). Und wenn ich das schon sehe, dann werden das noch langsamere erst recht sehen, und das für eine etwas längere Zeit.

Da fiel mir wieder ein, das man ja auch Dateien versteckt im Hintergrund öffnen kann. Das habe ich schon des öfteren praktiziert. Jedoch mit dem fetten Unterschied, eine Datei mit Makro öffnet eine andere Datei versteckt im Hintergrund. Also kann ICH dies Verfahren in diesem Falle nicht anwenden. Aber vielleicht gibts ja einen anderen Weg.

Na dann schmeißen wir doch mal kurzerhand XRAY an, und untersuchen den folgenden Zweig.

Code: Alles auswählen

ThisComponent.CurrentController.Frame.ContainerWindow
Ich hatte auch was gefunden, und zwar.
- toBack ()
- toFront ()
Dumm nur das XRAY mir nix weiter dazu sagt, wie z.B. bei
- setVisible ( Visible as boolean )

Aber dennoch hatte ich es mal so rum versucht.

Code: Alles auswählen

ThisComponent.CurrentController.Frame.ContainerWindow.toBack()
Ja Okay, funzt, und funzt nicht. Abwechselnd. Der Grund ist ja auch klar. Denn wenn etwas im Hintergrund versteckt wird, muss es ja auch wieder von dort hervorgeholt werden. Also wenn ich toBack sagew muss ich auch toFront sagen.

Also sah jetzt zu guter letzt "dein Makro" ;-) wie folgt aus.

Code: Alles auswählen

Sub Main
ThisComponent.CurrentController.Frame.ContainerWindow.toBack()
Msgbox "KLICK MICH UND DER DIALOG ERSCHEINT"
ThisComponent.CurrentController.Frame.ContainerWindow.toFront()	
	Dialoglibraries.Loadlibrary("Standard")
	MyDlg= CreateUnoDialog(Dialoglibraries.Standard.Dialog1)
	
	MyDlg.execute()
End Sub
Und das Ergebnis lässt sich jetzt wie folgt beschreiben.
- Office geschlossen.
- Auf die dementsprechende Batch geklickt.
- Das DOS-Fenster poppt auf.
- Office Startlogo erscheint sehr kurz.
- Bruchteil einer Sekunde das Tabellenblatt gesehen.
- Die Msgbox erscheint.
- In der Taskleiste ist aber sonst nix vom Office zu sehen, und zwar absolut gar nix.
- Klick auf Okay in der MsgBox und der Dialog erscheint.
- In der Taskleiste ist immer noch nix vom Office zu sehen, und zwar absolut gar nix.
- Auf das X oben rechts im Dialog klicken, der Dialog verschwindet und Office samt Tabellenblatt erscheinen.

Eigentlich wäre das ja ein Grund zum Freuen. Doch da ja bei mir das Tabellenblatt sehr kurz zu sehen ist, sind wir so gesehen eigentlich wieder am Anfang. Der Testkandidat, die Datei samt Makro, ist ja so gesehen eigentlich Leer. Wenn jetzt aber die eigentliche Datei auf einem langsamen Rechner sagen wir mal so ca. 3 Sekunden zum öffnen braucht, dann wird auch für diese Zeit das Tabellenblatt in meiner Beobachtungsliste zu sehen seien.

Noch ein wichtiger Punkt zu der Beobachtung.
Ist das Office schon geöffnet, auch ohne eine Datei, dann funktionierrt das ganze nicht mehr so wirklich.

Kommen wir also zu Plan B, den Du schon selber angesprochen hattest.
Es wäre vorteilhaft wenn Du mit einem 2 Dateien-System arbeitest.
Die erste Datei ist so gesehen für das Anmelden zuständig. Ist die Anmeldung erfolgreich gewesen, öffnet die "Anmeldedatei" die eigentliche "Arbeitsdatei".
Die "Anmeldedatei" gibt aber zu erst eine Meldung in der Form von "Bitte warten." in einem Dialogfenster, nicht MsgBox, aus und öffnet dann die andere. Ist die "Arbeitsdatei" geöffnet, schließt sich die "Anmeldedatei".

So würde ich das zumidest machen.


Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
DITA
***
Beiträge: 91
Registriert: Fr, 16.11.2012 16:23

Re: Dialog als Autostartmakro

Beitrag von DITA »

Hallo Stephan,

damit hab ich heut schon mal wieder was gelernt - mit cmd.exe, und die bat da in das Fenster ziehen.
Ergebnis: nach hineinziehen in das cmd-Fenster stand vorm Cursor (der blinkt) der Pfad der Test.bat, nach bestätigen mit Enter, dauerte es ein kleinen Augenblick, und dann stand dort der Inhalt der Test.bat, nicht mehr und nicht weniger.

Bei weiteren Versuchen durch ausprobieren, habe ich es zumindest geschafft, die Test.ods durch die Test.bat zu starten indem ich den Teil
"macro:///Standard.AutoStart.Main( )" mal weggelassen hab.
Dabei kam die Frage auf, was ist mit dieser Abfrage Makro Sicherheit bzw. Makro ausführen erlauben????
Könnte da vielleicht der Haken liegen???

Nur mal grade zum Verständnis, die *.bat öffnet eigentlich nur eine Dialogseite (Userform) einer *.ods, und die wiederrum startet dann die eigentliche ods- Datei???

Vielen Dank für Dein Bemühen

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

Re: Dialog als Autostartmakro

Beitrag von Stephan »

und dann stand dort der Inhalt der Test.bat, nicht mehr und nicht weniger
der Inhalt steht dort weil das routinemäßig geschiet, Du kannst das unterdrücken indem Du an den Anfang der bat-DAtei ein:

Code: Alles auswählen

@echo off
schreibst. Siehe z.B.:
https://de.wikibooks.org/wiki/Batch-Pro ... fehle#ECHO
https://docs.microsoft.com/de-de/window ... mands/echo

Ob jenseits des Inhalts der bat noch mehr ins Fenster ausgegeben wird hängt hier davon ab ob in der bat ein Fehler ist, wenn nei dann kann auch keiner angezeigt werden.
Ein Fehler der hingegen erst bei OO selbst auftritt versteht sich nicht als Fehler der bat und wird deshalb nicht im cmd-Fenster wiedergegeben.


Gruß
Stephan
DITA
***
Beiträge: 91
Registriert: Fr, 16.11.2012 16:23

Re: Dialog als Autostartmakro

Beitrag von DITA »

Hallo balu,

hey, dass hört sich ja nicht so toll an, gesundheitlich mein ich, wünsche schon mal alles Gute, damit noch viele gute Tipps von Dir kommen können.

habe jetzt Deinen Beitrag mehrmals gelesen, und muss es wahrscheinlich auch noch ein paar mal, um es "richtig" verarbeiten zu können.

Also, wenn ich das jetzt richtig verstanden habe, bau ich mir eine "fast" leere ods-Datei mit einem Dialog, den ich "wie bisher" unter Anpassen - Dokument öffnen starte, verarbeite das eingegebene und starte verdeckt meine eigentliche Bearbeitungs-ods, die dann wiederum meine Dialog-ods schließt.

Dann werd ich das doch mal die nächste Zeit probieren.

Ich bedanke mich erst einmal, und wünsche nochmal Gute Besserung und Alles Gute

Gruss Dirk
DITA
***
Beiträge: 91
Registriert: Fr, 16.11.2012 16:23

Re: Dialog als Autostartmakro

Beitrag von DITA »

Hallo Stephan,

ich hatte das so ausführlich beschrieben, um evtl. daraus etwas deuten zu können.

Werde versuchen den bzw. die Tipps von balu umzusetzen, wenn die Dialogdatei "kleiner" ist, brauchts ja vielleicht nicht sooooo lange.

Ich danke Dir jedenfalls für Deine Mühen

Gruss Dirk
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Dialog als Autostartmakro

Beitrag von balu »

Halo Dirk,

danke für die Genesungswünsche.

Ja, ich geb zu das ich reichlich viel geschrieben habe, hatte aber auch viel gemacht und getestet. Und Du weisst ja, ich bin ne olle Quasselstrippe :lol:.
verarbeite das eingegebene und starte verdeckt meine eigentliche Bearbeitungs-ods
Ja so kann man es machen.
die dann wiederum meine Dialog-ods schließt.
Nein! So nicht!
Da ja Basic zeilenweise ein Makro-Code abarbeitet, bleibt das Makro an der Stelle stehen wo der Befehl für das öffnen der anderen Datei ist. Und wenn der "Ladevorgang" erledigt ist, läuft ja der Aufrufende Makro-Code weiter. Und an dieser Stelle könntest Du dann die Aufrufende Datei 'Dialog-ods' einfach selber direkt schließen lassen.

Das ganze jetzt mal vereinfacht dargestellt, der Reihe nach.
oDokDialog
Das ist die Variable für die 'Dialog-ods', die muss natürlich ganz zu anfang deklariert und defeniert werden. Also anstatt das Übliche
oDoc = This compo...
nimmst Du jetzt beispielsweise
oDokDialog = This compo...
oDokBearbeit = starDesktop.loadComponentfromURL(.....
Hiermit öffnest Du die 'Bearbeitungs-ods'. Und sie wird der Variablen oDokBearbeit zugeordnet. Das wäre jetzt auch die Stelle wo die andere Datei geöffnet wird, aber der Code erstmal nicht weiter verarbeitet wird.
Und wenn der "Ladevorgang" erledigt ist läuft ja auch der Code weiter.
Jetzt könntest Du beispielsweise im Dialog sagen, das die andere Datei geöffnet ist. Oder auch nicht.
Auf jeden Fall wäre jetzt der nächste Schritt in der 'Dialog-ods'
oDokDialog.close()
Fertig, das wars.
Hier noch mal der Ablauf der Reihe nach zusammengefasst.
oDokDialog = This compo...
oDokBearbeit = starDesktop.loadComponentfromURL(.....
oDokDialog.close()
Wohl bemerkt, das ist alles in der 'Dialog-ods'.

Du könntest aber auch den 'close'-Befehl in einer eigenständigen Sub stehen haben, die erst durch einen "Knopfdruck" im Dialog ausgeführt wird. Du könntest auch vor dem öffnen der anderen Datei den Dialog anders einfärben lassen, damit der Anwender sieht das seine Knopfdrück-Aktioin etwas bewirkt hat, und nach dem öffnen den Dialog wieder anders einfärben. Es gibt da schon so die ein oder andere Möglichkeit das ganze zu Gestalten.

Aber eine Sache wird nie und nimmer funktionieren, und das ist ein Fortschrittsbalken einzubauen der den Status des Öffnens wiedergibt. Denn während des öffnens werden keine weitere Aktionn vom Office ausgeführt. Dieser Balken würde nämlich dann einfach eingefrieren, was dann wieder für Verwirrung sorgen würde. Das jetzt nur der vollständigkeit wegen.

Wenn Du durch die 'Bearbeitungs-ods' die 'Dialog-ods' schließen willst, werden da ganz andere Probleme auf dich lauern. Denn die Dia... muss dann erstmal abfragen ob sie schon auf das Makro in der Bearb... zugreifen kann, das jetzt aber nur mal so als ein Beispiel. Und deshalb ist es besser und einfacher den Weg zu gehen den ich beschrieben habe.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Hiker
******
Beiträge: 590
Registriert: Mo, 08.09.2014 21:34
Wohnort: Berlin

Re: Dialog als Autostartmakro

Beitrag von Hiker »

Hallo,

ich finde das Thema Macro direkt starten ja durchaus spannend, aber wäre es für den genannten Zweck nicht zielführender ein erstes Tabellenblatt einzufügen, auf den in bester Windows-Manier steht:

Bitte schalten Sie den Computer nicht aus.
Ihr Programm wird noch geladen.


Denn eine zweite Datei zu erstellen die dann die Hauptdatei lädt nur damit man nicht sieht das die Hauptdatei lädt, verlängert effektiv den Ladeprozess und baut zwei neue Fehlerquellen ein: Existenz der Datei und passender Macrostart.

Alternativ sind dies Stellen, wo man sich fragen sollte, warum eigentlich ein Office-Paket als Entwicklungsumgebung dient. Eine klassische Compilersprache hat diese Schwierigkeiten nicht.

Mfg, Jörn
Libre Office 6.3.1 (Win 10 Pro) / Libre Office 6.0.7 (Win8.1 Pro, Win 7 Pro) / AOO (Win 7)
Antworten