Seite 1 von 1
Writer-Dokument im Vordergrund öffnen
Verfasst: Sa, 26.12.2009 10:03
von TJF
Hallo,
ich würde gerne ein Writer-Dokument nach dem Öffnen aktiv in den Vordergrund bringen. Es soll kein Dateiname im Spiel sein, weil in das Dokument von einer anderen Anwendung geschrieben wird und immer vorher einen anderen Dateinamen erhält. Ich habe das
viewtopic.php?f=9&t=31026 gelesen und bin mir nicht sicher, ob das überhaupt möglich ist.
Das hier (eingebaut unter Extras->Anpassen->Ereignisse)...
Code: Alles auswählen
sub vordergrund
Dim oDoc
oDoc = ThisComponent
oDoc.CurrentController.Frame.ContainerWindow.toFront()
end sub
...funktioniert zumindest nicht. Hat jemand eine Idee?
Dank und Gruß
Thomas
Re: Writer-Dokument im Vordergrund öffnen
Verfasst: Sa, 26.12.2009 10:32
von turtle47
TJF hat geschrieben:Hat jemand eine Idee?
vielleicht so:
Code: Alles auswählen
sub vordergrund
Dim oDoc
oDoc = ThisComponent
oDoc.CurrentController.Frame.getContainerWindow().setFocus
end sub
Jürgen
Re: Writer-Dokument im Vordergrund öffnen
Verfasst: Sa, 26.12.2009 10:57
von TJF
Hallo Jürgen,
vielen Dank. Geht aber auch leider nicht...
Viele Grüße
Thomas
Re: Writer-Dokument im Vordergrund öffnen
Verfasst: Sa, 26.12.2009 11:45
von Stephan
...funktioniert zumindest nicht. Hat jemand eine Idee?
Und was funktioniert nicht?
Mein erster Verdacht wäre das das Ganze natürlich funktioniert, Du jedoch mit ThisComponent (im Moment des Ablauf des Makros) ein falsches Objekt ansprichst.
Hast Du das geprüft?
Liegt es daram würde ich vor dem Öffnen des Writer-Dokuments prüfen welche Fenster bereits offen sind (z.B. im Sinne wie ich es am 04.10.2004 15:23 nutze:
viewtopic.php?f=18&t=1842) und vor dem Ablauf prüfewn welches fEnster (nach Öffnen des Writerdokuments) hinzugekommen ist und micht auf dieses Objekt direkt beziehen (statt auf ThisComponent).
Gruß
Stephan
Re: Writer-Dokument im Vordergrund öffnen
Verfasst: Sa, 26.12.2009 11:50
von turtle47
Hi,
wo befindet sich denn das Makro um den Focus zu setzen? In der neuen erstellten Datei, ich nehme an eine Vorlage, oder in der erzeugenden Datei?
Wenn Das Makro in der neuen Datei ist dann musst Du noch in der erzeugenden Datei ensprechende
Parmeter mitgeben !
Jürgen
EDIT:
Du jedoch mit ThisComponent (im Moment des Ablauf des Makros) ein falsches Objekt ansprichst. Hast Du das geprüft?
Ich denke das kann man ausschliessen weil:
Das hier (eingebaut unter Extras->Anpassen->Ereignisse)...
Re: Writer-Dokument im Vordergrund öffnen
Verfasst: Sa, 26.12.2009 11:52
von TJF
Danke Stephan, danke Jürgen,
ich melde mich später nach dem Festschmaus wieder...
Viele Grüße
Thomas
Re: Writer-Dokument im Vordergrund öffnen
Verfasst: Sa, 26.12.2009 13:16
von Stephan
Ich denke das kann man ausschliessen weil:
Inwiefern wäre die Art des Starts des Makros Garant dafür das mit ThisComponent nicht unerwünschterweise ein falsches Objekt referenziert werden könnte? Bitte um Erklärung.
Ich kann bisher nur feststellen das das makro eine einzige Zeile hat in der etwas Sichtbares passieren sollte, nämlich:
Code: Alles auswählen
oDoc.CurrentController.Frame.ContainerWindow.toFront()
Solange nun keine Fehlermeldung erfolgt (denn davon stand in der Frage nichts) scheint die Zeile akzeptiert zu werden, mithin ist oDoc die Referenz auf ein zulässiges Objekt, was mich einzig vermuten lässt es ist nicht das Richtige (also richtiges Dokument-Objekt)
Gruß
Stephan
Re: Writer-Dokument im Vordergrund öffnen
Verfasst: Sa, 26.12.2009 18:18
von turtle47
Hallo Stephan,
Stephan hat geschrieben:Inwiefern wäre die Art des Starts des Makros Garant dafür das mit ThisComponent nicht unerwünschterweise ein falsches Objekt referenziert werden könnte? Bitte um Erklärung.
Ich gehe jetzt mal davon aus, dass das Makro in dem
erzeugten Dokument (vielleicht eine Dokumentvorlage) hinterlegt ist. Dann sollte sich
Code: Alles auswählen
oDoc = ThisComponent
oDoc.CurrentController.Frame.ContainerWindow.toFront()
schon auf dieses Dokument beziehen.
Wenn in dem
erzeugenden Dokument aber nicht mitgegeben wird, dass in dem
erzeugten Dokument Makros ausgeführt werden dürfen
Code: Alles auswählen
Dim myProp(0) as new com.sun.star.beans.PropertyValue
myProp(0).name="MacroExecutionMode"
myProp(0).value = 4 'ALWAYS_EXECUTE_NO_WARN 4 Makros werden immer ausgeführt, keine Warnung
url=converttourl("C:\test.sxw")
oDocument = StarDesktop.loadComponentFromURL(url, "_blank", 0, myFileProp() )
dann wird das Makro in der "Vorlage" einfach unterdrückt.
Das ist halt
meine Vermutung das es so ist.
Feststellen könnte man das mit einer einfachen MsgBox im
erzeugten Dokument.
Code: Alles auswählen
sub vordergrund
Dim oDoc
oDoc = ThisComponent
oDoc.CurrentController.Frame.ContainerWindow.toFront()
msgBox "Hallo User, Makro wird ausgeführt!"
end sub
Wenn die MsgBox angezeigt wird und das Doc nicht in den Vordergrund rückt, dann hast Du mit Deiner Vermutung recht, was ich Dir auch gönne.
Ich warte jetzt jedenfalls einfach mal ab was Thomas berichtet.
Jürgen
Re: Writer-Dokument im Vordergrund öffnen
Verfasst: Sa, 26.12.2009 19:22
von Stephan
Hallo Jürgen,
dann wird das Makro in der "Vorlage" einfach unterdrückt.
Das ist halt meine Vermutung das es so ist.
gegen diese Vermutung (also das das Makro u.u. garnicht ausgeführt wird) habe ich garnichts einzuwenden, ich habe mich nur gegen DEine ursprüngliche Antwort gewehrt, die ja wohl sinngemäß hieß:
'weil das Makro über Extras-... zugewiesen ist kann es nicht sein das ThisComponent ungewollt auf ein falsches Objekt verweist'
denn
Du hattest Dich mit DEiner Anwort auf meine Aussage:
Du jedoch mit ThisComponent (im Moment des Ablauf des Makros) ein falsches Objekt ansprichst. Hast Du das geprüft?
bezogen.
Und über Extras-... ist ja nun einmal nicht nur die ZUweisung von Dokumentmakros möglich und ohne ERklärung (die Du jetzt im Nachhinein gibst) war mir nicht klar das es sich um ein Dokumentmakro handeln soll (denn 'müssen' muß es sich ja nicht)
Verstehe doch bitte an der Stelle einfach das das 'garnicht-erst-Ausführen' eines Makros etwas anderes ist als das Ausführen des Makros mit Bezug auf ein falsches Objekt und
nur auf letzteres bezog sich meine Ausssage.
was ich Dir auch gönne.
das ist nett, abe ich sehe mich hier nicht im Wettbewerb, ich hatte nachgefragt in der Vermutung Du wüßtest an der Stelle mehr als ich.
Gruß
Stephan
Re: Writer-Dokument im Vordergrund öffnen
Verfasst: Sa, 26.12.2009 19:43
von TJF
Hallo,
also zuerst: Das Writer-Dokument ist ein xy.odt, das alle Makros beinhaltet. Es wird via eine andere Anwendung (OLE) geöffnet, mit Adresse, etc., beschrieben und unter anderem Namen abgespeichert, geschlossen und neu geöffnet zur Weiterverarbeitung (hierfür das gewünschte Vordergrund-Verhalten). Die vorhandene DDE-Verknüpfung plus vorhandene Makros funktionieren einwandfrei.
Code: Alles auswählen
sub vordergrund
Dim oDoc
oDoc = ThisComponent
oDoc.CurrentController.Frame.ContainerWindow.toFront()
msgBox "Hallo User, Makro wird ausgeführt!"
end sub
Auch das funktioniert, d.h. die Meldung wird angezeigt. Nicht funktioniert das Öffnen im Vordergrund...
Stephans Vermutung könnte also stimmen. Jedoch ist mir nicht ganz klar, wie ich seinen oben verlinkten Beitrag zur weiteren Erkenntnis einbauen kann:
Auf das Makro "gesamt" passiert gar nichts. Auf das Makro unten von Charly kommt immer "Datei nicht gefunden". Dabei kann ich das doc mit dem odoc tauschen... Die Makros sind aber auch ein paar Jahre alt.
Viele Grüße
Thomas
Re: Writer-Dokument im Vordergrund öffnen
Verfasst: Sa, 26.12.2009 21:37
von Stephan
Jedoch ist mir nicht ganz klar, wie ich seinen oben verlinkten Beitrag zur weiteren Erkenntnis einbauen kann:
indem Du das richtige Dokument auswählst und dann dessen Dokument-Objekt startt ThisComponent benutzt.
Das in den Vordergrund zu bringende Dokum ent hat einen namen, denn Du schreibst:
und unter anderem Namen abgespeichert, geschlossen und neu geöffnet
Baue also den Code auf den ich verwiesen hatte:
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
so um das Du das Dokument anhand seines Names identifizieren kannst:
Code: Alles auswählen
sub gesamt
'hier Dateinamen vorgeben
gesuchter_dateiname = ConvertToURL("D:\xyz\abc.odt")
'----------------------------------------
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 aktuell.GetLocation = gesuchter_dateiname Then
aktuell.CurrentController.Frame.ContainerWindow.toFront()
Exit Sub
end if
end if
end if
Loop
end sub
Auf das Makro unten von Charly kommt immer "Datei nicht gefunden".
ich hatte nicht auf dieses Makro verwiesen, sondern NUR auf einen KONKRETEN Beitrag von mir:
im Sinne wie ich es am 04.10.2004 15:23 nutze: viewtopic.php?f=18&t=1842)
Gruß
Stephan
Re: Writer-Dokument im Vordergrund öffnen
Verfasst: Sa, 26.12.2009 22:20
von TJF
Hallo Stephan,
wie ich schon oben geschrieben hatte, passiert "nichts" mit dem eingebauten Makro (mit dem neuen Dateinamen), d.h. es ändert nichts am Verhalten und das Dokument mit dem neuen Namen (der auch im Makro steht) wird nicht im Vordergrund gestartet. Das Makro ist mit dem Dokumentstart verknüpft.
Viele Grüße
Thomas
Re: Writer-Dokument im Vordergrund öffnen
Verfasst: Sa, 26.12.2009 22:31
von Stephan
Das Makro ist mit dem Dokumentstart verknüpft.
'Toll' solche Informationen nebenbei zu bekommen...
wie ich schon oben geschrieben hatte, passiert "nichts" mit dem eingebauten Makro
WAS HEISST DAS?
Entweder wird das richtige Objekt angesprochen oder nicht,
ich hatte bereits gefragt ob Du das geprüft hast... und wenn nun ein bestimmtes Objekt auf Vorhandensein geprüft wird kann es natürlich sein das dieses garnicht vorhanden ist zum Zeitpunkt wo da Makro läuft, weswegen dann natürlich:
nie erfüllt ist und:
Code: Alles auswählen
aktuell.CurrentController.Frame.ContainerWindow.toFront()
Exit Sub
nie durchlaufen wird ... man müßte das halt überprüfen um den Fehler zu finden...
Ende der Diskussion für mich
Stephan
Re: Writer-Dokument im Vordergrund öffnen
Verfasst: Sa, 26.12.2009 22:53
von TJF
'Toll' solche Informationen nebenbei zu bekommen...
S.o. Außerdem: Wie sollte denn das Makro sonst in diesem (!!!) Fall starten?
Re: Writer-Dokument im Vordergrund öffnen
Verfasst: Mo, 28.12.2009 01:38
von TJF
Hallo,
für die weiterhin Interessierten:
Nachdem sich offensichtlich das Verhalten nicht grundsätzlich (ausser was die interne Hierarchie geöffneter OO-Dokumente angeht) via Makro ändern läßt, habe ich das Problem mit einem kleinen AutoIt-Programm lösen können:
- zuerst wird mit Öffnen des Writer-Dokumentes via OO-Makro ein neuer Titel ins Dokument geschrieben.
- das AutoIt-Programm (das im RAM ist) fungiert als "Wächter" und setzt jedes sich öffnende Dokument, das von SpeedAddressPro beschrieben wird, mit dem neuen Titel aktiv in den Vordergrund und ändert den Titel erneut um aus der "schlafenden" Schleife genommen zu werden.
Dank und Gruß
Thomas