Tabellendokument über Dialog schliessen

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

Moderator: Moderatoren

Klemens77
Beiträge: 5
Registriert: Sa, 18.07.2009 13:06
Wohnort: Wien

Tabellendokument über Dialog schliessen

Beitrag von Klemens77 »

Liebes Forum,

Ich hatte das Problem schon vor einiger Zeit einmal behandelt. Leider hatte ich mir damals nicht die Zeit für ein Minimalbeispiel genommen. Das hole ich hiermit nach:

Die Problemstellung:
1) Das Tabellendokument wird geöffnet
2) Es erscheint sofort nach dem öffnen (Makro Fensterstart ist Ereignisgesteuert) ein Dialogfenster
3) Auf dem Dialogfenster (Dia) gibt es nur einen Knopf
4) Bei der Betätigung des Knopfs wird das Tabellendokument gespeichert und anschließend geschlossen
Fertig

Nun der Code im Modul [Test.ods].Standard des Tabellendokuments Test.ods

Code: Alles auswählen

OPTION EXPLICIT
Dim ODia as Object

Sub Knopfdrueck
Dim Pfad as string
   Pfad = ThisComponent.getURL()
   ODia.endExecute()
   ThisComponent.storeAsURL(Pfad, Array())
   ThisComponent.close(True)   
End Sub

Sub Fensterstart
   DialogLibraries.LoadLibrary("Standard")
   ODia = CreatUnoDialog(DialogLibraries.Standard.Dia)
   ODia.execute
End Sub
Das Problem:
Beim öffnen des Dokument wird der Dialog Fehlerfrei geöffnet. Klickt man jedoch auf den Knopf im Dialogfenster (der natürlich mit dem Makro Knopfdrueck verknüft sein muss) so wird das Dokument zuerst geschlossen, und anschließend erscheint sofort ein Fenster von OpenOffice.org Dokumentwiederherstellung, da das Dokument angeblich abgestürzt sei und daher wieder hergestellt werden müsste.

Nun das Lustige:
Führt man das Makro Fensterstart nicht automatisch (also Ereignisgesteuert) aus, sonder per Hand, so funktioniert alles perfekt.

Mir ist klar, dass das Programm so wenig Sinn macht, aber wie oben geschrieben handelt es sich hier um ein Minimalbeispiel.
Selbst nach eifriger Recherche in diversen Foren und Büchern konnte ich bisher keine Lösung finden.

Ich bitte verzweifelt um Mithilfe.
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Tabellendokument über Dialog schliessen

Beitrag von DPunch »

Aloha

Das Ausführen eines Dialogs unterbricht z.B. laufende OOo-Basic-Prozeduren, möglicherweise verursacht das den Fehler?
Du könntest mal probieren, ob statt dem ".execute" nicht ein ".Visible = True" und dem ".endExecute" ein ".Visible = False" auch seinen Zweck erfüllt.
Im Zweifelsfall ein paar Sekunden warten, bevor Du den Button betätigst.

Ansonsten kenne ich die Hintergründe natürlich nicht:
warum öffnest Du ein Dokument, um es direkt wieder zu schliessen?
Klemens77
Beiträge: 5
Registriert: Sa, 18.07.2009 13:06
Wohnort: Wien

Re: Tabellendokument über Dialog schliessen

Beitrag von Klemens77 »

Hallo DPunch,

Erstmal Danke für Deine Antwort. Diese Woche war ein wenig stressig bei mir, deshalb entschuldige bitte die späte Antwort.

Voller Hoffnung klopfte ich die

Code: Alles auswählen

.Visible = True
und

Code: Alles auswählen

.Visible = False
rein, aber leider
Pusteblume.
Nun öffnet der Dialog nicht.
Deinen anderen Hinweis habe ich leider nicht genau verstanden. Meinst Du, dass ich vor dem

Code: Alles auswählen

 ThisComponent.close(True) 
ein bisschen warten soll?

bin mir nicht sicher was es bringen soll, werde es aber noch ausprobieren.

Bin also bisher leider noch nicht zu einer Lösung gekommen.
Um Deine Frage bezüglich dem Sinn des Makros zu beantworten: es ist ein Minimalbeispiel, hat also für sich alleine gesehen keinen Sinn, sondern zeigt nur genau das Problem, dass ich habe. Sollte Interesse am großen Ganzen bestehen werde ich gegebenen Falls gerne etwas posten.

so long
Klemens
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Tabellendokument über Dialog schliessen

Beitrag von DPunch »

Aloha

Der Vorschlag mit dem ".Visible" war mehr oder weniger überflüssig, weil diese Einstellung nur gilt, solange die Basic-Prozedur läuft (mit ".Visible" läuft die Prozedur aber einfach weiter, im Gegensatz zu ".Execute", wo die Prozedur an dieser Stelle komplett angehalten wird), so dass der Dialog sofort mit dem Erreichen des Endes der Prozedur wieder verschwindet.
Als letzte Anweisung einer Prozedur kann das natürlich nichts produktives bewirken.

Das nur kurz dazu.

Dein Problem ist, dass dass Du zu dem Zeitpunkt, wo Du das Dokument schliessst, noch in der Event-Behandlung des Button-Klicks bist.
Der Dialog wird tatsächlich erst nach dem Abschluss der Prozedur geschlossen, Du schliesst aber schon vorher das Dokument, was den Crash verursacht (access violation 0xc0000005, normalerweise fehlerhafter Zugriff auf den Arbeitsspeicher, in diesem Fall vermutlich daraus resultierend, dass mit dem Schliessen des Dokuments Speicheradressen freigegeben werden, die beim endgültigen Schliessen des Dialogs nochmal angesprochen werden).

Langer Rede kurzer Sinn: über den Rückgabewert des Dialogs kannst Du das Problem beheben:

Code: Alles auswählen

Sub Fensterstart
   DialogLibraries.LoadLibrary("Standard")
   ODia = CreatUnoDialog(DialogLibraries.Standard.Dia)
   nDialogResult = ODia.execute 'Bei Klick auf OK 1, ansonsten 0
   If nDialogResult = 1 Then
     Pfad = ThisComponent.getURL()
     ThisComponent.storeAsURL(Pfad, Array())
     ThisComponent.close(True)  
   End If
End Sub
Du musst nur den entsprechenden Button im Dialog zur "OK"-Schaltfläche machen und den vorherigen Event vom Button entfernen.
Klemens77
Beiträge: 5
Registriert: Sa, 18.07.2009 13:06
Wohnort: Wien

Re: Tabellendokument über Dialog schliessen

Beitrag von Klemens77 »

Der Schlüssel zum Erfolg.

Ja manchmal muss man die Artikel eben zweimal lesen. Ich muss ehrlich zugeben, dass ich den Hinweis auf die IF-Schleife und dem zurückgeben einer 1 des Dialogs nicht direkt umsetzten kann, weil ich bisher nicht mit Rückgabewerten von Dialogen gearbeitet habe. Aber der Satz
Dein Problem ist, dass dass Du zu dem Zeitpunkt, wo Du das Dokument schliessst, noch in der Event-Behandlung des Button-Klicks bist.
bracht mir die Lösung.

Es war mir einfach nicht klar, dass der Calc beim aufrufen des Dialogs einfach im Makro stehen bleibt. Ich habe diesen Effekt nun ausgenutzt und gleich nachher den close-Befehl angehängt. Das ganze funktioniert nun so wie ich das wollte und sieht so aus:

Code: Alles auswählen

OPTION EXPLICIT
Dim ODia as Object

Sub Knopfdrueck
   Dim Pfad as string
   Pfad = ThisComponent.getURL()
   ThisComponent.storeAsURL(Pfad, Array())
   ODia.EndExecute()
End Sub

Sub Fensterauf
  DialogLibraries.LoadLibrary("Standard")
  ODia= CreateUnoDialog(DialogLibraries.Standard.Dia)
  ODia.Execute()
  wait 100
  ThisComponent.close(True)
End Sub
Zur Info, das ganze ist ein Teil einer Projektbezogenen Arbeitzeiterfassung. Mir ist klar, dass es da eigentlich einiges aus der Linuxwelt gibt (mir fallen allein schon 3 Programme auf Gnome ein) aber ich wollte was einfaches, Plattformunabhängiges und das Ergebnis soll eine einfache Tabellenkalkulationsliste sein.
Wen das Programm interessiert lasse ich es gerne zukommen. Einfach eine Nachricht an PN.

Danke DPunch!
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Tabellendokument über Dialog schliessen

Beitrag von DPunch »

Aloha
Klemens77 hat geschrieben:die IF-Schleife
Lass bloss keinen besserwisserischen verbissenen Programmierer von diesem Phänomen hören ;)
dem zurückgeben einer 1 des Dialogs nicht direkt umsetzten kann, weil ich bisher nicht mit Rückgabewerten von Dialogen gearbeitet habe.
Das Prinzip ist einfach:
ein Dialog liefert immer einen Wert zurück, nachdem er geschlossen wurde, abhängig davon, wie er geschlossen wurde.
Für diesen Zweck gibt es vorgefertigte Schaltflächen - ein "Abbrechen" (oder auch das Schliessen mittels des kleinen "x" rechts oben) z.B. bewirkt immer eine 0, ein "OK" immer eine 1.
Die gewünschten Buttons musst Du nur im Dialog-Editor über die Eigenschaft "Art der Schaltfläche" ihrer Bestimmung zuführen.

Mit Deinem jetzigen Code wird z.B. das Dokument immer geschlossen, nachdem der Dialog beendet wurde (egal wie).
D.h. Du hast nicht einfach mal so die Möglichkeit, im Dokument was nachzuschauen o.Ä., da der Dialog beim Öffnen des Dokuments erscheint und nach dem Schliessen des Dialogs immer sofort das Dokument geschlossen wird.
In Deinem konkreten Fall mag das kein Problem oder sogar wünschenswert sein, aber ich persönlich würde immer auch eine Möglichkeit offen lassen, einen Vorgang abzubrechen - wer weiss, wann diese Möglichkeit mal nützlich sein kann ;)
guenther
*
Beiträge: 19
Registriert: Mo, 26.04.2010 07:11

Re: Tabellendokument über Dialog schliessen

Beitrag von guenther »

falls dein problem noch nicht gelöst ist.

habe das mit dem schliessen probiert

schau dir Bsp02.odb, frm_OpenCloseForm auf http://members.aon.at/schardinger/openoffice/index.html

servus, guenther

ps: oo gefällt mir immer besser
Antworten