OpenOffice Dokument öffnen usw.

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

Moderator: Moderatoren

$ilent$nooc
*
Beiträge: 10
Registriert: Di, 22.08.2006 14:50

OpenOffice Dokument öffnen usw.

Beitrag von $ilent$nooc »

hallo leute!

also das öffnen einer datei ist nicht mein problem! weder das abspeichern noch das schließen macht probleme!

aber:
wenn ich ein dokument öffne (bsp: calc oder writer datei) es abspeichern lasse, und gleich danach schließe, dann bekomme ich eine fehlermeldung seitns open office!
'Durch einen unerwarteten Fehler ist OpenOffice abgestürzt'
ich vermute dass die methode 'storeToURL' noch ein paar events im hintergrund hat, die nicht zum zug kommen, und durch .close() gekillt werden!

wie kann ich es machen dass mein programm wartet bis die methode 'storeToURL' abgelaufen ist, und alles korrekt erledigt hat, bevor die close anweisung alles beendet?

hier noch mein code:

Code: Alles auswählen

Private Sub OpenOpenOffice()

Dim oSM                    
Dim oDesk As Object
Dim oDoc As Object         
Dim arg()                   
    
On Error GoTo Failed
    
    ' Instanciate OOo : this line is mandatory with VB for OOo API
Set oSM = CreateObject("com.sun.star.ServiceManager")
    'Create the first and most important service
Set oDesk = oSM.createInstance("com.sun.star.frame.Desktop")
    
    ' Open an existing doc 
Set oDoc = oDesk.loadComponentFromURL("file:///c:/test/test2.odt", "_blank", 0, arg())

    ' Save the doc
Call oDoc.storeToURL("file:///c:/test/test2.odt", arg())

    ' Close the doc
oDoc.Close (True)
Set oDoc = Nothing

Exit Sub

Failed:
  MsgBox (Err.Description)
  
End Sub ' OpenOpenOffice()

PS: mit DoEvents hab ich es schon versucht!
ehvbs
*
Beiträge: 10
Registriert: Do, 13.07.2006 09:02
Wohnort: Kiel

Beitrag von ehvbs »

storeToURL() dient dazu, die Datei unter einem neuen Namen
abzuspeichern

' Save copy of the doc
oDoc.storeToURL "file:///c:/test/test3.odt", arg()

funktioniert problemlos.
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

storeToURL() dient dazu, die Datei unter einem neuen Namen
abzuspeichern
oder unter demselben Namen

storeToURL() sagt eigentlich nur das Dokument speichern und das aktuell angezeigte Dokument (also das was gerade gespeichert wurde) auf die alte Adresse zeigen zu lassen.
Im Gegensatz zu StoreAsURL() wo nach dem Speichern das angezeigte Dokument auf die neue Adresse zeigt.

Beispiel:
angezeigt wird das Dokument C:\bla.odt

beim Speichern mittels StoreToURL() unter C:\BlaBla.odt, wird dort gespeichert, das (weiterhin) offene Dokument ist jedoch C:\bla.odt. Beim Speichern mittels StoreAsURL() als C:\BlaBla.odt wird genauso gespeichert, aber das angezeigte Dokument ist danach das neue.



Der Grund warum es hier im Konkreten zum Fehler kommt dürfte eher sein das der gepostete Code VBA ist und ich vermute das dort nur StoreAsURL geht wenn hinterher ein .close erfolgen soll, zumindest bei VB-Script ist das so. (den Grund dafür habe ich nie untersucht).

Ich würde also für:

Code: Alles auswählen

Call oDoc.storeToURL("file:///c:/test/test2.odt", arg())
das:

Code: Alles auswählen

Call oDoc.storeAsURL("file:///c:/test/test2.odt", arg())
verwenden, ggf. tut es auch ein einfaches:

Code: Alles auswählen

Call oDoc.store()
weiß ich aber bei VBA nicht, in StarBasic würde es so gehen.




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

Beitrag von Toxitom »

Hey,
ch vermute dass die methode 'storeToURL' noch ein paar events im hintergrund hat, die nicht zum zug kommen, und durch .close() gekillt werden!
Ich denke auch, das es gena daran hängt. Ähnliches passiert bsp auch beim Drucken von Dokumenten - nur hängt sich OOo nicht auf.

Du könntest versuchen, mal eine Pause einzubauen

Code: Alles auswählen

store...
wait(2000)   '2 sekunden warten
oDoc.close(true)
Und ein wenig damit experimentieren.

Oder - bei Druckbefehl gibt es eine undokumentierte Eigenschaft für die Argumente:

Code: Alles auswählen

dim arg(0) as new com.sun.star.beans.PropertyValue
arg(0).name = "Wait"
arg(0).value = true
Das bewirkt, dass das Makro so lange in der zeile wartet, bis alle Prozesse vom Druckbefehl abgearbeitet waren und dann erst wird die Ausführung fdes Makros fortgesetzt. Dadurch kam dann kein Fehler mehr zusande.
Vielleicht funktioniert das ja auch beim Speichern :wink:

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
$ilent$nooc
*
Beiträge: 10
Registriert: Di, 22.08.2006 14:50

Beitrag von $ilent$nooc »

danke leute für eure antworten!

@ Thomas:
der ansatz gefällt mir! ich werde es auf diese weise einmal versuchen ;)
hoffe es klappt ^^
$ilent$nooc
*
Beiträge: 10
Registriert: Di, 22.08.2006 14:50

Beitrag von $ilent$nooc »

so!

habs versucht, aber nicht geschafft!

ich denke ich poste einfach mal den code

Code: Alles auswählen

        ' Objekte
    Dim objManager As Object
    Dim objDesktop As Object
    Dim objDatei As Object
    
        ' Strings
    Dim strDatei As String
    
        ' Argumente-Array
    Dim Args(0) As Types.PropertyValue
    Args(0).Name = "Wait"
    Args(0).Value = True
    

    On Error GoTo Failed
    
        ' Zuweisung des Pfades der Datei (name.ods = Calc-Date)
    strDatei = "file:///C:/test/test2.ods"
    
        ' Erstellen eines Service-Managers
    Set objManager = CreateObject("com.sun.star.ServiceManager")
        ' Erstellen des Services ..
    Set objDesktop = objManager.createInstance("com.sun.star.frame.Desktop")
    
        ' Laden der Datei aus dem Pfad von strDatei (Datei wird geöffnet)
    Set objDatei = objDesktop.loadComponentFromURL(strDatei, "_blank", 0, Args())
    
        ' Überprüft ob es sich um die richtige Datei handelt.
    If objDatei.SupportsService("com.sun.star.sheet.SpreadsheetDocument") = False Then
        MsgBox ("Ein falsches Dokument wurde geöffnet.")
    Else
        MsgBox (strDatei & " wurde geöffnet.")
    End If
    
   
        ' Speichert die Datei
    Call objDatei.storeAsURL(strDatei, Args())
    
        ' Schließt die Datei
    objDatei.Close (True)
    
        ' Aufräumen ..
    Set objDatei = Nothing
    
        ' Prozedur verlassen
    Exit Sub
    
    
        ' On Error ..
Failed:
    MsgBox (Err.Description)
    
        ' Aufräumen ..
    If Not objDatei Is Nothing Then
        Set objDatei = Nothing
    End If

' ##########################
' PropertyValue:

Public Enum PropertyState
    DIRECT_VALUE
    DEFAULT_VALUE
    AMBIGUOUS_VALUE
End Enum

Public Type PropertyValue
    Name As String
    Handle As Long
    Value As String
    State As PropertyState
End Type
das problem ist, dass ich nicht weiß wo das problem liegt! ich hab mir die dokumentation angesehn! ich übergebe der funktion loadComponentFromURL das array Args().
hier
zur definition lt. doku

es sollte doch eigentlich funktionieren!
aber ich bekomme folgenden error:
Fehler beim Kompilieren:

Nur benutzerdefinierte Typen, die in öffentlichen Objektmodulen definiert sind, können in den oder aus dem Typ Variant umgewandelt werden oder an eine zur Laufzeit auflösbare Funktion weitergeleitet werden.
ich habe keinen tau :roll:


aber.. nur so eine frage:

hat jemand eine ahnung ob das objekt 'objDesktop' (Set objDesktop = objManager.createInstance("com.sun.star.frame.Desktop")) evtl. eine eigenschaft hat, die mir zeigt dass die funktion storeToURL oder storeAsURL fertig ist? ich stelle mir das in etwa so vor:

Speichere solange objDesktio.Ready ungleich True ..

das wäre eine elegante lösung mit einer schleife, aber leider gibt es bzw. finde ich keine ausreichende dokumentation über diese objekte, deren methoden und eigenschaften ..
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

zunächst:
ich habe Deinen gestrigen Code jetzt unter MS Word laufen lassen und er funktioniert tadellos.
ich habe keinen tau


aber.. nur so eine frage:

hat jemand eine ahnung ob das objekt 'objDesktop' (Set objDesktop = objManager.createInstance("com.sun.star.frame.Desktop")) evtl. eine eigenschaft hat, die mir zeigt dass die funktion storeToURL oder storeAsURL fertig ist?


Ich weiß auch nicht woran es liegt, nur ich hatte schon gestern das Call gesehen und mir ist nicht klar wieso hier nach der Ursache geforscht wird.
Hier ist ein Call und das bewirkt (meiner Ansicht nach) das nichts nach dem Call geschiet ehe nicht das was zum Call gehört 'fertig' ist.

Code: Alles auswählen

oDoc.Close (True)
wird einfach nicht ausgeführt ehe das Speichern nicht fertig ist.

So ist, meines Erachtens, die Lage und es könnte ja sein das Call nun trotzdem fehlerhaft ist, aber man kann das ja prüfen. Etwa auf die Schnelle zum Beispiel so:

Code: Alles auswählen

Private Sub OpenOpenOffice()

Dim oSM
Dim oDesk As Object
Dim oDoc As Object
Dim arg()
    
On Error GoTo Failed
Set fs = CreateObject("Scripting.FileSystemObject")
Set x = fs.GetFile("c:\test\trigfunk.ods")
    
    ' Instanciate OOo : this line is mandatory with VB for OOo API
Set oSM = CreateObject("com.sun.star.ServiceManager")
    'Create the first and most important service
Set oDesk = oSM.createInstance("com.sun.star.frame.Desktop")
    
    ' Open an existing doc
Set oDoc = oDesk.loadComponentFromURL("file:///c:/test/trigfunk.ods", "_blank", 0, arg())

    ' Save the doc
Call oDoc.storeToURL("file:///c:/test/trigfunk.ods", arg())

MsgBox x.DateLastModified

    ' Close the doc
oDoc.Close (True)
Set oDoc = Nothing

Exit Sub

Failed:
  MsgBox (Err.Description)
  
End Sub ' OpenOpenOffice()
und da meine gewählte Datei trigfunk.ods reichlich 10 Sekunden zum Speichern braucht, bin ich sicher das kein 'Zufall' vorliegen kann wenn mir:

Code: Alles auswählen

MsgBox x.DateLastModified
nun tatsächlich das neue Dateidatum zeigt, wie ich das erwartet hatte.

(Nein, ich will nun nicht schwören das diese Prüfung vollkommen sicher sein muß, als Augenscheinsbeweis reicht sie mir aber zunächst.)


und obwohl es (meiner Meinung nach) nicht am Call hängt, ist doch das:
ich stelle mir das in etwa so vor:

Speichere solange objDesktio.Ready ungleich True ..

das wäre eine elegante lösung mit einer schleife,


ganz simpel zu lösen, auch ohne etwas über:
aber leider gibt es bzw. finde ich keine ausreichende dokumentation über diese objekte, deren methoden und eigenschaften ..
zu wissen, denn es reicht (naja, ich behaupte nicht es ist elegant, nur es erfüllt seinen Zweck), ein einfaches Do-Loop:

Code: Alles auswählen

'...
Set fs = CreateObject("Scripting.FileSystemObject")
Set x = fs.GetFile("c:\test\trigfunk.ods")
y = x.DateLastModified
'...
Call oDoc.storeToURL("file:///c:/test/trigfunk.ods", arg())
Do
Loop While y = x.DateLastModified
'...
allerdings nehme ich nicht an das das Dein Problem löst, das Problem existiert nämlich meines Erachtens nicht an der Stelle wo Du es vermutest.


das hier:

Code: Alles auswählen

Dim Args(0) As Types.PropertyValue 
    Args(0).Name = "Wait" 
    Args(0).Value = True


ist doch nun völlig aus der Luft gegriffen. Du kannst doch keine Parameter übergeben womit das Programm nichts anfangen kann, weil sie dort einfach nicht hingehören.

Nur am Rande sei erwähnt das eine PropertyValue-Variable unter den bestehenden Umständen (meiner Meinung nach) in etwa so zu deklarieren wäre:

Code: Alles auswählen

Dim Dim Args(0)
Set Args(0) = oSM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
Args(0).Name = "Wait" 
Args(0).Value = True


zumindest aus Sicht von OOo, Betrachtungen zu Typvariablen in VB sind da zunächst außen vor, weil ich im Konkreten OOo/VB/Typvariablen keine praktische Erfahrung habe.

es sollte doch eigentlich funktionieren!
Nein, wie denn. Du übergibst Parameter die dort nicht hingehören und es ist überflüssig nun auf Fehlermeldungen von VB zu verweisen, die mir inhaltlich ziemlich egal sind, weil die Parameterübergabe ansich schon falsch ist.


Eine Lösung kenne ich derzeitig auch nicht, so das ich Dir eigentlich nur raten würde zunächst einmal festzustellen welche Code-Zeile denn gerade in Arbeit ist wenn sich OOo mit Fehlermeldung verabschiedet, denn ich kann das von hier aus nicht wissen. (Es kann sein das Du das bereits weißt und als selbstverständlich voraussetzt, nur konkret gesagt hast Du bisher nichts dazu) Weil ich es nicht weiß ziehe ich dann schon in Betracht das nicht:

Code: Alles auswählen

oDoc.Close (True)
sondern ggf.:

Code: Alles auswählen

Set oDoc = Nothing
den Fehler bewirkt.

Außerdem solltest Du zumindest einmal:

Code: Alles auswählen

Call oDoc.store()
ausprobieren, obwohl ich zum jetzigen Zeitpunkt der Diskussion eher nicht glaube das das helfen wird.



Gruß
Stephan
$ilent$nooc
*
Beiträge: 10
Registriert: Di, 22.08.2006 14:50

Beitrag von $ilent$nooc »

ok .. danke für deine ausführliche antwort :)

ich werde mich damit auseinandersetzen ..
$ilent$nooc
*
Beiträge: 10
Registriert: Di, 22.08.2006 14:50

Beitrag von $ilent$nooc »

sry.. hab im falschen topic gepostet :oops:
Gesperrt