Schließen eines Formulars per Makro
Moderator: Moderatoren
-
- ***
- Beiträge: 88
- Registriert: Mi, 30.07.2003 18:06
- Wohnort: Wiesloch
Schließen eines Formulars per Makro
Hallo zusammen,
ich würde gerne ein baseinternes Formular mit einem Makro schließen (ohne das gefragt wird, ob der aktuell geänderte Datensatz gespeichert werden soll- er soll dabei nicht gespeichert werden). Ich habe es wie bei einem normalen Writerdokument mit ThisComponent.Close(true). Bei einem Writerdokument funktioniert das. Bei meinem Form öffnet sich aber einfach der Basiceditor, ohne das eine Fehlermeldung erscheint. Wenn ich dann den Editor und das Formular schließe stürzt Base ab.
Mit ThisComponent.dispose() stürzt Base zwar nicht ab, schließen tut das Fenster aber auch nicht!
Hat jemand ne Idee was ich falsch mache?
Gruß
Frank
ich würde gerne ein baseinternes Formular mit einem Makro schließen (ohne das gefragt wird, ob der aktuell geänderte Datensatz gespeichert werden soll- er soll dabei nicht gespeichert werden). Ich habe es wie bei einem normalen Writerdokument mit ThisComponent.Close(true). Bei einem Writerdokument funktioniert das. Bei meinem Form öffnet sich aber einfach der Basiceditor, ohne das eine Fehlermeldung erscheint. Wenn ich dann den Editor und das Formular schließe stürzt Base ab.
Mit ThisComponent.dispose() stürzt Base zwar nicht ab, schließen tut das Fenster aber auch nicht!
Hat jemand ne Idee was ich falsch mache?
Gruß
Frank
OOo 2.1 , Win XP
Hallo Frank,
versuche´s mal mit diesem Code
Gruss
Jörg
versuche´s mal mit diesem Code
Code: Alles auswählen
sub FormSchliessen
DIM i%
oForm=ThisComponent.drawpage.GetForms 'hier wird erst die Abfrage geschlossen
for i=0 to oForm.count-1
aktivForm=oForm.getByIndex(i)
aktivForm.ActiveConnection.close()
next
ThisComponent.Dispose 'hier wird das Formular ohne Abfrage und Speicherung geschlossen
End sub
Gruss
Jörg
Hey zusammen,
nur ein bischen was zur Erläuterung:
mit .dispose() wird ein Objekt im Hauptspeicher komplett "zerstört", also auch entfernt. Dies ist eine "sehr harte" Methode und in der Regel nicht notwendig, da OOo selbst für die bestmögliche Speicherverwaltung sorgt und nicht mehr benötigte Objekte bei Bedarf aus dem Speicher entfernt.
Dispose() sollte also eigentlich gar nicht verwendet werden, höchstens in Fällen, wo sonst nichts anderes mehr geht.
Die close() Methode (die wäre hier durchaus richtig!) beendet eine Applikation ordnungsgemäß, wobei sie nur dann beendet werden kann, wenn kein anderer Prozess "Widerspruch" einlegt, eine sogenannte CloseVetoException. Beim Formular ist das z.B. eine noch bestehende Datenverbindung. Die muss zuerst geschlossen werden, bevor der Close-Befehl auf das Dokument ausgeführt weren kann.
Mit dem Parameter "True" der Close-Methode wird die Verantwortung zum Schliessen des Dokumentes an den Prozess weitergegeben, der die CloseVetoException ausgelöst hat - das bedeutet, das Dokument beendet sich normalerweise, wenn der Prozess selbst beendet wird. Klappt aber nicht immer
Übergebt ihr "False", so müsst ihr selbst dafür sorgen, dass das Dokument ordnungsgemäß geschlossen wird, wenn der Prozess beendet ist. Das geht dann eigentlich nur mit entsprechenden Schleifen, die solangge laufen, bis kein "Veto" von anderen Prozessen mehr vorhanden ist.
Ich denke, die Lösung, zuerst die Datenverbindungen zu schliessen, ist schon sehr gut. Vielleicht reicht schon, ein kurzes wait() noch einzubauen, und dann das Dokument normal zu schliessen (mit close(true)).
Das wäre sicher besser, als mit Dispose das Objekt zu zerstören und dadurch eventuell noch laufende Prozesse "in der Lusft hängen zu lassen"
Viele Grüße
Thomas
nur ein bischen was zur Erläuterung:
mit .dispose() wird ein Objekt im Hauptspeicher komplett "zerstört", also auch entfernt. Dies ist eine "sehr harte" Methode und in der Regel nicht notwendig, da OOo selbst für die bestmögliche Speicherverwaltung sorgt und nicht mehr benötigte Objekte bei Bedarf aus dem Speicher entfernt.
Dispose() sollte also eigentlich gar nicht verwendet werden, höchstens in Fällen, wo sonst nichts anderes mehr geht.
Die close() Methode (die wäre hier durchaus richtig!) beendet eine Applikation ordnungsgemäß, wobei sie nur dann beendet werden kann, wenn kein anderer Prozess "Widerspruch" einlegt, eine sogenannte CloseVetoException. Beim Formular ist das z.B. eine noch bestehende Datenverbindung. Die muss zuerst geschlossen werden, bevor der Close-Befehl auf das Dokument ausgeführt weren kann.
Mit dem Parameter "True" der Close-Methode wird die Verantwortung zum Schliessen des Dokumentes an den Prozess weitergegeben, der die CloseVetoException ausgelöst hat - das bedeutet, das Dokument beendet sich normalerweise, wenn der Prozess selbst beendet wird. Klappt aber nicht immer

Übergebt ihr "False", so müsst ihr selbst dafür sorgen, dass das Dokument ordnungsgemäß geschlossen wird, wenn der Prozess beendet ist. Das geht dann eigentlich nur mit entsprechenden Schleifen, die solangge laufen, bis kein "Veto" von anderen Prozessen mehr vorhanden ist.
Ich denke, die Lösung, zuerst die Datenverbindungen zu schliessen, ist schon sehr gut. Vielleicht reicht schon, ein kurzes wait() noch einzubauen, und dann das Dokument normal zu schliessen (mit close(true)).
Das wäre sicher besser, als mit Dispose das Objekt zu zerstören und dadurch eventuell noch laufende Prozesse "in der Lusft hängen zu lassen"

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
-
- ***
- Beiträge: 88
- Registriert: Mi, 30.07.2003 18:06
- Wohnort: Wiesloch
Hallo Jörg,
Tut leider nicht. Der dispose Befehl bewirkt nichts. Ich hab mal versucht in der Schleife auch noch aktivForm.dispose auszuführen um auch das Formular zu schließen. Trotzdem gibt es beim schließen des Dokuments noch ein Veto.
Bei nicht in Base eingebundenen Formularen funktioniert übrigens auch "ThisComponent.close(true)"
Tut leider nicht. Der dispose Befehl bewirkt nichts. Ich hab mal versucht in der Schleife auch noch aktivForm.dispose auszuführen um auch das Formular zu schließen. Trotzdem gibt es beim schließen des Dokuments noch ein Veto.
Bei nicht in Base eingebundenen Formularen funktioniert übrigens auch "ThisComponent.close(true)"
OOo 2.1 , Win XP
Hallo Frank, Hallo Toxitom,
beide Methoden (close() und dispose()) haben bei mir den Nachteil, dass nach dem Schließen des Datenbankformulars und anschließendem Beenden von OO im Taskmanager (win98) ein Task "soffice" hängen bleibt. Beim runterfahren hängt WIN98 dann ganz, was dazu führt, dass ein scandisk beim nächsten Start durchlaufen wird.
Schon mal gehört oder ggf. eine Lösung hierfür?
Also irgendwas hängt hier... die Datenbankverbindung vorher zu schließen ist nicht der Weisheit letzter Schluss... oder braucht OO einfach mehr Zeit um alles (alle Prozesse) zu beenden????
Gruss
Jörg
beide Methoden (close() und dispose()) haben bei mir den Nachteil, dass nach dem Schließen des Datenbankformulars und anschließendem Beenden von OO im Taskmanager (win98) ein Task "soffice" hängen bleibt. Beim runterfahren hängt WIN98 dann ganz, was dazu führt, dass ein scandisk beim nächsten Start durchlaufen wird.
Schon mal gehört oder ggf. eine Lösung hierfür?
Also irgendwas hängt hier... die Datenbankverbindung vorher zu schließen ist nicht der Weisheit letzter Schluss... oder braucht OO einfach mehr Zeit um alles (alle Prozesse) zu beenden????
Gruss
Jörg
-
- ***
- Beiträge: 88
- Registriert: Mi, 30.07.2003 18:06
- Wohnort: Wiesloch
Hallo Jörg, hallo Toxitom,
das Makro von Jörg funktioniert mit einem externen Formular (Writerdatei, die ein, mit einer registrierten Datenbank verknüpftes, Form (ich verwende einfach mal Form für das Formular-Objekt, um es vom Formular in Base zu unterscheiden, das ja eigentlich ein Writerdokument ist, das ein Form enthält.) besitzt) wunderbar. Da funktioniert aber auch ThisComponent.close(true) allein. Problem gibt es nur, wenn ich ein in Base gespeichertes Formular schließen will. Dort funktioniert dann auch das Makro nicht.
Außerdem ist es keine gute Idee, die Connection des Form in Base zu schließen, da dann auch die Datenbankverbindung der kompletten Base Datei verloren geht und man Bas erst neue öffnen muss, bevor man wieder auf die Tabellen zugreifen kann.
Edit:
Ich habe mal meine Datenbank online gestellt, wenn ihr lust habt, könnt ihr ja mal reinschauen:
http://home.vrweb.de/~f.lauer/Downloads ... mlung1.odb
das Makro von Jörg funktioniert mit einem externen Formular (Writerdatei, die ein, mit einer registrierten Datenbank verknüpftes, Form (ich verwende einfach mal Form für das Formular-Objekt, um es vom Formular in Base zu unterscheiden, das ja eigentlich ein Writerdokument ist, das ein Form enthält.) besitzt) wunderbar. Da funktioniert aber auch ThisComponent.close(true) allein. Problem gibt es nur, wenn ich ein in Base gespeichertes Formular schließen will. Dort funktioniert dann auch das Makro nicht.
Außerdem ist es keine gute Idee, die Connection des Form in Base zu schließen, da dann auch die Datenbankverbindung der kompletten Base Datei verloren geht und man Bas erst neue öffnen muss, bevor man wieder auf die Tabellen zugreifen kann.
Edit:
Ich habe mal meine Datenbank online gestellt, wenn ihr lust habt, könnt ihr ja mal reinschauen:
http://home.vrweb.de/~f.lauer/Downloads ... mlung1.odb
OOo 2.1 , Win XP
Re: Schließen eines Formulars per Makro
Hallo Frank,
habe etwas gefunden, das bei mir funktioniert (OO 2.3.0)
Antwortmail ist also nicht mehr notwendig. Trotzdem Danke,
Gunnar
habe etwas gefunden, das bei mir funktioniert (OO 2.3.0)
Code: Alles auswählen
oFrame = thisComponent.CurrentController.getFrame() ' close Frame - a database form
oFrame.close(True)
Gunnar
-
- ***
- Beiträge: 88
- Registriert: Mi, 30.07.2003 18:06
- Wohnort: Wiesloch
Re: Schließen eines Formulars per Makro
Hallo gunman,
super, wie bist du darauf gekommen?
Gruß
Frank
super, wie bist du darauf gekommen?
Gruß
Frank
OOo 2.1 , Win XP
Re: Schließen eines Formulars per Makro
Tja,
leider habe ich von der Programmierung auch keine Ahnung. Aber da gibt es ja noch englische Foren.
http://www.oooforum.org/forum/viewtopic.phtml?t=33198
Gruß, Gunnar
leider habe ich von der Programmierung auch keine Ahnung. Aber da gibt es ja noch englische Foren.
http://www.oooforum.org/forum/viewtopic.phtml?t=33198
Gruß, Gunnar