Abfrage nach geöffneten Dokumenten

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

Moderator: Moderatoren

Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Abfrage nach geöffneten Dokumenten

Beitrag von Charly »

Hallo!

Zum Öffnen eines Writer- oder Calcdokuments per Makro gibt es den Befehl:

Code: Alles auswählen

Dokument = StarDesktop.loadComponentFromUrl(url,"_blank",0,myFileProb())
Gibt es auch eine Möglichkeit vor Aufruf dieses Befehls abzufragen, ob das Dokument nicht bereits geöffnet ist.

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

Beitrag von Stephan »

Hallo Charly,

Ja, das geht.
Alle geöffneten Fenster der So/OOo-Anwendung zeigen in der Titelzeile entweder:

<Name der Datei> - Staroffice 7 (falls unter Dokumenteigenschaften kein Titel vergeben)

oder

<Dokumenttitel> - Staroffice 7 (falls unter Dokumenteigenschaften Titel vergeben)

(bei OpenOffice steht wahrscheinlich OpenOffice, habe ich nicht geprüft)

Wenn Du entweder den Dateinamen oder falls vergeben den Titel der auf "schon geöffnet ?" zu prüfenden Datei kennst, kannst Du die Titel aller Fenster anzeigen und nachschauen ob das Dokument darunter ist.
Nehmen wir an das Dokument heiße charly.sxw und habe unter Eigenschaften keinen Titel, dann:

Code: Alles auswählen

sub Titelleiste
for i=0 to Stardesktop.Frames.count-1
titel = stardesktop.Frames(i).title
if left(titel,10) = "charly.sxw" Then
	Msgbox "Dokument ist schon geöffnet!"
end if
next i
end sub


Es werden in der Schleife auch Fenster durchlaufen, die keine Dokumentfenster sind (z.B. Basic-IDE) was jedoch für Deine Zwecke nicht stört.
Gruß
Stephan
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Beitrag von Charly »

Hallo Stephan!

Vielen Dank für deine schnelle Antwort.

Leider stehe ich schon wieder auf dem Schlauch. Ich weiß nun, dass das Dokument geöffnet ist, aber wie kann ich es einer Objektvariablen zuweisen, um Zugriff auf das Dokument zu bekommen.

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

Beitrag von Stephan »

Hallo Charly,
Ich weiß nun, dass das Dokument geöffnet ist
Nein, das stimmt eigentlich nicht - ich habe das gestern nicht genau durchdacht. Du weißt nur das es Fenster gibt in deren Titelzeile etwas steht was dort normalerweise stünde wenn Du das entsprechende Dokument "normal" öffnen würdest. Ist jetzt pingelig meinst Du - nein garnicht denn mit:

Code: Alles auswählen

sub Titelleiste_test 
for i=0 to Stardesktop.Frames.count-1 
	stardesktop.Frames(i).title = "irgendetwas"
next i 
end sub
kannst Du in die Titelleisten aller geöffneten Fenster der OOo-Anwendung beliebigen Text eintragen und die geöffneten Dokumente werden davon nicht beeinflußt. Was ich damit sagen will ist das Du ausgehend vom ursprünglichen Code nicht auf die eigentlichen Dokumente zugreifen kannst, ich weiß jedenfalls derzeitig nicht wie ...

Verwende deshalb folgenden Code:

Code: Alles auswählen

sub gesamt
'hier Dateinamen vorgeben
gesuchter_dateiname = "post.sxw"
'----------------------------------------
laenge = Len(gesuchter_dateiname)
alles = StarDesktop.getComponents()
elemente = alles.createEnumeration()
Do While elemente.HasMoreElements
   aktuell = elemente.NextElement()
   If HasUnoInterfaces(aktuell, "com.sun.star.frame.XModel") Then
      If aktuell.hasLocation() Then 
          if Right(ConvertFromURL(aktuell.GetLocation),laenge) = gesuchter_dateiname Then
             if Right(ConvertFromURL(aktuell.GetLocation),3) ="sxc" Then
                'Beispiel Calc
                blatt = aktuell.getSheets().GetByName("Tabelle1")
                zelle = blatt.getCellByPosition(0, 0)
                zelle.Value = 12345
             end if
             if Right(ConvertFromURL(aktuell.GetLocation),3) ="sxw" Then
                'Beispiel Writer
                Cursor = aktuell.Text.createTextCursor()
                Cursor.String = "Das ist ein Beispieltext"
             end if
          end if
      end if
   end if
Loop
end sub

mit diesem Code gibt es das Problem mit dem Titel in den Dokumenteigenschaften nicht mehr und Du greifst exakt auf das gewünschte Dokument zu, völlig unabhängig was in der Titelzeile steht.

Gruß
Stephan
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Beitrag von Charly »

Hallo Stephan!

Danke auch für deinen neuen Code.

Dein erster Code hätte mir allerdings auch sehr gefallen. War so schön übersichtlich. Ich hatte gehofft, man könnte den gefundenen Frame aktivieren und dann mit ThisComponent abfragen. Aber das geht leider nicht. Eigentlich schade.


Gruß
Charly
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Beitrag von Charly »

Hallo Stephan!
Was ich damit sagen will ist das Du ausgehend vom ursprünglichen Code nicht auf die eigentlichen Dokumente zugreifen kannst, ich weiß jedenfalls derzeitig nicht wie ...
Vorausgesetzt die Titelzeile stimmt mit dem Dokumentennamen überein, weiß ich jetzt wie ich auf das gefundene Dokument zugreifen kann. Du hast mich durch eine Antwort in einem andern Thread darauf gebracht.

Code: Alles auswählen

sub Titelleiste_test
for i=0 to Stardesktop.frames.count-1
	title = StarDesktop.frames(i).title 
	if left(title,10) = "charly.sxc" then
		StarDesktop.frames(i).containerwindow.toFront
		Kennung = 1
	end if
next i

If Kennung = 1 then

'ThisComponent funktioniert hier nicht

Doc = Stardesktop.currentComponent  
Blatt = Doc.sheets(0)
Zelle = Blatt.getCellByPosition(0,0)
Zelle.string = "Dokument gefunden"

else msgbox("Datei nicht gefunden")

end if
end sub	

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

Beitrag von Stephan »

Hallo Charly,

ich habe es nicht ausprobiert, aber ich denke Du hast recht und es funktioniert. In jedem Fall ist mir das hier klar:

'ThisComponent funktioniert hier nicht

Doc = Stardesktop.currentComponent



Gruß
Stephan
Antworten