Schließen eines Formulars per Makro

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Frank Lauer
***
Beiträge: 88
Registriert: Mi, 30.07.2003 18:06
Wohnort: Wiesloch

Schließen eines Formulars per Makro

Beitrag von Frank Lauer »

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
OOo 2.1 , Win XP
sarotti
****
Beiträge: 105
Registriert: So, 12.03.2006 17:40
Wohnort: Nähe Krefeld

Beitrag von sarotti »

Hallo Frank,

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
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Frank Lauer
***
Beiträge: 88
Registriert: Mi, 30.07.2003 18:06
Wohnort: Wiesloch

Beitrag von Frank Lauer »

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)"
OOo 2.1 , Win XP
sarotti
****
Beiträge: 105
Registriert: So, 12.03.2006 17:40
Wohnort: Nähe Krefeld

Beitrag von sarotti »

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
Frank Lauer
***
Beiträge: 88
Registriert: Mi, 30.07.2003 18:06
Wohnort: Wiesloch

Beitrag von Frank Lauer »

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
OOo 2.1 , Win XP
gunman
*
Beiträge: 16
Registriert: Fr, 15.12.2006 18:43

Re: Schließen eines Formulars per Makro

Beitrag von gunman »

Hallo Frank,

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) 
Antwortmail ist also nicht mehr notwendig. Trotzdem Danke,

Gunnar
Frank Lauer
***
Beiträge: 88
Registriert: Mi, 30.07.2003 18:06
Wohnort: Wiesloch

Re: Schließen eines Formulars per Makro

Beitrag von Frank Lauer »

Hallo gunman,

super, wie bist du darauf gekommen?

Gruß

Frank
OOo 2.1 , Win XP
gunman
*
Beiträge: 16
Registriert: Fr, 15.12.2006 18:43

Re: Schließen eines Formulars per Makro

Beitrag von gunman »

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
Antworten