Dokument per Makro schliessen

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

Moderator: Moderatoren

Vanished
**
Beiträge: 35
Registriert: Do, 23.12.2004 12:38

Dokument per Makro schliessen

Beitrag von Vanished »

Ich habe hier eine Tabelle, die über einen Dialog mit Daten gefüllt wird. Unter einer bestimmten Voraussetzung soll das Auslösen einer Schaltfläche im Dialog zu einer msgbox führen, der Dialog beendet und das Dokument geschlossen werden.
Eigentlich sollte das mit diesem Code funktionieren:

Code: Alles auswählen

sub cb6
msgbox ("irgendwas")
oDialog.endexecute()
ThisComponent.close(true)
End Sub
Jetzt kommt das eigentliche Problem: Starte ich den Dialog aus der Basic-IDE heraus und löse die Schaltfläche cb6 aus, funktioniert alles wunderbar. Starte ich den Dialog über ein in der Symbolleiste angelegtes Icon und löse die Schaltfläche aus, bekomme ich einen Laufzeitfehler:

Es ist eine Exception aufgetreten
Type: com.sun.star.util.CloseVetoException
Message: Controller disagree...

Was mache ich falsch?

Viele Grüße,
Vanished
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Vanished,
Was mache ich falsch?
Eigentlich nichts. Aber die Fehlermeldung sagt doch schon alles: Es gibt noch einen Prozess, der das Schliessen des Dokumnetes verhindert. Das kann beispielsweise eine noch nicht gespeicherte Änderung sein, ein noch offener Dialog oder irgend etwas anderes, das das Schliessen verhindert ( technisch gesehen : ein Listener widerspricht dem Schliessen-Wunsch).

Eine Lösung auf die Entfernung ist schwer zu sagen, da ich die Gesamtumstände nicht kenne. Vielleicht reicht eine kurze Wartezeit nach oDialog.endexecute(), soweit ich mich errinnere, liefert der auch einen Rückgabewert. Vielleicht diesen zunächst testen?

Eine andere Variante könnte auch sein, dass "ThisComponent" nicht richtig ist! Wenn die Schaltfläche in einer Sysmbolleiste untergebracht ist, so dürfte sich "ThisComponent" möglicherweise dann auf diese beziehen -> Hol dir vorher das Dokumenten-Objekt als Frame und versuch es noch einmal:

Code: Alles auswählen

oDoc = thisComponent.CurrentController.frame
Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hallo Vanished,

mir ist noch was eingefallen: Möglicherweise ist es gar nicht der Close() Befehl, der die Fehlermeldung produziert, sondern der oDialog.endexecute() ? Prüf das mal.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Vanished
**
Beiträge: 35
Registriert: Do, 23.12.2004 12:38

Beitrag von Vanished »

Toxitom hat geschrieben:Hey Vanished,
Was mache ich falsch?
Eigentlich nichts. Aber die Fehlermeldung sagt doch schon alles: Es gibt noch einen Prozess, der das Schliessen des Dokumnetes verhindert.
Das ist mir klar, aber welcher? Nochmal: Der einzige Unterschied in der Ausgangslage ist, dass der Dialog einmal aus der IDE aufgerufen wird (bei geöffnetem Dokument, versteht sich), beim anderen Mal aus der Symbolleiste der Anwendung (Tabelle).
Toxitom hat geschrieben:Eine Lösung auf die Entfernung ist schwer zu sagen, da ich die Gesamtumstände nicht kenne. Vielleicht reicht eine kurze Wartezeit nach oDialog.endexecute()
Hmmm, habe ich auch schon getestet. Wait 5000 hat jedenfalls nicht gereicht... Mehr noch, aus der IDE läßt sich das Dokument schliessen, ohne dass man vorher den Dialog beenden müßte, also ohne oDialog.endexecute() (wenn das auch keinen Sinn macht).
Toxitom hat geschrieben:soweit ich mich errinnere, liefert der auch einen Rückgabewert. Vielleicht diesen zunächst testen?
Wenn ich das versuche, bekomme ich nur eine leere Variable.
Toxitom hat geschrieben:Eine andere Variante könnte auch sein, dass "ThisComponent" nicht richtig ist! Wenn die Schaltfläche in einer Sysmbolleiste untergebracht ist, so dürfte sich "ThisComponent" möglicherweise dann auf diese beziehen -> Hol dir vorher das Dokumenten-Objekt als Frame und versuch es noch einmal:

Code: Alles auswählen

oDoc = thisComponent.CurrentController.frame
Das habe ich versucht - ohne Erfolg. Der Fehler tritt übrigens auch dann auf, wenn der Dialog über Extras->Makros->Makro->Ausführen gestartet wird.

Hast Du vielleicht sonst noch eine Idee?

Viele Grüße,
Vanished

Edit: Zu Deiner Ergänzung: Wenn alleine das Dokument geöffnet ist (die IDE nicht), öffnet sich beim Auslösen der Dialogschaltfläche cb6 die IDE, zeigt die Fehlermeldung an und markiert die Zeile "oDoc = thisComponent.CurrentController.frame", egal ob endexecute() vorher ausgeführt wird oder nicht. Ich habe es auch schon mit einem oDok.dispose() versucht - erfolglos.
Vanished
**
Beiträge: 35
Registriert: Do, 23.12.2004 12:38

Beitrag von Vanished »

Ich habe gerade noch einen einfachen kleinen Dialog getestet (eine Schaltfläche). Gleiches Ergebnis, sprich gleicher Fehler. Der Code:

Code: Alles auswählen

Dim oDialog as Object
Sub Dialog_starten
	DialogLibraries.LoadLibrary("Standard")
	oDialog=Createunodialog(dialogLibraries.Standard.Produkt)
	oDialog.execute()
	'oDialog.dispose()
End Sub

sub loeschen
	'oDialog.endexecute()
	thisComponent.CurrentController.frame.close(true)
End Sub
Das Ergebnis ist unabhängig davon, ob das dispose() bzw. endexecute() bzw. beides vorhanden ist, oder nicht.

Ich brings nicht hin.

Viele Grüße
Vanished
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Vanished,

na, dann probier mal die "harte" Methode! Diese reagiert nicht mehr auf Vetos und beendet "brutal":

Code: Alles auswählen

Dim oDialog as Object
Sub Dialog_starten
   DialogLibraries.LoadLibrary("Standard")
   oDialog=Createunodialog(dialogLibraries.Standard.Produkt)
   oDialog.execute()
End Sub

sub loeschen
   oDialog.endexecute()
   thisComponent.dispose()
End Sub
Sollte man zwar nicht einsetzen, wirkt aber meistens.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Vanished
**
Beiträge: 35
Registriert: Do, 23.12.2004 12:38

Beitrag von Vanished »

auf thisComponent.dispose() ist keine Reaktion festellbar. Weder im Testdialog, noch im "Original".

Viele Grüße,
Vanished

Edit: Keine Reaktion beim Start aus der Anwendung heraus versteht sich. Aus der IDE heraus wird mal wieder das Dokument beendet...
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hallo Vanished,

such mal wo ganz anders. ThisComponent liefert dir normalerweise die aktuelle Komponente - das ist meist das aktuelle Dokument, kann aber auch was anderes sein. Probier mal, den Code wie folgt zu ändern:

Code: Alles auswählen

Dim oDialog as Object
DIM oDoc as Object
Sub Dialog_starten
   oDoc = ThisComponent
   DialogLibraries.LoadLibrary("Standard")
   oDialog=Createunodialog(dialogLibraries.Standard.Produkt)
   oDialog.execute()
End Sub

sub loeschen
   oDialog.endexecute()
   oDoc.dispose()
End Sub
Wobei du vorher vielleicht mit close() arbeiten solltest.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Vanished
**
Beiträge: 35
Registriert: Do, 23.12.2004 12:38

Beitrag von Vanished »

Sorry, das hatte ich nicht erwähnt. Auf diese Art hatte ich zuerst angefangen, habe ich schon fast wieder verdrängt.

Keine Änderung des Verhaltens...

Viele Grüße,
Vanished
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Vanished.

bevor du verzwiefelst... noch eine Variante:

Code: Alles auswählen

Dim oDialog as Object
DIM oDoc as Object
Sub Dialog_starten
   on error resume next
   oDoc = ThisComponent
   DialogLibraries.LoadLibrary("Standard")
   oDialog=Createunodialog(dialogLibraries.Standard.Produkt)
   oDialog.execute()
   oDoc.close(true) 
End Sub

sub loeschen
   oDialog.endexecute()
End Sub
funktioniert bei mir einwandfrei.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Vanished
**
Beiträge: 35
Registriert: Do, 23.12.2004 12:38

Beitrag von Vanished »

wegen Verwechslung von Dialog und Dokument wegeditiert...
Zuletzt geändert von Vanished am Mi, 12.01.2005 11:10, insgesamt 1-mal geändert.
Vanished
**
Beiträge: 35
Registriert: Do, 23.12.2004 12:38

Beitrag von Vanished »

Eine schöne Idee. Damit schliesst sich das Dokument auch bei mir.

Aber: Leider keine benutzbare Lösung. Damit wird auch beim "normalen" schliessen des Dialoges das Dokument gleich mitgeschlossen, und das darf leider nicht...

Viele Grüße,
Vanished
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey,
Leider keine benutzbare Lösung. Damit wird auch beim "normalen" schliessen des Dialoges das Dokument gleich mitgeschlossen, und das darf leider nicht...
AHHH, jetzt kommen wir der Sache schon näher. Es gibt ncoh Nebenbedingungen. OK, aber das ist lösbar:

Code: Alles auswählen

Dim oDialog as Object
DIM oDoc as Object
DIM flag as boolean
Sub Dialog_starten
   flag = false
   oDoc = ThisComponent
   DialogLibraries.LoadLibrary("Standard")
   oDialog=Createunodialog(dialogLibraries.Standard.Produkt)
   oDialog.execute()
   if flag then oDoc.close(true)
End Sub

Sub loeschen()
    Flag = true
   oDialog.endexecute()
End Sub
Und wenn du mehr solcher Ereignisse brauchst, so nimm halt eine numerische Varaible und definiere deine Cases.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Vanished
**
Beiträge: 35
Registriert: Do, 23.12.2004 12:38

Beitrag von Vanished »

Zwei Dumme, ein Gedanke...

Hier meine Lösung:

Code: Alles auswählen

Dim oDok as Object
Dim oDialog as Object
Dim schliessen as Integer

Sub Dialog_starten
    on error resume next 
    oDok = ThisComponent 
    DialogLibraries.LoadLibrary("Standard") 
    oDialog=Createunodialog(dialogLibraries.Standard.Produkt) 
    oDialog.execute() 
	If schliessen = 9 then
 		oDok.close(true)
 	Else oDialog.dispose() 
	End if
End Sub

sub loeschen
	schliessen = 9
	oDialog.endexecute()
End sub
Vielen, vielen Dank für Deine Hilfe!!!

Viele Grüße,
Vanished
steschu
Beiträge: 2
Registriert: Di, 19.04.2005 14:13
Wohnort: Cottbus

Fehler in bei dispose() Aufruf in 2.0beta

Beitrag von steschu »

Hallo,

ich habe ein Makro geschrieben mit Fenster, und ein bisschen chic.

Wird der Dialog per:
oDialog.endexecute()
oDialog.dispose()

geschlossen (wie auf http://www.dannenhoefer.de/faqstarbasic ... ialog.html beschriben), kommt es zu einem reproduzierbaren Absturz von OOo.

Nur mal so als Bemerkung.

Vielen Gruß
Antworten