Formular schließen - Fehlermeldung -

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

Moderator: Moderatoren

yeti
*****
Beiträge: 324
Registriert: Mi, 20.10.2004 12:11
Wohnort: Emmendingen

Formular schließen - Fehlermeldung -

Beitrag von yeti »

Hi,

ich habe folgenden Code verwendet um ein Formular (OOo-Base) durch klick auf eine Schaltfläche zu schließen:

Code: Alles auswählen

Sub CloseForm
oDok = ThisComponent
oDok.close(true)
End Sub
Diesen Code habe ich einer Schaltfläche in dem Formular zugeordnet.
Öffne ich das Formular zur Bearbeitung von Daten und will es danach mit der erstellten Schaltfläche schließen, bekomme ich folgenden Fehler:

Bild

Kann mir da jemand einen Tip geben?

Vielen Dank im voraus,
Yeti
chrdz
**
Beiträge: 39
Registriert: Mi, 19.04.2006 11:57
Wohnort: Bayern

Beitrag von chrdz »

Hallo Yeti,

ich kann Deinen Fehler nicht richtig nachvollziehen. Allerdings benutze ich statt

Code: Alles auswählen

oDok = ThisComponent
eher

Code: Alles auswählen

oDok = Stardesktop.currentComponent
damit hatte ich bisher keine Probleme.

Gruß
Christian
Viele Wege führen zum Ziel, aber alle nach Rom.
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Kann mir da jemand einen Tip geben?


Du kannst das mittels Dispatcher versuchen:

Code: Alles auswählen

Sub CloseForm 
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:CloseDoc", "", 0, Array())
End Sub




Gruß
Stephan
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hallo Yeti,

hmm, ich denke, dein "Problem" ist vielfältiger. Welche OOo Version verwendest du? wo sit das Formular gespiechert? im Base-Container oder extern?
Folgendes:
mit "thisComponent" erhälst du in Base den Base-Container - nicht das aktuelle Formular. Wenn du diesen nun schließen möchtest, sollte eigentlich ein "Veto" des Controllers erscheinen - das geht nämlich nicht, solange ein Formular noch offen ist.
Deine Fehlermeldung hingegen gibt etwas völlig anderes wieder: Sie deutet darauf hin, dass die script.xlb oder scrpt.xlc Dateien beschädigt sind - da wäre dann "Handarbeit" angesagt.
Um dein Formular zu schliessen, benötgst du dieses Dokumenten-Objekt - und das ist Teil der Base-Datei (wenn dort gespeichert). Dann hilft dir "ThisComponent" wenig.

Hast du jedoch das Formular extern gespeichert, sollte dein Code funktionieren.

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
yeti
*****
Beiträge: 324
Registriert: Mi, 20.10.2004 12:11
Wohnort: Emmendingen

Beitrag von yeti »

Toxitom hat geschrieben:Welche OOo Version verwendest du? wo sit das Formular gespiechert? im Base-Container oder extern?
Hi Toxitom,

es "müsste" die 2.0.2er sein für Windows. Wobei ich auch am Notebook dran arbeite, da ist auf jeden Fall unter SUSE Linux 9.3 auch eine 2er.

Gespeichert ist das Formular direkt in Base.
Toxitom hat geschrieben: Folgendes:
mit "thisComponent" erhälst du in Base den Base-Container - nicht das aktuelle Formular. Wenn du diesen nun schließen möchtest, sollte eigentlich ein "Veto" des Controllers erscheinen - das geht nämlich nicht, solange ein Formular noch offen ist.
Deine Fehlermeldung hingegen gibt etwas völlig anderes wieder: Sie deutet darauf hin, dass die script.xlb oder scrpt.xlc Dateien beschädigt sind - da wäre dann "Handarbeit" angesagt.
Um dein Formular zu schliessen, benötgst du dieses Dokumenten-Objekt - und das ist Teil der Base-Datei (wenn dort gespeichert). Dann hilft dir "ThisComponent" wenig.
Hab grad nochmal probiert und ohne irgendeine Änderung kommt jetzt eine andere Fehlermeldung. Das Makro wird mir eingeblendet, markíert ist die Zeile:

oDoc.close(true)

und drunter kommt die Meldung:

BASIC Laufzeitfehler.
Es ist eine Exception aufgetreten
Type: com.sun.star.util.CloseVetoException.
Message: .

Ist es das, was Du mit "Veto" meinst?

Gruß Yeti
yeti
*****
Beiträge: 324
Registriert: Mi, 20.10.2004 12:11
Wohnort: Emmendingen

Beitrag von yeti »

Hä?

Was ist denn jetzt?

Ich hab ein bischen am Makro weitergemacht, "das Buch" hat mich dabei unterstützt. Folgender Code ist jetzt enthalten:

Code: Alles auswählen

Sub CloseForm
odoc = thisComponent
oForm = oDoc.drawpage.forms(0)
oForm.close(true)
End Sub
Jetzt kommt plötzlich diese Fehlermeldung:
Fehler beim Laden des BASIC des Dokuments Module1.xml:
Allgemeiner Fehler.
Allgemeiner Ein-/Ausgabefehler.

Was soll ich denn davon halten?

Die kommt jetzt übrigens auch schon, wenn ich nur das Makro bearbeiten will und auch wenn ich den alten Code wieder verwende... :?:

Edit:
Hab das MOdul 1 gelöscht und ein neues erstellt(Modul145) jetzt ist die Meldung wieder weg. Hab noch einen Fehler im Code entdeckt und korrigiert:

Code: Alles auswählen

Sub CloseForm
oDoc = thisComponent
oForm = oDoc.drawpage.forms(0)
oForm.close(true)
End Sub
Jetzt kommt gar keine Fehlermeldung mehr. Es passiert allerdings auch nichts, wenn ich die Schaltfläche betätige um das Makro auszuführen ;)

Ich will aber unbedingt das Formular schließen ;)
Will ja später auch Fomulare über Schaltflächen aufrufen... Also dranbleiben muss ich da schon ...

Vielen Dank im voraus,
Yeti
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hallo yeti,

Code: Alles auswählen

Sub CloseForm
odoc = thisComponent
oForm = oDoc.drawpage.forms(0)
oForm.close(true)
End Sub
Was willst du damit erreichen? Das Formular ist integraler Bestandteil des Dokumentes - das lässt sich nicht seperat schliessen???
Am Anfang wolltest du doch das Dokument schliessen -oder?

Frage: Warum willst du das Formular eigentlich im Base-Container belassen? exportiere es doch als eigenständiges Dokument - dann ist vieles einfacher :-)

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
yeti
*****
Beiträge: 324
Registriert: Mi, 20.10.2004 12:11
Wohnort: Emmendingen

Beitrag von yeti »

Hi Thomas,

ich will immer noch das Dokument schließen. Nur aus Deinem Beitrag
mit "thisComponent" erhälst du in Base den Base-Container - nicht das aktuelle Formular.
habe ich geschlossen, daß das so nicht geht. Hab ich wohl falsch verstanden...
Frage: Warum willst du das Formular eigentlich im Base-Container belassen? exportiere es doch als eigenständiges Dokument - dann ist vieles einfacher Smile
Ich dachte mir, daß eine Weitergabe der fertigen DB insgesamt als eine Art "Anwendung" einfacher sei. Ist dem nicht so? Was sollte denn dann "ausgelagert" werden? Tabellen und Abfragen kommen wohl direkt in den Base-Container. Formulare und Berichte raus?

Gruß Yeti
Antworten