Symbolleisten ausblenden und wieder einblenden

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

Moderator: Moderatoren

MaddinR
***
Beiträge: 61
Registriert: So, 06.03.2011 11:15

Symbolleisten ausblenden und wieder einblenden

Beitrag von MaddinR »

Hallo liebe Leute

Mit dem folgenden Codezeilen blende ich am Anfang meines "Programms XYZ" und beim Öffnen des Views die Symbolleisten aus

Code: Alles auswählen

Sub xyz
        mach_dieses_und_jenes()
        tu_hier_von_auch_was()
        arbeite = schoen + fleissig * sinnvoll

       Symbolleisten_setVisible(false)

        Und_jetzt_ist_fertig()
END SUB

'========================================

SUB Symbolleisten_setVisible(bShow)
	DIM oLayout AS OBJECT
	DIM i AS INTEGER
	DIM s AS STRING

	oLayout = StarDesktop.getCurrentFrame().oFrame.LayoutManager

	oLayout.visible = true
	aListe = layout.getElements()

	FOR i = 0 to uBound(aListe)
		s = aListe(i).ResourceUrl
		
		if bShow = FALSE Then
			oLayout.hideElement(s)			
		else
			oLayout.showElement(s)			
		end if
	NEXT	
END SUB

'========================================
Dumm ist, wenn ich dann wieder in den Entwurfsmodus des Formulares gehe, um dort Änderungen durchzuführen, sind dort auch immer alle Symbolleisten weg. Also jedesmal nach einem Testlauf wieder über "Ansicht-Symbolleisten" jede benötige Symbolleiste wieder aktivieren. Das nervt...

Deshalbe würde ich gerne mit dem Funktionsaufruf Symbolleisten_setVisible(true) die Symbolleisten bei Beenden meines Formulars wieder aktivieren, damit sie eben im normalen Entwicklermodus auch wieder sichtbar sind. Ich habe dazu schon das Array "aListe()" public direkt ausserhalb des Sub deklariert und am Programmanfang einmal initial gefüllt. Aber ich weiss nicht, wie ich jetzt beim Schließen des Formulars im Anwendermodus (!) genau die vorher ausgeblendeten Symbolleisten wieder einblenden kann. Gibts da eine Benachrichtigung, an die ich einen Eventhandler binden kann, der dann aufgerufen wird, wenn rechts-oben das "Schließen-X" betätigt wird? Es funktioniert tadellos, wenn ich Symbolleisten_setVisible(true) und Symbolleisten_setVisible(false) im Wechsel und mit einigen sekunden Pause aufrufe... ein- und ausblenden klappt echt prima... nur brauch ichs eben nur jeweils einmal am Anfang dieses Formulars und einmal am Ende.

vg, Maddin



Moderation,4: verschoben in BASIC-Unterbereich, wo alle Makro-Fragen hin gehören
ejomi
***
Beiträge: 84
Registriert: Mi, 06.09.2006 15:20

Re: Symbolleisten ausblenden und wieder einblenden

Beitrag von ejomi »

MaddinR hat geschrieben:Das nervt...
... jou - kenn' ich! Deshalb hatte ich mir mal seinerzeit eine Universal-Routine geschrieben, die ich hiermit der Allgemeinheit zur Verfügung stelle (siehe weiter unten).

Das Makro selbst muss mit dem Formular-Event "Dokument öffnen" (zu finden im Hauptmenü "Extras/Anpassen", Registerkarte "Ereignisse") verknüpft werden. Dann startet es automatisch sowohl im Normalbetrieb als auch in der Entwurfs-Ansicht des Formulars.

Der eigentliche Trick ist, dass man mit der CurrentController-Methode "isFormDesignMode()" feststellen kann, ob das Formular im Entwurfsmodus geöffnet ist.

Desweiteren werden mit dem Makro gezielt einzelne Symbolleisten nach ihrem eindeutigen Namen geöffnet bzw. geschlossen. Damit wird verhindert, dass je nach Laune des vorherigen Benutzers dem nächsten Benutzer Symbolleisten gezeigt oder vorenthalten werden, die er vielleicht garnicht möchte oder eben umgekehrt.

Einzelheiten wurden von mir in den Code-Remarks ausführlich dokumentiert - viel Spaß!

Gruß: ejomi

Code: Alles auswählen

Sub OnOpenAnyForm()

  Dim n As Integer, bDraftMode As Boolean, sMenuBarRoot As String, sToolBarsRoot As String
  Dim sResource As String, strURL As String, sToolbarName() As String
  Dim oCurrCtrl As Object, oLayoutMan As Object

  ' Array mit allen interessierenden Symolleisten-Namen (ausser Menubar) zusammenstellen:
  sToolbarName = Array("formdesign","formcontrols","moreformcontrols")

  ' Stammverzeichnis der Hauptmenueleiste:
  sMenuBarRoot = "private:resource/menubar/"

  ' Stammverzeichnis aller anderen Symbolleisten:
  sToolBarsRoot = "private:resource/toolbar/"

  ' Handle zum Controller-Objekt des aktuell geoeffneten Formulars:
  oCurrCtrl = ThisComponent.CurrentController

  ' Pruefen, ob das Formular im Entwurfsmodus vorliegt:
  bDraftMode = oCurrCtrl.isFormDesignMode()

  ' Der Layout-Manager des aktuell geoeffneten Formulars:
  oLayoutMan = oCurrCtrl.Frame.LayoutManager
 'oLayoutMan = StarDesktop.getCurrentFrame().LayoutManager


  If bDraftMode = True Then
    ' ---- FORMULAR IM ENTWURFS-MODUS ----

    ' Empfehlung: Warnton zur Kontrolle - nach sehr vielen Code-Aenderungen erkennt OO manchmal
    ' den Entwurfs-Modus des Formulars nicht mehr - da hilft dann nur noch ein Neustart!):
    Beep

    ' Muss nicht sein (ehrlich gesagt - ich weiss auch nicht, wozu das gut sein soll):    
	'oLayoutMan.visible = True
  	
  	' Die Menueleiste muss separat eingeschaltet werden:
  	sResource = sMenuBarRoot & "menubar"
      ' Moeglicherweise muss erst die Symbolleiste noch erzeugt werden:
    If IsNull(oLayoutMan.getElement(sResource)) Then oLayoutMan.createElement(sResource)

    ' ... und zeigen:
    oLayoutMan.showElement(sResource)
 
	' Alle oben vordefinierten Symolleisten durchklappern:   
    For n = 0 To Ubound(sToolbarName())
       sResource = sToolBarsRoot & sToolbarName(n)
       ' Moeglicherweise muss erst die Symbolleiste noch erzeugt werden:
       If IsNull(oLayoutMan.getElement(sResource)) Then oLayoutMan.createElement(sResource)
       ' ... und zeigen:
       oLayoutMan.showElement(sResource)
    Next n

  Else
    ' ---- FORMULAR IM ARBEITS-MODUS ----

    ' Hauptmenueleiste muss separat ausgeschaltet werden (falls gewuenscht):
   	oLayoutMan.hideElement(sMenuBarRoot & "menubar")

    ' Diese Schleife schaltet  a l l e  Symbolleisten aus:
    For n = 0 To UBound(oLayoutMan.Elements) 
       strURL=oLayoutMan.Elements(n).ResourceURL 
       oLayoutMan.hideElement(strURL)
    Next n

    ' Die folgende Schleife schaltet nur die oben definierten Symbolleisten aus
    ' wobei zu bedenken ist, dass Symbolleisten aus einer vorangegangenen Sitzung
    ' sichtbar bleiben koennten, die man vielleicht jetzt garnicht mehr moechte:
    ' For n=1 To Ubound(sToolbarName())
    '    sResource = sToolBarsRoot & sToolbarName(n)
    '    oLayoutMan.hideElement(sResource)
    ' Next n

  EndIf

  '  --- Nachtrag ---
  '  Hier mal noch die Pfade/Namen der wichtigsten Symbolleisten:
  
  '  private:resource/menubar/menubar 'Haupt-Menue
  '  private:resource/statusbar/statusbar 'Statusleiste

  '  private:resource/toolbar/standardbar ' Standard-Symbolleiste
  '  private:resource/toolbar/viewerbar ' Standard-Symbolleiste (lesen)

  '  private:resource/toolbar/textobjectbar ' Format
  '  private:resource/toolbar/numobjectbar 'Absatz-Nummerierung und Aufzaehlung
  '  private:resource/toolbar/frameobjectbar 'Rahmen
  '  private:resource/toolbar/tableobjectbar 'Tabelle
  '  private:resource/toolbar/insertbar  'Einfuegen
  '  private:resource/toolbar/toolbar 'Werkzeugleiste (Standard)

  '  private:resource/toolbar/formdesign 'Formular-Entwurf
  '  private:resource/toolbar/formcontrols 'Formular-Steuerelemente
  '  private:resource/toolbar/formsnavigationbar  'Datensatz-Navigation (Formular)

  '  private:resource/toolbar/graphicobjectbar 'Bildbearbeitungs-Werkzeug
  '  private:resource/toolbar/drawingobjectbar 'Zeichnungsobjekt-Eigenschaften
  '  private:resource/toolbar/drawtextobjectbar 'Textobjekt

  '  private:resource/toolbar/drawbar  ' Zeichnen
  '  private:resource/toolbar/alignmentbar ' Objekt-Ausrichtung
  '  private:resource/toolbar/mediaobjectbar ' Medien-Wiedergabe

  '  private:resource/toolbar/oleobjectbar  'OLE-Objektt
  '  private:resource/toolbar/fontworkobjectbar 'Fontwork
  '  private:resource/toolbar/extrusionobjectbar '3D-Einstellungen

End Sub
ejomi
***
Beiträge: 84
Registriert: Mi, 06.09.2006 15:20

Re: Symbolleisten ausblenden und wieder einblenden

Beitrag von ejomi »

Noch ein kleiner Nachtrag - ist aber Geschmacksache, ob man's mag:

Die im Formularfenster angedockten Symbolleisten sind nicht immer der Hit und können sensiblen Menschen (wie mich :lol: ) bei der Formular-Gestaltung stören. Wozu habe ich denn einen Wide Screen Monitor? Also lasse ich die Symbolleisten irgendwo in der Gegend schweben und schone meine Augen ...

Ich hatte oben eine veraltete Code-Fassung einkopiert die nur Symbolleisten ein-/ausblendet und sonst nichts. Verwendet man aber frei schwebende Symbolleisten, dann werden diese (trotz vorheriger Positionierung von Hand) bei jedem Neustart von OO relativ wahllos auf dem Bildschirm verteilt - manchmal sogar ziemlich unschön mitten über dem Hauptmenü oder der Titel-Leiste.

Die hier vorgestellte Variante ist nur eine Ergänzung meines bereits oben geposteten Codes. Damit positioniert die Routine die Symbolleisten immer an die gleiche Stelle des Bilschirms. Dazu wird vorher mit meiner Funktion "GetActFrmPos" die Bildschirmposition des betreffenden Formulars ermittelt und dann die Symbolleisten relativ zu diesem ermittelten Standort positioniert.

... aber wie gesagt: wer's braucht - bei angedockten Symbolleisten kann man darauf natürlich komplett verzichten!

Gruß: ejomi

Hier die notwendige Zusatzfunktion zum Ermitteln der Formular-Position:

Code: Alles auswählen

Function GetActFrmPos(oFrmCtrl) As New com.sun.star.awt.Rectangle

	' Funktion "GetActFrmPos", Autor: EJOMI
	'     Ermittelt die Position und Groesse eines Formulars

	' Uebergabeparameter:
	'     Objekt-Handle des fraglichen Formular-Controllers
	' Rueckgabe:
	'     X/Y-Pos und Breite/Hoehe als Rectangle-Strukt.
	'     Die Werte muessen im aufrufenden Programm von einer
	'     als Rectangle deklarierten Variablen eingelesen werden
	'     und sind dort als .Y, .X, .Width und .Height nutzbar.

	On Error GoTo ScrErr
	
	Dim oFrame As Object, oWin As Object, aRectVal As New com.sun.star.awt.Rectangle
	
	oWin = oFrmCtrl.Frame.getContainerWindow()

	With aRectVal	
		.X = oWin.PosSize.X
		.Y = oWin.PosSize.Y
		.Width = oWin.PosSize.Width
		.Height = oWin.PosSize.Height
	End With
	
	GetActFrmPos = aRectVal
Exit Function
ScrErr:
	MsgBox "Formular-Pos. konnte nicht ermittelt werden!", MB_ICONSTOP, "Func. 'GetActFrmPos'"
End Function
.. und jetzt die Erweiterungen für meine bereits vorgestellte Routine "OnOpenAnyForm":

Code: Alles auswählen

  Dim bFloatingTBs As Boolean, iYOffset As Integer, iXOffset As Integer, iToolbarPos() As Integer
  Dim aTBarPos As New com.sun.star.awt.Point, aFormPos As New com.sun.star.awt.Rectangle

  ' Schalter um Symbolleisten schweben zu lassen (oder nicht):
  bFloatingTBs = True

  ' Horizal- und Vertikal-Offset von links bzw. von oben fuer alle Symbolleisten:
  iXOffset = 500
  iYOffset = 2

  ' Array mit allen horizontalen Positionen der unten definierten Symolleisten zusammenstellen:
  iToolbarPos = Array(0,460,830)

  ' Array mit allen interessierenden Symolleisten-Namen (ausser Menubar) zusammenstellen:
  sToolbarName = Array("formdesign","formcontrols","moreformcontrols")

  ' Fensterposition des Formulars mit der Funktion "GetActFrmPos" ermitteln:
  If bFloatingTBs Then aFormPos = GetActFrmPos(oCurrCtrl)


  ' In die Schleife, mit der die Symbolleisten angezeigt werden, folgendes einfuegen:

       If bFloatingTBs Then 
          ' Moeglicherweise zuvor angedockte Symbolleiste jetzt frei schweben lassen:
          oLayoutMan.floatWindow(sResource)
          ' ... und relativ zum aktuellen Formular positionieren:
          With aTBarPos
            .X = (aFormPos.X * -1) + iXOffset + iToolbarPos(n)
            .Y = (aFormPos.Y * -1) + iYOffset
          End With
          oLayoutMan.setElementPos(sResource,aTBarPos)
      EndIf

  ' Lineale im Formular-Entwurf sind auch so 'ne dolle Sache - ich will's nicht:
       With oFrmObj.ViewSettings
           .ShowHoriRuler = False
           .ShowVertRuler = False
       End With
MaddinR
***
Beiträge: 61
Registriert: So, 06.03.2011 11:15

Re: Symbolleisten ausblenden und wieder einblenden

Beitrag von MaddinR »

Wieso denn als Gast...?... ich war doch angemeldet..... *hmmmm*..... merkwürdig..... :?
Antworten