Problem beim schließen eines oooDokumentes über makro

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

Moderator: Moderatoren

sheepy007
**
Beiträge: 20
Registriert: Di, 02.01.2007 13:13

Problem beim schließen eines oooDokumentes über makro

Beitrag von sheepy007 »

Guten Abendm
ich habe zur zeit ein großes Problem mit dem Beenden eines Dokumentes.

Das Makro:

Code: Alles auswählen

thisComponent.close(false)
Wenn ich das Makro aus dem Basic Editor herraus starte, wird ooo Ordnungsgemäß beendet.
Aber wenn ich das Makro einer Schaltfläche meines Dialoges zuweiße, bekomme ich folgende Fehlermeldung:
"Es ist eine Exception aufgetreten
Type: com.sun.star.util.ColseVetoException
Mesage: Controller disagree"

Der Dialog wird natürlich vor Programmende geschlossen.
Hoffe ihr könnt mir weiterhelfen

mfg sHeepy
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Beitrag von komma4 »

Du hast "ThisComponent" geändert und nicht gesichert?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
sheepy007
**
Beiträge: 20
Registriert: Di, 02.01.2007 13:13

Beitrag von sheepy007 »

doch doch gespeichert wird das dokument vorher immer...also kanns daran nicht liegen oder?
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Sheepy,

wieso verwendest du "false" als Parameter? Das bedeutet, dass wenn ein "Veto" eines anderen Prozesses eingelegt wird, die Kontrolle an Dich zurückgegeben wird und das Dokument von dir geschlossen werden muss - das heisst, du musst die Fehler abfangen, die laufenden Prozesse beenden und das Dokument erneut schleissen.

Üblich ist "true", dann wird die Kontrolle an den "Veto"-Prozess abgegeben und der kümmert sich um das Schliessen des Dokumentes. Und das klappt dann meist automatisch...

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
sheepy007
**
Beiträge: 20
Registriert: Di, 02.01.2007 13:13

Beitrag von sheepy007 »

tjoa mit "true" hab ich es anfangs ja auch probiert...aber vergebens tritt genau das gleiche Problem auf
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Beitrag von komma4 »

sheepy007 hat geschrieben: gespeichert wird das dokument vorher immer
Wie? Zeigst Du uns Code?

Anders gefragt: bist Du Dir sicher, dass das Speichern des zu schliessenden Objekts geklappt hat?

Code: Alles auswählen

if ( ThisComponent.isModified() ) then
	msgbox "Änderung entdeckt"
end if
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
sheepy007
**
Beiträge: 20
Registriert: Di, 02.01.2007 13:13

Beitrag von sheepy007 »

komma4 hat geschrieben:
sheepy007 hat geschrieben: gespeichert wird das dokument vorher immer
Anders gefragt: bist Du Dir sicher, dass das Speichern des zu schliessenden Objekts geklappt hat?
Ja bin mir sicher, sonst würden die Änderungen ja beim neuaufruf des Programmes nicht mher vorhanden sein oder? ;-)
Hier der Komplette auszug meines "schließen"Unterprgrammes

Code: Alles auswählen

Sub Hauptprogramm_DialogBeenden 'Beendet den Dialog Hauptprogramm
	oDialog.endExecute() '(oDialog wurde bereits am Anfang des Makros deklariert)
	thisComponent.store()
	thisComponent.dispose(true)
End Sub
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Sheepy,

also, das wird so nicht funktionieren.
1. Dispose() benötigt keinen Parameter und ist ein "ganz" hartes Entfernen des Objektes aus dem Speicher. Solltest du generell vermeiden - die Verwaltung macht OOo i.d.R intern.
2. Mit store() rufst du die interne Speicherroutine auf - das Dokument kann nicht beendet werden, bevor dieser Vorgang abgeschlossen ist. Andererseits laüft das Makro direkt weiter. Ob die 1 Sekunde ausreicht, das Dokument komplett zu speichern, kann ich schlecht sagen.

Ich würde hier mal "thisComponent.close(true)" verwenden. Das gibt die Kontrolle an den Speicherprozess weiter und dieser würed - anch dem Speichern - das Dokument schliessen.

Was natürlcih fehlt: Was gibt es denn sonst noch für Code-Teile? Deine erste Zeile (oDialog.endExecute() ) gibt die Kontrolle ja zunächst an das Makro zurück, das den Dialog aufgerufen hat - Zeile oDialog.execute(). Das wird nun zunächst dort weiter ausgeführt - und erst wenn das fertig ist, geht es hier weiter. Wer weiss, was dort noch steht?

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
sheepy007
**
Beiträge: 20
Registriert: Di, 02.01.2007 13:13

Beitrag von sheepy007 »

oDialog.endExecute() bedeutet doch, dass er den Dialog schließen soll oder?

oDialog ist wie folgt deklariert:

Code: Alles auswählen

oDialog= CreateUnoDialog(DialogLibraries.Dialoge.Hauptprog)
aber den Dialog schließt das Programm ja Ordnungsgemäß nur das Open Office Programm selbst nicht. Ich habe nun auch mal den speicher befehl herrausgenommen...es kommt trotzdem noch die gleiche Fehlermeldung :(
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Sheepy,
oDialog.endExecute() bedeutet doch, dass er den Dialog schließen soll oder?
Fast. Es bedeutet, dass der Dialog beendet werden soll. Das geht natürlich auch nur, wenn nicht noch andere Prozesse den Dialog "am Leben erhalten". Tritt der Fehler denn hier auf? Wenn die Fehlermeldung kommt, ist in der Regel auch die betreffende Zeile im Makro-Code markiert.
....es kommt trotzdem noch die gleiche Fehlermeldung
Ist vielleicht noch ein Dialog offen? Irgend ein anderer?

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
sheepy007
**
Beiträge: 20
Registriert: Di, 02.01.2007 13:13

Beitrag von sheepy007 »

ja wie bereits ganz am anfang geschrieben handelt es sich nur um die Funktion "thisComponent.close(true)",welchen Basic nicht verarbeiten möchte. Und wie erwähnt, kommt dieser Fehler nur wenn mein Dialog aus Calc selbst aufgerufen wir.
Starte ich mein Basic Programm von dem "Makro" Editor aus, beendet er alles ohne Probleme

mfg sHeepy
Antworten