Seite 1 von 2
Dokument per Makro schliessen
Verfasst: Di, 11.01.2005 17:01
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
Verfasst: Mi, 12.01.2005 08:08
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:
Gruss
Thomas
Verfasst: Mi, 12.01.2005 08:28
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
Verfasst: Mi, 12.01.2005 08:47
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:
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.
Verfasst: Mi, 12.01.2005 09:06
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
Verfasst: Mi, 12.01.2005 09:15
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
Verfasst: Mi, 12.01.2005 09:27
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...
Verfasst: Mi, 12.01.2005 09:45
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
Verfasst: Mi, 12.01.2005 10:12
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
Verfasst: Mi, 12.01.2005 10:40
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
Verfasst: Mi, 12.01.2005 11:08
von Vanished
wegen Verwechslung von Dialog und Dokument wegeditiert...
Verfasst: Mi, 12.01.2005 11:09
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
Verfasst: Mi, 12.01.2005 11:28
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
Verfasst: Mi, 12.01.2005 11:33
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
Fehler in bei dispose() Aufruf in 2.0beta
Verfasst: Fr, 22.04.2005 09:43
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ß