Datei bereits geöffnet?

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

Moderator: Moderatoren

toni
***
Beiträge: 66
Registriert: Mi, 03.01.2007 10:26

Datei bereits geöffnet?

Beitrag von toni »

Hallo zusammen,

ich exportiere per Makro ein Sheet ins PDF (Druck.pdf) und öffne die Datei automatisch mit dem AcrobatReader.

Wenn eine Datei gleichen Namens bereits geöffnet ist, kommt es unter Windows zu einer Fehlermeldung in der Zeile

Code: Alles auswählen

ThisComponent.storeToUrl(sUrl,myProps())
unter Linux gibt es zwar keine Fehlermeldung, aber die PDF-Datei sieht völlig verkorkst aus.

Kann ich per Makrocode abfragen, ob die Datei bereits geöffnet ist?
Etwa so:

If Datei geöffnet then
msgbox "Eine Datei gleichen Namens ist bereits geöffnet!"
exit sub
Else
ThisComponent.storeToUrl(sUrl,myProps())
End If

Es wäre auch ok, die "alte" Druck.pdf vorher zu schließen. Ich weiß allerdings auch nicht, wie das geht.

Gruss

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

Beitrag von Stephan »

unter Linux gibt es zwar keine Fehlermeldung, aber die PDF-Datei sieht völlig verkorkst aus.
Mmmh ...
Kann ich per Makrocode abfragen, ob die Datei bereits geöffnet ist?
Kann ich nicht konkret sagen wie, das direkte Verfahren unter Windows ist meiner Meinung nach auch nicht so trivial, da man die Prozess-ID von Acrobat kennen müßte, was schwierig ist bzw. zusätzlich schwierig ist wenn man ihn nicht explizit selbst startet (aber selbst wenn man das tut wüßte ich mit StarBasic nicht wie ich die Prozess-ID bekäme) und es kommt hinzu das optimalerweise ja nur ein Dokument geschlossen werden soll, wenn mehrere in Acrobat geöffnet sind.
Unter Windows würde ich es damit für ausreichend halten zu prüfen ob die Datei existiert und ob Schreibzugriff einen Fehler erzeugt, das sagt dann zu 99% das die Datei geöffnet ist und Du kannst eine Meldung ausgeben.

Zum Selben unter Linux kann ich praktisch garnichts sagen, nur wenn bei Dir Schreiben ohne Fehlermeldung möglich ist fällt die gerade genannte Variante aus.


Was ich an Deiner Stelle mal versuchen würde, in der Hoffnung das es unter Windows und Linux geht, wäre es die Datei vor dem Neuschreiben zu löschen. Das sollte in Windows und Linux eine Fehlermeldung geben, wenn die Datei geöffnet ist, und diese kannst Du abfangen und eine Meldung ausgeben.





Gruß
Stephan
toni
***
Beiträge: 66
Registriert: Mi, 03.01.2007 10:26

Beitrag von toni »

Hi Stephan,

danke für den Tip, ich prüfe jetzt zunächst die Existens der Datei, lösche sie dann gegebenenfalls und gebe über einen ErrorHandler eine Meldung raus, falls die Datei geöffnet ist:

Code: Alles auswählen

Sub Druckbereich_Anlegen(nSht as Object, _
                         nStC as Integer, _
                         nStR as Integer, _
                         nEndC as Integer, _
                         nEndR as Integer)

Dim oService
Dim CellrangeAddress AS New com.sun.star.table.CellRangeAddress
Dim args(0)
Dim myProps(0) as New com.sun.star.beans.PropertyValue
Dim arg_leer()

    On Error GoTo ErrorHandler
         
    Cellrangeaddress.StartColumn = nStC
    Cellrangeaddress.Startrow = nStR
    Cellrangeaddress.EndColumn = nEndC
    Cellrangeaddress.EndRow = nEndR
    args(0) = Cellrangeaddress
    nSht.setPrintAreas(args())
    
    kPfad = ThisComponent.URL
    sPfad = DirectoryNameoutofPath(kPfad, "/")
    sUrl= sPfad & "/" & "Druck.pdf" 
    If FileExists(sUrl) Then      
       kill(sUrl)
    End If
    myProps(0).Name="FilterName"
    myProps(0).Value = "calc_pdf_Export"
    
    ThisComponent.storeToUrl(sUrl,myProps())
    nSht.setPrintareas(arg_leer())

    oService = createUnoService("com.sun.star.system.SystemShellExecute")
    oService.execute(sURL,,0) 'Reader wird automatisch aufgerufen
    Exit Sub
    
    ErrorHandler:
    MsgBox "Bitte schließen sie zunächst die Datei Druck.pdf"
End Sub 
Gruss

Thomas
Antworten