Symbolleisten Ausblenden per Makro

Hallo *,

ich nutze für Datenbanken manchmal die Möglichkeit, bei Formularen alle
Symbolleisten auszublenden. Macht sich bei Formularen für viele Leute
besser.

Jetzt bin ich auf eine recht merkwürdige Symbolleistenkonstruktion
gestoßen. Normalerweise sind die leisten an der sogenannten
"ResourceURL" zu erkenne. Die wird auch als String ausgegeben. In meinem
Testfall bekam ich die Symbolleiste von LibreLogo aber nicht
ausgeblendet. Statt der URL lieferte mir die msgbox immer eine 0 als URL
- nichts weiter möglich. Bei einer Recherche mit XRay konnte ich die
URL
sehen, aber der Datentyp für die URL war merkwürdigerweise als INTEGER
angegeben.

Ich kann jetzt die Leiste natürlich per Hand ausstellen. Ich kann auch
eine Bugmeldung aufgeben. Nur wen interessiert schon LibreLogo. Viel
interessanter wäre für mich: Warum kann XRay die URL als Text auslesen,
während ich das innerhalb von Makros nicht geregelt bekomme?

Gruß

Robert

Hallo Robert,

ich würde gerne mal versuchen, ob ich etwas rauskriege, sowas reizt mich, möchte aber ungern bei Null anfangen. Kannst du mir deinen Testfall schicken?

Gruß
Gerhard

Hallo Gerhard,

ich würde gerne mal versuchen, ob ich etwas rauskriege, sowas reizt
mich, möchte aber ungern bei Null anfangen. Kannst du mir deinen
Testfall schicken?

Lass Dir die Symbolleiste für LibreLogo anzeigen (im Writer einzustellen
- nutze ich gerade in der Schule)

Ich gehe davon aus, dass Du xray laufen hast.

SUB Test
  DIM oFrame AS OBJECT
  oFrame = StarDesktop.getCurrentFrame()
  oWin = oFrame.getContainerWindow()
  xray oFrame.LayoutManager
  msgbox oFrame.LayoutManager.Elements(0).ResourceURL
END SUB

Ich habe da schon Umwandlungen in Strings versucht, aber die kommen
natürlich zu spät. Wenn Basic da eine Zahl als Variable vorgegaukelt
bekommt, dann macht es die auch daraus. Nur xray kann tatsächlich einen
Pfad entdecken.

Gruß

Robert

Hallo Robert,

ich habe ein bisschen Licht uin das Thema bringen können.
LibreLogo wird offenbar behandelt wie eine Extension. Vielleicht ist es echnisch auch eine, aber das bleibe mal dahingestellt. Da stehen natürlich die eventuellen Symbolleisten woanders als bei den von LibO selbst mitgelieferten, also kein Wunder, dass da etwas anders ist.
Xray liest nun nicht einfach das Attribut string oder - im Fall von LibreLogo und anderen Erweiterungen - integer, sondern verwendet die Introspektion. Tatsächlich hat die Eigenschaft integer sowohl bei der Symbolleiste von LibreLogo wie auch der anderen Erweiterung, die ich angeschaut habe, den Wert 24, das identifiziert die Erweiterung also nicht. Die Introspektion kriegt als Input das ganze Objekt, da muss irgendwo die Info drinstecken, aber möglicherweise ist sie eben nicht über ein Attribut erreichbar.

Ich habe den Weg, den Xray geht, der natürlich wesentlich komplexer ist und den ich auch nicht völlig verstehe, zusammengefasst, das sind die nicht eingerückten Zeilen. Die Symbolleiste von LibreLogo ist bei mir auf Index 5.
Die Zeile in Kommentar kann man mal testweise ausführen, dann bringt aber die nächste einen Fehler, der Grund ist vielleicht der gleiche wie dafür, dass man innerhalb Xray nicht Xray aufrufen darf.
Wenn du die Logik des Programms einsetzen willst, musst du eventuell noch ein bisschen was abfragen, damit keine Fehler erzeugt werden; vielleicht genügt es, wenn du abfragst, ob VARTYPE(vari) = 8, d.h. "string" ist, du willst ja wohl die Namen der Symbolleisten abfragen.

SUB Test
    DIM oFrame AS OBJECT
    oFrame = StarDesktop.getCurrentFrame()
    oWin = oFrame.getContainerWindow()
obj = oFrame.LayoutManager.Elements(5)
invoc =  CreateUnoService("com.sun.star.script.Invocation")
invocCurrObj = invoc.createInstanceWithArguments(Array(obj))
'Xray invocCurrObj 'nur mal zum Testen, wenn das aktiv ist, bringt der nächste Befehl Fehler
vari = invocCurrObj.getValue("ResourceURL")
Xray vari

end sub

Viele Grüße
Gerhard

Hallo Gerhard,

Wenn du die Logik des Programms einsetzen willst, musst du eventuell
noch ein bisschen was abfragen, damit keine Fehler erzeugt werden;
vielleicht genügt es, wenn du abfragst, ob VARTYPE(vari) = 8, d.h.
"string" ist, du willst ja wohl die Namen der Symbolleisten abfragen.

Wichtig ist für mich lediglich, dass anschließend keine Symbolleisten
mehr zu sehen sind. Und das bekomme ich eben bei dieser Symbolleiste
nicht geregelt, da ich sie über die URL auf unsichtbar schalten will.
Ist aber in der Praxis erst einmal nicht so wild, weil die Zielgruppe
sowieso keine Erweiterungen und auch kein LibreLogo nutzen wird.

Ich mache das Ganze jetzt so:

SUB Symbolleisten_Ausblenden
  DIM oFrame AS OBJECT
  DIM oWin AS OBJECT
  DIM oLayoutMng AS OBJECT
  DIM aElemente()
  oFrame = StarDesktop.getCurrentFrame()
  oFrame.setTitle "Titel des Fensters"
  oWin = oFrame.getContainerWindow()
  oWin.IsMaximized = true
  oLayoutMng = oFrame.LayoutManager
  aElemente = oLayoutMng.getElements()
  FOR i = LBound(aElemente) TO UBound(aElemente)
    oLayoutMng.hideElement(aElemente(i).ResourceURL)
  NEXT
  ThisComponent.CurrentController.Sidebar.Visible = False
  ThisComponent.CurrentController.ViewSettings.ZoomValue = 200
  ThisComponent.CurrentController.ViewSettings.ShowRulers = False
  ThisComponent.CurrentController.ViewSettings.ShowParaBreaks = False
END SUB

SUB Symbolleisten_Einblenden
  DIM oFrame AS OBJECT
  DIM oLayoutMng AS OBJECT
  DIM aElemente()
  oFrame = StarDesktop.getCurrentFrame()
  oLayoutMng = oFrame.LayoutManager
  aElemente = oLayoutMng.getElements()
  FOR i = LBound(aElemente) TO UBound(aElemente)
    oLayoutMng.showElement(aElemente(i).ResourceURL)
  NEXT
  ThisComponent.CurrentController.Sidebar.Visible = True
  ThisComponent.CurrentController.ViewSettings.ZoomValue = 100
  ThisComponent.CurrentController.ViewSettings.ShowRulers = True
  ThisComponent.CurrentController.ViewSettings.ShowParaBreaks = True
END SUB

Für das Zeigen bzw. verstecken eines Elements ist nun einmal die
ResourceURL notwendig. Für das Handbuch wäre es natürlich schön, genauer
zu wissen, wie ich die anderen auch verstecken und wieder hervorholen
kann. Ich dachte eigentlich, dass der Verweis auf das Element reichen
müsste ( so wie "getByIndex").

Gruß

Robert

Hallo Robert,

das geht schon, aber du musst halt die URL auf dem Weg ermitteln, wie es Xray macht, damit du auch die URLs der Extensions und Addons erwischst. Im folgenden Makro schalte ich die LibreLogo-Leiste aus und nach zwei Sekunden wieder an:

SUB Test
    DIM oFrame AS OBJECT
    oFrame = StarDesktop.getCurrentFrame()
    oWin = oFrame.getContainerWindow()
    aElemente = oFrame.LayoutManager.getElements()
    FOR i = LBound(aElemente) TO UBound(aElemente)
        obj = aElemente(i)
        invoc =  CreateUnoService("com.sun.star.script.Invocation")
        invocCurrObj = invoc.createInstanceWithArguments(Array(obj))
        resourceURL= invocCurrObj.getValue("ResourceURL")
        if resourceURL= "private:resource/toolbar/addon_LibreLogo.OfficeToolBar" then
            oFrame.LayoutManager.hideElement(resourceURL)
            wait 2000
            oFrame.LayoutManager.showElement(resourceURL)
        end if
    next
end sub

Das Makro ist sicher noch nicht wasserdicht, aber das Prinzip ist klar.

Gruß
Gerhard

Hallo Gerhard,

SUB Test
    DIM oFrame AS OBJECT
    oFrame = StarDesktop.getCurrentFrame()
    oWin = oFrame.getContainerWindow()
    aElemente = oFrame.LayoutManager.getElements()
    FOR i = LBound(aElemente) TO UBound(aElemente)
        obj = aElemente(i)
        invoc =  CreateUnoService("com.sun.star.script.Invocation")
        invocCurrObj = invoc.createInstanceWithArguments(Array(obj))
        resourceURL= invocCurrObj.getValue("ResourceURL")
        if resourceURL=
"private:resource/toolbar/addon_LibreLogo.OfficeToolBar" then
            oFrame.LayoutManager.hideElement(resourceURL)
            wait 2000
            oFrame.LayoutManager.showElement(resourceURL)
        end if
    next
end sub

Das Makro ist sicher noch nicht wasserdicht, aber das Prinzip ist klar.

Wieso nicht wasserdicht? Wenn es den Fall mit abdeckt, den ich Dir
genannt habe, ist es doch besser geeignet als das Script, das ich nutze.

Gruß

Robert

Hallo Robert,

Hallo Gerhard,

SUB Test
    DIM oFrame AS OBJECT
    oFrame = StarDesktop.getCurrentFrame()
    oWin = oFrame.getContainerWindow()
    aElemente = oFrame.LayoutManager.getElements()
    FOR i = LBound(aElemente) TO UBound(aElemente)
        obj = aElemente(i)
        invoc =  CreateUnoService("com.sun.star.script.Invocation")
        invocCurrObj = invoc.createInstanceWithArguments(Array(obj))
        resourceURL= invocCurrObj.getValue("ResourceURL")
        if resourceURL=
"private:resource/toolbar/addon_LibreLogo.OfficeToolBar" then
            oFrame.LayoutManager.hideElement(resourceURL)
            wait 2000
            oFrame.LayoutManager.showElement(resourceURL)
        end if
    next
end sub

Das Makro ist sicher noch nicht wasserdicht, aber das Prinzip ist klar.

Wieso nicht wasserdicht? Wenn es den Fall mit abdeckt, den ich Dir
genannt habe, ist es doch besser geeignet als das Script, das ich nutze.

Gruß

Robert

Ich würde "if resourceURL..." in eine weitere Bedingung einschließen:
if VarType(resourceURL) = 8 then
...
end if
weil die Variable resourceURL an sich Variant ist (ich habe mich ja um die Deklarationen nicht gekümmert, aber das weiß ich aus Xray) und ich nicht sicher bin, was beim Vergleich mit String eventuell passieren kann, wenn da etwas anderes kommen sollte. SOnst fällt mir momentan auch nichts ein, die Aussage sollte auch eine Warnung sein, weil das ja doch schnell zusammengebaut ist.

Gruß
Gerhard