Dokument per Makro schliessen

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Dokument per Makro schliessen

von steschu » Do, 28.04.2005 10:50

Also ich habe hier:
Windows XP SP2 / OOo 1.9.79
und der Absturz ist reproduzierbar.

Vielleicht kann ich es mal mit der Konfiguration SuSE 9.3 / OOo1.9.79 versuchen. Wird aber nicht gleich.

Also dann, immer weiter fragen.

Dispose()

von ykcim » Fr, 22.04.2005 12:52

Hallo,

leider kann ich das ganze nur mit einem klaren Jein kommentieren.

Ich habe diesen reproduzierbaren Absturz auch. Aber leider nicht bei allen
OO/SO Installationen.
Windows 98 / SO 7.0 SP1 geht es nicht
Windows 98 / OO 2.0 beta geht es nicht
Windows XP / SO 8.0 beta geht es nicht
Windows XP / SO 7.0 SP2 geht es
Windows XP / OO 1.9.69 geht es
Linux Suse 9.2 OO 1.1.3 geht es

Ich habe noch nicht herausbekommen in welchem Zusammenhang der Fehler auftritt. Nur das er, wenn er in einer Installation auftritt, immer reproduzierbar ist.

Sachdienliche Hinweise sind erwünscht.

mfg
Michael

Fehler in bei dispose() Aufruf in 2.0beta

von steschu » Fr, 22.04.2005 09:43

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ß

von Vanished » Mi, 12.01.2005 11:33

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

von Toxitom » Mi, 12.01.2005 11:28

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

von Vanished » Mi, 12.01.2005 11:09

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

von Vanished » Mi, 12.01.2005 11:08

wegen Verwechslung von Dialog und Dokument wegeditiert...

von Toxitom » Mi, 12.01.2005 10:40

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

von Vanished » Mi, 12.01.2005 10:12

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

von Toxitom » Mi, 12.01.2005 09:45

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

von Vanished » Mi, 12.01.2005 09:27

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...

von Toxitom » Mi, 12.01.2005 09:15

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

von Vanished » Mi, 12.01.2005 09:06

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

von Vanished » Mi, 12.01.2005 08:47

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.

von Toxitom » Mi, 12.01.2005 08:28

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

Nach oben