Versionsabhängiges Einfrieren von LibreOffice nach Makrodurchlauf

KORREKTUR zu https://listarchives.libreoffice.org/de/users/msg21513.html

Da muss wohl beim Kopieren aus der Mail https://listarchives.libreoffice.org/de/users/msg21512.html irgend etwas in die Windows-Zwischenablage geraten sein.

Jetzt kommt kein Syntaxfehler mehr und LO stürzt auch nicht ab.

Jetzt bezüglich Zeile "oDlg = createUnoDialog(DialogLibraries.Standard.Dialog1)" die Fehlermeldung:

BASIC-Laufzeitfehler.
Eigenschaft oder Methode nicht gefunden: Dialog1

Da fehlt wohl ein "Dialog1". Woher nehmen wenn nicht stehlen ... jetzt mag ich nicht mehr mit meinem Makro-Dialog-Minimalwissen :-(( ...

Grüße
Hans-Werner ;-))

Gerhards Makro ( https://listarchives.libreoffice.org/de/users/msg21512.html ):

Option Explicit

Sub StartKopfzeile

dim oDlg as Object ' Dialogfenster

     DialogLibraries.LoadLibrary("Standard") 'auch ein fester Dialog bringt keine Änderung
     oDlg = createUnoDialog(DialogLibraries.Standard.Dialog1)
     oDlg.execute
End Sub

REM Aktion Pseudo-Kopfzeilen eintragen und formatieren
Sub btnStart_actionPerformed(oEvent2)

dim oDocC as Object
Dim sUrl as String
      sUrl = converttoUrl("E:\TMP\Kopfzeilen_Texte.ods") ' MODIFIZIERT !
     Dim zFileProperties() As New com.sun.star.beans.PropertyValue
         oDocC = StarDesktop.loadComponentFromURL(sURL, "_blank", 0, zFileProperties())
MsgBox("HALLO") ' MODIFIZIERT !
End Sub

Hallo Hans-Werner,

deine Mail hattee ich heute früh noch gelesen, mir war klar, dass hinter dem Syntaxfehler etwas anderes stecken müsse, das ist in x Tests bei mir durchgelaufen und stammt auch aus Jürgens Code (bis auf die Änderung von global zu dim, die schon Thomas angesprochen hat).
Der Dialog muss natürlich in jürgens Code fehlen, er hat ja den Dialog mit vielen Statements selbst generiert und musste zusätzlich Listener für seine Schaltflächen definieren und diese abfragen. Dafür gibt es manchmal Gründe, und auch er scheint einen triftigen Grund gehabt zu haben, aber meist ist es bequemer, den Dialog in der Basic-IDE zu designen und im Dokument zu speichern. Die Listener werden sicher auch dann gebraucht, bloß übernimmt das dann LibreOffice im Hintergrund, man muss nur bei Dialog beim gewünschten Ereignis das auszuführende Makro benennen.
Für unseren Zweck war mir ein möglichst kurzer Code wichtig, damit ein Entwickler nicht abgeschreckt wird.
Und ein Rückgriff auf Jürgens Dokument ist auch nicht notwendig, der Fehler tritt auch bei einem leeren Dokument auf, und auch, wenn man ein anderes LibO-Dokument statt seines Calc-Dokuments lädt.
Da mir daran liegt, dass jemand anders das auch mit meinem Beispiel bestätigt, bevor ich eine Bugmeldung aufmache, beschreibe ich dir die nötigen Aktionen, es geht ziemlich schnell, das sieht nur in der Beschreibung so groß aus.
Erzeuge ein neues Writer-Dokument (und speichere am besten gleich, dann hasst du später nich die Unterbrechung durch den Speichern-Dialog).
Lege einen Makro-Modul an: Extras -> Makros -> Makros verwalten -> LibreOffice Basic... -> im Explorer links deine Datei auswählen -> New (so steht's in meiner Version) oder Neu; dann wird dir Module1 als Name vorgeschlagen, für unseren Test brauchen wir keinen anderen. Nach Bestätigung erscheint die Basic-IDE, wo du den vollständigen Code durch meine Makros ersetzt (und am besten statt dem Xray irgendeine msgbox nimmst, das ist einfacher, da hast du recht).
Erzeuge den Dialog: Unten siehst du das Register "Module1". Rechtsklicke rechts davon, wähle Einfügen -> Basic-Dialog. Dann wird dir ein leerer Dialog angezeigt, Größe und Titel ist uns wurscht. Nun musst du wahrscheinlich die Symbolleiste Formular-Steuerelemente einblenden (du kannst sie dann gleich wieder ausblenden) und suchst dort das Symbol für Schaltfläche, irgendwie wohl ein Rechteck, aber das hängt vom Stil ab, der Tooltipp zeigt es dir aber, und klickst drauf.  Dann kannst du mit der Maus innerhalb der Dialogfläche ein Rechteck für die Schaltfläche aufziehen, Größe und Position sind irrelevant, auch der automatisch vergebene Name kann für unsern Zweck bleiben.
Nun fehlt nur noch die Verknüpfung des zweiten Makros mit dem Betätigen der Schaltfläche: Rechtsklick auf die gerade gezeichnete Schaltfläche -> Eigenschaften -> im linken Teilfenster: Register "Ereignisse" -> Schaltfläche mit den drei Punkten hinter dem Punkt "Aktion ausführen" betätigen -> Makro... -> bei "Bibliothek" dein Dokument auklappen, bis "Module1" erscheint, das anklicken -> rechts "btnStart_actionPerformed" anklicken. Dann OK und nochmal OK und speichern (das speichert den Dialog im Dokument und auch das Dokument selbst im Dateisystem).
Dann kannst du testen. Bei mir funktionierte alles, auch nach Schließen und Wiederöffnen von Libo, erst nach Runterfahren des Rechners und Wiederstarten tritt der Fehler auf und bleibt dann auch. Was zeigt, dass nicht etwas im Dokument durch das erstmalige Ausführen geändert wird, sondern irgendwas Vages, für mich nicht Erratbares im Zusammenspiel von BS, LibO und Dokument passiert.
Wenn ich das Dokument anschließend mit 5.3.3.1 öffne, läuft weiterhin alles durch, mit 6.0.7.3 nicht; dazwischen habe ich derzeit keine Version installiert. Das deckt sich mit Jürgens Feststellung, dass sein Makro früher lief, wiewohl nicht exakt mit seiner Angabe, aber darauf kommt es ja nicht an, wichtig ist, dass da was passiert ist, was diesen Nebeneffekt hat. Ich werde das in nächster Zeit eingrenzen.

Grüße

Gerhard

Guten Morgen Gerhard,

erst mal ganz herzlichen Dank für Dein ausführliches Dialog-Anlegen-Tutorial :-)) !!!

Das habe ich, denke ich mal, hinbekommen.

Zusätzlich habe ich noch 2 Dinge gemacht:

[1] Via [Extras] > [Anpassen "Ereignisse"] > [Dokument öffnen] > [Makro]: Dokument öffnen * Standard.Module.StartKopfzeile] das Dokument so "eingestellt", dass beim Öffnen direkt der Dialog mit der Schaltfläche "CommandButton1" angezeigt wird.

[2] In "Sub btnStart_actionPerformed(oEvent2)" wird eine neue CALC-Datei geöffnet. Sollte eigentlich keinen Unterschied machen, ob man eine bestehende oder eine neue CALC-Datei öffnet.

Dein von mir modifiziertes Makro schaut nun so aus:

Option Explicit

Sub StartKopfzeile
Dim oDlg as Object
DialogLibraries.LoadLibrary("Standard")
oDlg = createUnoDialog(DialogLibraries.Standard.Dialog1)
oDlg.execute
End Sub

Sub btnStart_actionPerformed(oEvent2)
Dim PV() As New com.sun.star.beans.PropertyValue
StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank",0,PV())
MsgBox("Last line of ""Sub btnStart_actionPerformed"" ...")
End Sub

Ich hoffe, das geht so in Ordnung, und ich habe nichts "verschlimmbessert" durch meine (Mini-) Modifikationen Deines Makros oder etwas entfernt, wodurch Deine Test-Ergebnisse verändert würden.

Test-Ergebnis: Läuft wir geschmiert (LO 6.2.2.2 (x64) @ Windows 7 Home Premium 64-bit) - auch wenn ich den PC neu gestartet habe.

Aber ich kann ja viel behaupten, deshalb hier der DownloadLink von "TestDialog.odt": https://www.magentacloud.de/share/npm0d3-mxx

Viele Grüße
Hans-Werner

------ Originalnachricht ------

Hallo Hans-Werner,

wenn du die Bedingungen änderst, testest du aber etwas anderes! Schon nur "zusätzlich" müsste man genau anschauen, aber du hast "stattdessen" gemacht":
Gerade an der kniffligen Stelle, wo wir schon wissen, dass es mit dem direkten Aufruf des Makro geht, aber nicht mit dessen Aufruf per Schaltfläche, hast du eine dritte Variante getestet. Das ist ja nun nicht per se falsch, man muss sich halt nur im Klaren sein, dass es etwas anderes ist.
Dass deine Variante durchläuft, sagt ja jetzt nichts über meinen Fall: ich habe bei deiner Datei die Schaltfläche ergänzt und den Aufruf dorthin gelegt, und schon bleibt LibO wieder stecken. Der Aufruf über das Dokumentereignis ist entweder dem direkten Aufruf ähnlicher, oder das Problem hängt nicht prinzipiell am Aufruf von einer Schaltfläche aus, sondern vielleicht, wie Jürgen wohl getestet hat, speziell am Ereignis "Aktion auslösen" (was es ja auch beim Dokument logischerweise nicht gibt).
Und zweitens hast du _gleichzeitig_ eine zweite Änderung gemacht, was auch nicht zu empfehlen ist, wenn man ein Problem lokalisieren will. Die Idee mit einer leeren Datei ist mir gestern beim Einschlafen auch gekommen, weil mich die zweite Datei gestört hat, man kann das so schlecht als Beispiel zur Verfügung stellen. Schön, dass du das schon probiert hast, ich habe es nachvollzogen, in diesem Fall sind die Reaktionen offenbar identisch, ob es nun eine bestehende oder neue Datei ist.

Jetzt warte ich mal auf Jürgens Bug-Report und die Reaktion darauf.

Viele Grüße

Gerhard

Hallo Gerhard,

das mit dem "Aufruf über das Dokumentereignis" war (m)eine Notlösung. Ich habe mich genau an Deine Anweisungen gehalten, hat auch alles geklappt, aber nur eines nicht: Dass der Dialog mit der Schaltfläche im WRITER-Dokument erscheint. Im Moment weiß ich noch nicht, was ich falsch mache:

"[...] bis "Module1" erscheint, das anklicken -> rechts "btnStart_actionPerformed" anklicken. Dann OK und nochmal OK und speichern (das speichert den Dialog im Dokument und auch das Dokument selbst im Dateisystem). [...]".

Mein Problem ist, dass ich das zweite "OK" nicht finde - daran wird es wohl liegen ...

Grüße
Hans-Werner

------ Originalnachricht ------

Hallo,

Info Bugreport Libo friert ein bei Button-Event "Aktion bestätigen":
https://bugs.documentfoundation.org/show_bug.cgi?id=124628

Viele Grüße

Jürgen

Hallo,

hier ist meine neueste Programmversion downloadbar:
https://c.web.de/@693152299987503749/TEUWlWI8QO-qH48WLyv5Vw

@Hans-Werner
Ich habe mir Deinen sehr interessanten Code angesehen und ausprobiert.
Erst war ich von Deinem Programmierstil etwas verwirrt.
Meine kleinen grauen Zellen konnten aber alles entschlüsseln.

Deine Schleife zum Schreiben und Löschen der Texte ist sehr interessant.
Da aber ggf. noch einige Erweiterungen für mein Programm anstehen, kann
ich diesen Schleifenaufbau so nicht nutzen. Für Schreiben und Löschen
brauche ich für zukünftige Erweiterungen zwei getrennte Routinen.

Besonders schön finde ich die Hilfe.
Den Textaufbau habe ich gleich in meine neue Version eingebaut.

@Alle
Meine Kommentare im Code sind u.U. nicht immer professionell,
aber hoffentlich ausreichend verständlich.
Bin halt nur ein Autodidakt und sonstige Kritik nehme ich auch gerne
entgegen.
Man lernt halt nie aus :slight_smile:

Im Dokument habe ich zu meinem Hauptprogramm noch ein Modul
mit dem Namen "xBackUp" abgespeichert. Dieses soll ein kleines Dankeschön
für Eure vielfältige Hilfe und Arbeit sein. Vielleicht habt Ihr Euch
selbst schon so etwas
programmiert, wenn nicht wünsche ich Euch viel Erfolg damit.
Weitere Informationen stehen in den Code-Kommentaren.

Viele Grüße

Jürgen