Seite 1 von 1

Tabellendokument über macro schliessen

Verfasst: Sa, 18.07.2009 13:58
von Klemens77
Hallo Forum,

Zu dem Problem ein OO-Tabellendokument von einem Macro aus zu schliessen gibt es schon ein paar Beiträge. Jedoch kein funktionierendes workaround oder gar eine Lösung des Problems. Darum habe ich die Aufgabenstellung neu aufgerollt.

Das Problem:
in einem geöffneten Tabellendokument wird ein Makro abgearbeitet. Am Ende des Makros soll das Dokument geschlossen werden. z.b. mit

Code: Alles auswählen

ThisDocument.close(True)
Dies führt im allgemeinen zu Problemen. Bei mir meldet sich OO und kündigt eine Dokumentwiederherstellung an. Dies wurde in viewtopic.php?f=18&t=14677&p=59386&hilit=close#p59386 auch schon behandelt.
Die Lösung dort ist den soffice.bin Prozess via shell aubzuschiessen. z.b. über

Code: Alles auswählen

Shell("pkill soffice.bin")
das führt bei mir dazu, dass sämtliche andere oo-Dokumente die gerade geöffnet sind, alle abstürzen. Irgendwie ja klar :? , aber wie kann ich das verhindern?

Das Makro, dass bei mir Probleme verursacht sieht so aus:

Code: Alles auswählen

Sub main
   Dim Pfad as string
   Pfad = ThisComponent.getURL()
   ThisComponent.storeAsURL(Pfad, Array())
   wait 500
   ThisComponent.CurrentController.Frame.close(true) 
   Shell("pkill soffice.bin")
End Sub
ich verwende OO3.1 unter Ubuntu 8.04 (64bit)

Re: Tabellendokument über macro schliessen

Verfasst: Sa, 18.07.2009 15:00
von Stephan
Dies führt im allgemeinen zu Problemen.
schwer zu beurteilen ohne zu wissen wie ThisDocument genau belegt ist, was für Probleme auftreten und was für OOo-Prozesse im Hintergrund u.U. die Ausführung von .close blockieren
das führt bei mir dazu, dass sämtliche andere oo-Dokumente die gerade geöffnet sind, alle abstürzen. Irgendwie ja klar
es wird gewollt das Programm beendet, wenn Du per Code gewaltsam beendest mußt Du natürlich Nebeneffekte selbst auffangen
Das Makro, dass bei mir Probleme verursacht sieht so aus:
Und was erwartest Du wenn Du das Gesamtprogramm gewaltsam beendest? Ich erwarte nichts anderes als das sich alle Dokumente/Fenster schliessen. Genau das zu erreichen war aber auch Ziel des anderen Threads, denn dort steht ja abschliessend:
Einem close des Dokumentes, was ja auch OO beendet wird noch ein kill hinterhergeschossen.
und das ist ja quasi genau das Verhalten was zu erwarten ist, wenn das letzte Dokument mittels .close geschlossen wird schließt sich die komplette Anwendung. Das kill dient lediglich dazu um das 'nochmal' zu tun, weil es scheinbar mit .close nicht riichtig funktioniert, das jedoch kill nicht die gesamte Anwendung beendet (das was Du als 'Abstürzen aller Dokumente bezeichnest) ist doch genau das was es tun soll.


kurzum, ich würde in Problemfällen dieser Art auf jeden Fall einmal versuchen mit dem dispatcher zu arbeiten, da dieser gegenüber .close einige Probleme automatisch auffängt.
Also ungefähr:

Code: Alles auswählen

document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

dispatcher.executeDispatch(document, ".uno:CloseDoc", "", 0, Array())



Gruß
Stephan

Re: Tabellendokument über macro schliessen

Verfasst: Sa, 18.07.2009 15:02
von komma4
Du möchtest die geänderte Datei speichern und schliessen?

Code: Alles auswählen

With ThisComponent
 .store
 .close( FALSE )
End With
läuft hier ohne Probleme (Abstürze)

Re: Tabellendokument über macro schliessen

Verfasst: Sa, 29.08.2009 10:56
von Klemens77
Ich hatte das Problem jetzt ein bischen aus den Augen verloren, und meine Zugangsdaten musste ich auch erst wieder besorgen, also sorry, dass ich erst jetzt auf die antworten reagiere:

Ich fürchte ich habe mich da schlecht ausgedrückt. Ich hatte gehofft meine Probleme mit dem Macro nur kurz zu beschreiben, jetzt sehe ich aber, dass das so nicht geht.
Mein Macro soll folgendes machen
1) auf der Tabelle "Einstellungen" einen Dateipfad einlesen (Position 1,3)
2) öffnen der calc-Datei mit dem Namen (Gruppen.ods), welche sich im Dateipfad von 1) befindet
3) Inhalt der Gruppen.ods in ein Globales Feld schreiben, und Gruppen.ods danach schliessen
4) Dialog mit zwei Kombinationsfeldern öffnen
5) bei der Auswahl des ersten Kombinationfeldes (Hauptgruppe) die Auswahlmöglichkeiten des 2.Kombinationsfeldes aktualisieren (Nebengruppe)

die Datei Gruppe.ods hat dabei den Aufbau:
Hauptgruppe A, Nebengruppe A1, Nebengruppe A2, Nebengruppe A3, ....
Hauptgruppe B, Nebengruppe B1, Nebengruppe B2,...
Hauptgruppe C, ...

Mein Problem ist nun, dass bis zu Punkt 4) scheinbar alles klappt, aber wirklich nur scheinbar. Denn der Teil des Makros, der die Untergruppe aktualisieren soll, funzt nicht. Irgendwie funktioniert das schliessen der Gruppen.ods nicht. Und damit hängt dann alles. Ich kann die Gruppen.ods ja auch nicht via kill abschiessen, denn da schliesse ich mein macro genau so. Andererseits funktioniert alles, wenn ich die Tabelle "Gruppe" in die calc-DAtei stecke in der auch das Makro steht, ich also keine zusätzliche Datei öffnen muss. Das ist aber leider wichtig, dass die Gruppen in einer eigenen Datei stehen

HILFE! :(

nun der Code:

Code: Alles auswählen

OPTION EXPLICIT
Dim oHauptfenster as Object
Dim oFenster as Object
Dim TagBlatt as Object
Dim Einstellungsblatt as Object
Dim GruppenBlatt as Object
Dim aktuelleZeile as integer
Dim GruppenDaten(0 To 200, 0 To 200)

Sub Main
'   Hauptprogramm
   Dim EinstellungsDoc as Object
   Dim Einstellungspfad as string
   Dim Inhalt as string
   Dim PfadGruppendatei as string
   Dim oURLGruppe as string
   Dim n as integer
   Dim oGruppenDoc as object
   
   TagBlatt = ThisComponent.Sheets.getByName("TAG")
   Einstellungsblatt = ThisComponent.Sheets.getByName("Einstellungen")
   PfadGruppendatei = Einstellungsblatt.getCellByPosition(1,3).string & "/" & "Gruppen.ods"
   oURLGruppe = ConvertToURL(PfadGruppendatei)
   oGruppenDoc = starDeskTop.loadComponentFromURL(oURLGruppe, "_hidden", 0, Array())
   GruppenBlatt = oGruppenDoc.Sheets.getByName("Gruppe")
   
   aktuelleZeile=0
   Do
      aktuelleZeile = aktuelleZeile +1
      n=0
      Do
         n = n + 1
         GruppenDaten(n-1,aktuelleZeile-1)=GruppenBlatt.getCellByPosition(n-1,aktuelleZeile).string
      Loop Until GruppenBlatt.getCellByPosition(n-1,aktuelleZeile).string=""
   Loop Until GruppenBlatt.getCellByPosition(0,aktuelleZeile+1).string=""
   'schliessen der Gruppen Datei
   oGruppenDoc.close(false)

   'Hauptfenster laden
   Zeige_Hauptfenster
End Sub

Sub Zeige_Hauptfenster
   Dim oHauptgruppe, oUntergruppe as Object
   Dim nGruppe as integer
   Dim Gruppen as Object
   dim inhalt, sstring as string
   
   DialogLibraries.LoadLibrary("Standard")
   oHauptfenster = CreateUnoDialog(DialogLibraries.Standard.Aufruf)
   oHauptgruppe = oHauptfenster.getControl("HauptBox")
   oUntergruppe = oHauptfenster.getControl("UnterBox")
   oHauptgruppe.Text = "Hauptgruppe wählen"
   oUntergruppe.Text = ""
   nProjekt=0
   Do
      nGruppe = nGruppe + 1
      inhalt =  GrppenDaten(0,nGruppe-1)
      oHauptgruppe.AddItem(inhalt,nGruppe - 1)
      sstring=GruppenDaten(0,nGruppe)
   Loop until sstring=""
   oHauptfenster.execute
End Sub

Sub UnterGruppeAktualisieren
   Dim n, aktuelleGruppe as integer
   Dim oGruppe, oUntergruppe as Object
   Dim shalt as String
   Dim inhalt as string
   
   oHauptgruppe = oHauptfenster.getControl("HauptBox")
   oUntergruppe = oHauptfenster.getControl("UnterBox")
   aktuelleGruppe = 0
   if oHauptgruppe.Text="Hauptgruppe wählen" then
      'es wurde noch nichts gewählt, Unterliste löschen
      oUntergruppe.removeItems(0,oUntergruppe.itemCount)
   Else
      'Unterliste löschen
      oUntergruppe.removeItems(0,oUntergruppe.itemCount)
      'richtige Gruppe finden
      aktuelleGruppe = 0
      Do
         aktuelleGruppe = aktuelleGruppe +1
         inhalt = GruppenDaten(0,aktuelleGruppe-1)
      Loop Until (oHauptgruppe.Text=inhalt) OR (inhalt="")
      'Unterprojekte eintragen
      n=0
      Do
         n = n +1
         inhalt = GruppenDaten(n,aktuelleGruppe-1)
         shalt=GruppenDaten(n+1,aktuelleGruppe-1)
         oUntergruppe.AddItem(inhalt,n - 1)
      Loop Until shalt=""
      oUntergruppe.Text=oUntergruppe.model.StringItemList(0)
   End If
End  Sub