function fensterwaehlen() tut nicht

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

Moderator: Moderatoren

clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

function fensterwaehlen() tut nicht

Beitrag 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 ??
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: function fensterwaehlen() tut nicht

Beitrag von Stephan »

Code: Alles auswählen

kann mir jemand sagen was da falsch läuft ??
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
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: function fensterwaehlen() tut nicht

Beitrag von Karolus »

Hallo

@clag
Wieso startest du das Thema (nochmal), obwohl es bereits vor 5 Tagen hinreichend abgehandelt wurde?

Karolus
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: function fensterwaehlen() tut nicht

Beitrag 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
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: function fensterwaehlen() tut nicht

Beitrag 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
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: function fensterwaehlen() tut nicht

Beitrag 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?
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: function fensterwaehlen() tut nicht

Beitrag 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 ??
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: function fensterwaehlen() tut nicht

Beitrag 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
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: function fensterwaehlen() tut nicht

Beitrag 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
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: function fensterwaehlen() tut nicht

Beitrag von Karolus »

Code: Alles auswählen

Mark  .... marke 
:?:

Code: Alles auswählen

..... = thisComponent.....
dein Code liegt im CalcDokument vielleicht solltest du an der Stelle mal ....= StarDesktop.CurrentComponent nehmen
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: function fensterwaehlen() tut nicht

Beitrag 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 ??
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: function fensterwaehlen() tut nicht

Beitrag 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
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: function fensterwaehlen() tut nicht

Beitrag 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?
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: function fensterwaehlen() tut nicht

Beitrag 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.
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: function fensterwaehlen() tut nicht

Beitrag 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
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Antworten