Seite 1 von 2
function fensterwaehlen() tut nicht
Verfasst: So, 18.01.2015 11:06
von clag
Hallo Kenner und Könner,
auf der Seite
http://www.dannenhoefer.de/faqstarbasic ... terwaehlen wird eine Funktion "fensterwaehlen()" beschrieben die ich gerne benutzen würde
aber sie tut nicht wie erwartet es passiert nichts obwohl der richtige String übergeben wird
Code: Alles auswählen
function fensterwaehlen(dateiname as string) as object
GlobalScope.BasicLibraries.LoadLibrary("Tools")
Dim oDesktop As Object, oDocs As Object
Dim oDoc As Object, oComponents As Object
gefunden=false
oComponents = StarDesktop.getComponents()
oDocs = oComponents.createEnumeration()
Do While oDocs.hasMoreElements()
oDoc = oDocs.nextElement()
'xray oDoc
On Error Goto Weiter
datei=odoc.geturl()
FileN=FileNameoutofPath(datei)
'msgbox FileN & chr(10) & dateiname
if FileN=dateiname then
print"passt"
fensterwaehlen=odoc
gefunden=true
end if
weiter:
Loop
if gefunden=false then fensterwaehlen=stardesktop.currentcomponent
end Function
das "passt" wird ausgegeben aber es bleibt trotzdem das Start Fenster aktiv, und das angesprochene xxx.odt definitiv geöffnet ist
kann mir jemand sagen was da falsch läuft ??
Re: function fensterwaehlen() tut nicht
Verfasst: So, 18.01.2015 11:46
von Stephan
das Makro bzw. die Function ist doch überghaupt nicht dafür gedacht was Du erreichen willst, was aber auch oben drüber steht:
"Mit dieser Funktion kann gezielt ein geöffnetes Fenster als doc-Object aufgerufen werden."
Lösung siehe z.B. im Thread:
http://www.oooforum.de/viewtopic.php?f= ... 92&start=0
Gruß
Stephan
Re: function fensterwaehlen() tut nicht
Verfasst: Mo, 19.01.2015 12:06
von Karolus
Hallo
@clag
Wieso startest du das Thema (nochmal), obwohl es bereits vor
5 Tagen hinreichend abgehandelt wurde?
Karolus
Re: function fensterwaehlen() tut nicht
Verfasst: Mo, 19.01.2015 13:36
von clag
Hallo
@ Karolus
was möchtest du mit dieser Frage zum Ausdruck bringen?
obwohl es bereits vor 5 Tagen hinreichend abgehandelt wurde?
wenn es so wäre stünde "gelöst" vor dem Thema!
Stephan hat freundlicheweise einen älteren Beitrag verlinkt in dem Basic Code zum wechseln auf ein andere OOFenster gezeigt,
den habe ich versucht anzuwenden leider funktioniert das noch nicht wie von mir erhofft, das angesprochene Fenster wird zwar aktiviert
komm auch in den Vordergrund ABER das Calc Dokument aus dem ich das Makro aufgerufen habe liegt immer noch darüber.
Was muss da noch geändert werden damit das aufgerufene Fenster ganz nach vorn komm und das aktive ist?
Code: Alles auswählen
sub FensterWechseln(GesuchteDatei as string)
GlobalScope.BasicLibraries.LoadLibrary("Tools")
Dim oDesktop As Object, oDocs As Object
Dim oDoc As Object, oComponents As Object
oComponents = StarDesktop.getComponents()
oDocs = oComponents.createEnumeration()
DO WHILE oDocs.hasMoreElements()
ON ERROR resume next
oDoc = oDocs.nextElement()
datei= odoc.geturl()
FileN = FileNameoutofPath(datei)
if FileN = GesuchteDatei then
print FileN
oDoc.CurrentController.Frame.getContainerWindow().setFocus
EXIT DO
end if
LOOP
end sub
Re: function fensterwaehlen() tut nicht
Verfasst: Mo, 19.01.2015 14:28
von Stephan
wenn es so wäre stünde "gelöst" vor dem Thema!
darauf würde ich mich nie verlassen, denn das ist doch garnicht immer der Fall
(ich selbst z.B. dränge auch niemanden zu dieser 'Markierung' eines Threads weil ich das garnicht für so sehr zweckmäßig halte, denn beispielsweise ist selbst wenn die konkrete Frage allein aus der Überschrift ersichtlich ist garnicht immer sicher das die Lösung der Frage entspricht, weil garnicht selten Nutzer nach etwas Konkretem fragen dann jedoch auch einen Workaround plötzlich als 'genau das was sie erreichen wollten' bezeichnen)
Was muss da noch geändert werden damit das aufgerufene Fenster ganz nach vorn komm und das aktive ist?
nichts wovon ich wüßte. Ich habs hier gerade mit OOo 3.3.0 (Win7) probiert, da geht es.
Versuche das Makro in den OO-Makrobibliotheken zu speichern und von dort zu starten, staatt aus einem Dokument heraus oder versuche statt:
Code: Alles auswählen
oDoc.CurrentController.Frame.getContainerWindow().setFocus
die Zeile:
Code: Alles auswählen
oDoc.CurrentController.Frame.getContainerWindow().toFront()
Was als workaround mit Sicherheit gehen sollte wäre es das Fenster/Dokument (oDoc) zu schliessen und sofort wieder zu öffnen, was natürlich nicht zweckmäßig ist wenn das Dokument ungespeicherte Inhalte hat und diese behalten soll.
Gruß
Stephan
Re: function fensterwaehlen() tut nicht
Verfasst: Mo, 19.01.2015 16:03
von Karolus
clag hat geschrieben:Hallo
@ Karolus
was möchtest du mit dieser Frage zum Ausdruck bringen?
obwohl es bereits vor 5 Tagen hinreichend abgehandelt wurde?
wenn es so wäre stünde "gelöst" vor dem Thema!
Wenn es
nicht so ist, wieso hakst du dort nicht nach?
Re: function fensterwaehlen() tut nicht
Verfasst: Di, 20.01.2015 19:45
von clag
Hallo Kenner und Könner,
konnte das Problem jetzt einkreisen habe aber immer noch keine Idee wie ich es verhindern kann.
das Makro zum Fensterwechsel tut soweit richtig
Code: Alles auswählen
if FileN = GesuchteDatei then
oDoc.CurrentController.Frame.getContainerWindow().setFocus
wait 2000
EXIT DO
end if
LOOP
end sub
mit dem wait() ist das gewünschte Fenster im Vordergrund
aber wenn das Makro durch ist komm wieder das Dokument in den Vordergrund woraus das Makro gestartet
Es ist Ein Tabellenereignis das das Makro startet, und da liegt wohl das Problem,
denn so wohl der Doppelklick als auch Rechtsklick sind noch nicht abgeschlossen
und darum kehrt der Fokus zum aufrufenden Dokument zurück.
ich muss aber einen Mausklick nehmen da ich auf eine Zeile zeigen muss
um dort den Dateinamen und Sprungmarke auszulesen
Wie kann ich diese Rückkehr verhindern ??
Re: function fensterwaehlen() tut nicht
Verfasst: Di, 20.01.2015 23:42
von Karolus
Hier ist die Übersetzung von
Variante2, die du offenbar vorsätzlich ignorierst.
Code: Alles auswählen
sub open_at_(event)
sheet = event.Spreadsheet
row = event.CellAddress.Row
if row <> 45 then Exit Sub
marke = sheet.getCellRangeByName("M46").String
url = "file:.............."
shell( "soffice " & url &"#"& marke )
End sub
Re: function fensterwaehlen() tut nicht
Verfasst: Mi, 21.01.2015 11:44
von clag
Hallo Karolus,
Danke für deinen Basic Code der funktioniert jetzt soweit gut
den habe ich noch verkürzt auf
Code: Alles auswählen
myUrl = event.Spreadsheet.getCellByPosition(11,5).string
Mark = event.Spreadsheet.getCellByPosition(12,row).string
shell( "soffice " & myUrl & marke )
SetWindowSize
ist das korrekte Syntax ?
Leider habe ich immer noch ein Problemchen
obwohl das Writer Dokument oben auf ist und den Focus hat
wird mit diesen Code das eigentlich hinten liegende Calc Fenster angepasst
und nicht wie von mir erwartet das oben liegende Writer Fenster
was muss ich daran ändern damit das Writer Fenster angesprochen wird?
Code: Alles auswählen
Sub SetWindowSize ' in Prozent
oDisplayAccess = CreateUnoService("com.sun.star.awt.DisplayAccess")
oDisplay = oDisplayAccess.getByIndex(0)
aScreen = oDisplay.WorkArea
nWidht = aScreen.Width
nHeight = aScreen.Height
factorX = nWidht / 100
factorY = nHeight / 100
X = 50 * factorX ' start horizontal
y = 34 * factorY ' start vertikal
w = 60 * factorX ' Breite
h = 66 * factorY ' Höhe
z = 80
oContainerWindow = thiscomponent.currentcontroller.frame.ContainerWindow
oposSize = oContainerWindow.PosSize
oContainerWindow.setPosSize(x,y,w,h,15)
end sub
Re: function fensterwaehlen() tut nicht
Verfasst: Mi, 21.01.2015 12:23
von Karolus
dein Code liegt im
CalcDokument vielleicht solltest du an der Stelle mal ....=
StarDesktop.CurrentComponent nehmen
Re: function fensterwaehlen() tut nicht
Verfasst: Mi, 21.01.2015 15:48
von clag
Hallo Karolus und wer sonst noch liest
dein letzter Tipp hat mich wieder ein Stück näher an mein Ziel gebracht
aber uhhhh es tut immer noch nicht richtig
bei der weiteren Fehlersuche habe ich jetzt die Makros aus dem Dokument in die Standard Makros verlegt
auch ohne Erfolg es wurde immer noch Calc positioniert
dann habe ich verschieden wait() eingebaut und plötzlich wurde das Writer-Fenster angesprochen ?
aber es muss mindesten
wait 1000 sein was ich schon ziemlich komisch und nervig finde
auch mag Writer nicht den ZoomValue nicht und meckert "Eigenschaft oder Methode nicht gefunden"
Calc schon und skaliert auf 80% ??
Code: Alles auswählen
sub open_at_(event)
myUrl = event.Spreadsheet.getCellByPosition(11,5).string
marke = event.Spreadsheet.getCellByPosition(12,row).string
shell( "soffice " & myUrl & marke )
call SetWindowSize
End sub
Sub SetWindowSize
wait 1000
oDisplayAccess = CreateUnoService("com.sun.star.awt.DisplayAccess")
oDisplay = oDisplayAccess.getByIndex(0)
aScreen = oDisplay.WorkArea
nWidht = aScreen.Width
nHeight = aScreen.Height
factorX = nWidht / 100
factorY = nHeight / 100
X = 50 * factorX ' start horizontal
y = 50 * factorY ' start vertikal
w = 50 * factorX ' Breite
h = 50 * factorY ' Höhe
z = 80
oContainerWindow = StarDesktop.CurrentComponent.currentcontroller.frame.ContainerWindow
oContainerWindow.setPosSize(x,y,w,h,15)
StarDesktop.CurrentComponent.Currentcontroller.ZoomValue = z
end sub
kann man das bockige Verhalten noch irgendwie abstellen, wenn ja wie ??
Re: function fensterwaehlen() tut nicht
Verfasst: Mi, 21.01.2015 16:31
von Karolus
Hallo
auch mag Writer nicht den ZoomValue nicht und meckert "Eigenschaft oder Methode nicht gefunden"
Calc schon und skaliert auf 80% ??
Mit der Hilfe von MRI und vier Mausklicks kannst du selbst herausfinden das $(
writer).CurrentController eben kein Attribut “ZoomValue“ hat.
mit drei weiteren Mausklicks kannst du dann auch herausfinden das es
$(writer).CurrentController.ViewSettings.ZoomValue gibt
Re: function fensterwaehlen() tut nicht
Verfasst: Mi, 21.01.2015 16:49
von clag
Hallo Karolus,
gut, dann ist das mit dem Zoom geklärt, das war aber im Moment nur ein zufällig bemerktes Verhalten
was mir weit mehr auf dem Gemüt liegt ist die Zwangspause wait 1000
hast da noch jemand eine Idee was der Grund sein könnte und wie man das verhindern kann?
Re: function fensterwaehlen() tut nicht
Verfasst: Mi, 21.01.2015 17:04
von Karolus
Hallo
was mir weit mehr auf dem Gemüt liegt ist die Zwangspause wait 1000
Mit der Frage mag ich mich jetzt überhaupt nicht mehr beschäftigen, weil “setWindowSize“ ist
nur dann notwendig wenn $(user) (vorher) das Writerfenster per Mausschubserei auf irgendwelche unbrauchbaren Grössen einstellt.
Re: function fensterwaehlen() tut nicht
Verfasst: Mi, 21.01.2015 17:25
von clag
Hallo Karolus
Karolus hat geschrieben:nur dann notwendig wenn $(user) (vorher) das Writerfenster per Mausschubserei auf irgendwelche unbrauchbaren Grössen einstellt.
Vielleicht soll das Fenster aber auch immer an gleicher Stelle und in gleicher Größe öffnen, unabhängig von der vorheriger Position.
aber ist schon gut
du hast zwar Bock mir irgendetwas von "unbrauchbar vorzuhalten" aber dein eigener Beitrag ist nun was? hat es dir geholfen?
mir jedenfalls nicht.
trotzdem Danke