Per Makro Buttons ausblenden

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

Moderator: Moderatoren

stommy7
**
Beiträge: 35
Registriert: Di, 27.06.2006 15:44

Per Makro Buttons ausblenden

Beitrag von stommy7 »

Hallo!

Ich bin absoluter Basicanfänger und brauche daher eine einfache Lösung die ich leicht umsetzen kann.
Ich hab 3 Buttons auf einem Tabellenblatt. Wie kann ich diese per Makro ein- und ausblenden bzw. wenigstens aktivieren und deaktivieren.

Ich bekomms einfach nicht hin.
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Per Makro Buttons ausblenden

Beitrag von komma4 »

OK, versuchen wir es mal...


in einer Calc-Datei gibt es Tabellen, diese haben 1-n "drawpage(s)" (Container für Zeichenelemente, Diagramme, Bilder - oder Formulare)
Schaltflächen befinden sich in einem dieser Formulare

an ein solches Formular kommst Du dann mit:

Code: Alles auswählen

' erste drawpage (normal auf 1 Blatt) 
' Formular normalerweise "Standard" benannt
oForm = ThisComponent.DrawPages.getByIndex(0).getForms().getByName( "Standard" ) 


Auf dieser Form befindet sich auch Deine Schaltfläche, die Du aktivieren/deaktivieren kannst:

Code: Alles auswählen

oForm.getByName( "PushButton" ).Enabled = FALSE
' 5 Sekunden warten
wait 5000
oForm.getByName( "PushButton" ).Enabled = TRUE 

Für "Ansichten" ist generell der Anzeige-Kontrolleur zuständig.
Und hier kannst Du die Sichtbarkeit einstellen

Code: Alles auswählen

oForm = ThisComponent.DrawPages.getByIndex(0).getForms().getByName( "Standard" ) 
oButton = oForm.getByName( "PushButton" )
oAnsicht = ThisComponent.getCurrentController()
oButtonAnsicht = oAnsicht.getControl( oButton )
oButtonAnsicht.Visible = TRUE ' oder: FALSE
Noch nie selbst damit gearbeitet - aber alles in 5 Minuten mit xray rausgefunden


Das hilft Dir?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
stommy7
**
Beiträge: 35
Registriert: Di, 27.06.2006 15:44

Re: Per Makro Buttons ausblenden

Beitrag von stommy7 »

Dankeschön! Das funktioniert bestens!

Was ist denn eigentlich dieses Xray und was kann man damit machen?
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Per Makro Buttons ausblenden

Beitrag von komma4 »

xray: ein (unerlässliches) Tool zur Untersuchung von Eigenschaften und Methoden eines Objekts.

Du musst die xray-Bibliotheken (nach der Installation) laden***, dann kannst Du ihm Objekte mitgeben

Code: Alles auswählen

xray ThisComponent.Sheets
zeigt Dir (bei einem Calc-Dokument) dann eben vom aktuellen Dokument das Objekt sheets - bspw. dass es dort eine Eigenschaft .Count gibt, die den Wert 3 hat, und bei den Methoden siehst Du, dass Du .getByIndex( i ) nutzen kannst...

Unbedingt ausprobieren!



***das Laden erledige ich mit dem folgenden Code,der bei mir auf einer Schaltfläche im Basic-Editor liegt:

Code: Alles auswählen

Sub XRayLaden
GlobalScope.BasicLibraries.Loadlibrary("XrayTool")
msgbox "Xray geladen / Xray loaded"
End Sub
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
stommy7
**
Beiträge: 35
Registriert: Di, 27.06.2006 15:44

Re: Per Makro Buttons ausblenden

Beitrag von stommy7 »

Mir ist grad noch ein kleiner Fehler aufgefallen. Wenn ich das Sheet wechsel und wieder zurück springe werden alle Buttons wieder angezeigt.
Wie kann ich das vermeiden bzw. wie kann ich ein Makro starten, wenn ich ein bestimmtes Sheet aktiviere?
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Per Makro Buttons ausblenden

Beitrag von komma4 »

Dafür benötigst Du einen listener. Müsste mit folgendem Beispiel gehen:

Code: Alles auswählen

' Notifies if a view of a sheet
' is changing
' scrolling, not value change
' http://www.oooforum.org/forum/viewtopic.phtml?t=5135
' SergeM
' Posted: Sat Jan 24, 2004 3:54 pm  

Global oListener As Object
Global oScalcDocument As Object

Sub SheetEventListenerOn
  oScalcDocument=ThisComponent
  'oListener = createUnoListener("OOO_","com.sun.star.lang.XEventListener")
  oListener = createUnoListener("OOO_","com.sun.star.beans.XPropertyChangeListener")
  oScalcDocument.CurrentController.addPropertyChangeListener("ActiveSheet",oListener)
End Sub

Sub SheetEventListenerOff
  oScalcDocument.CurrentController.removePropertyChangeListener("ActiveSheet",oListener
End Sub

Sub OOO_propertyChange(oEvent)
   print("OK Current Sheet has changed")
End Sub 

Ich komme nochmal auf meinen Einwand zurück, dass Daten und Anwendung an sich getrennt gehören: Schaltflächen etc. sollte IMHO nicht in einer Calc-Tabelle untergebracht werden.... Aber: mach', was Du willst :-)
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
stommy7
**
Beiträge: 35
Registriert: Di, 27.06.2006 15:44

Re: Per Makro Buttons ausblenden

Beitrag von stommy7 »

Hmm funktioniert leider noch nicht so ganz wie erhofft. Bei jedem Sheetwechsel wird nun versucht die drei Buttons auszublenden. Es liegen aber nur auf dem Sheet "EINGABE" Buttons. Wenn ich nun auf ein anderes wechsle, kommt eine Fehlermeldung, da auf diesem Sheet keine Buttons vorhanden sind. Hier nochmal der Quelltext:

Code: Alles auswählen

Global oListener As Object
Global oScalcDocument As Object

Sub SheetEventListenerOn
  oScalcDocument=ThisComponent
  'oListener = createUnoListener("OOO_","com.sun.star.lang.XEventListener")
  oListener = createUnoListener("OOO_","com.sun.star.beans.XPropertyChangeListener")
  oScalcDocument.CurrentController.addPropertyChangeListener("ActiveSheet",oListener)
End Sub

Sub SheetEventListenerOff
  oScalcDocument.CurrentController.removePropertyChangeListener("ActiveSheet",oListener
End Sub

Sub OOO_propertyChange(oEvent)
    'print("OK Current Sheet has changed")
   
    oForm = ThisComponent.DrawPages.getByIndex(1).getForms().getByName( "Standard" ) 
	oButton = oForm.getByName( "PushButton2" )
	oAnsicht = ThisComponent.getCurrentController()
	oButtonAnsicht = oAnsicht.getControl( oButton )
	oButtonAnsicht.Visible = FALSE
	
	oForm = ThisComponent.DrawPages.getByIndex(1).getForms().getByName( "Standard" ) 
	oButton = oForm.getByName( "PushButton3" )
	oAnsicht = ThisComponent.getCurrentController()
	oButtonAnsicht = oAnsicht.getControl( oButton )
	oButtonAnsicht.Visible = FALSE
	
	oForm = ThisComponent.DrawPages.getByIndex(1).getForms().getByName( "Standard" ) 
	oButton = oForm.getByName( "PushButton4" )
	oAnsicht = ThisComponent.getCurrentController()
	oButtonAnsicht = oAnsicht.getControl( oButton )
	oButtonAnsicht.Visible = FALSE

End Sub
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Per Makro Buttons ausblenden

Beitrag von komma4 »

Ja - der Code reagiert auf jeden sheet-Wechsel. Du musst halt abfragen, ob gerade das Blatt mit Deinen Schaltflächen angezeigt wird ('tschuldige; ich habe Deinen Einwand "absoluter Anfänger" vergessen/verdrängt).
Und gliedere den Code noch einfach etwas; lagere die Ausschalt-Anweisungen in eine eigene Routine aus.

Code: Alles auswählen

Global oListener As Object
Global oScalcDocument As Object
Private oAnsicht
Private oForm


' --------------------------------------------------
Sub SheetEventListenerOn
  oScalcDocument=ThisComponent
  'oListener = createUnoListener("OOO_","com.sun.star.lang.XEventListener")
  oListener = createUnoListener("OOO_","com.sun.star.beans.XPropertyChangeListener")
  oScalcDocument.CurrentController.addPropertyChangeListener("ActiveSheet",oListener)
End Sub

Sub SheetEventListenerOff
  oScalcDocument.CurrentController.removePropertyChangeListener("ActiveSheet",oListener
End Sub

Sub OOO_propertyChange(oEvent)
    'print("OK Current Sheet has changed")
   
' nur bei einem bestimmten Blatt aktiv werden
If ThisComponent.getCurrentController().getActiveSheet().Name <> "EINGABE" Then
  Exit sub 
End If

call ausblendenDreiButtons

End Sub 

' --------------------------------------------------
Sub ausblendenDreiButtons()
' setzen FORMULAR und ANSICHT
' oForm am Anfang definiert; gilt für gesamtes Modul
oForm = _
  ThisComponent.DrawPages.getByIndex(1).getForms().getByName( "Standard" ) 
' oAnsicht am Anfang definiert; gilt für gesamtes Modul
oAnsicht = ThisComponent.getCurrentController()

' oButton NICHT definiert; wird immer neu gesetzt
oButton = oForm.getByName( "PushButton2" )
call ausblendenRoutine( oButton ) 
oButton = oForm.getByName( "PushButton3" )
call ausblendenRoutine( oButton ) 
oButton = oForm.getByName( "PushButton4" )
call ausblendenRoutine( oButton ) 


End Sub 

' --------------------------------------------------
Sub ausblendenRoutine( oKontrollObject as Object )

' oButtonAnsicht NICHT definiert; gilt nur in dieser SUB
oButtonAnsicht = oAnsicht.getControl( oKontrollObject )
oButtonAnsicht.Visible = FALSE

End Sub
' --------------------------------------------------
Nun?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
stommy7
**
Beiträge: 35
Registriert: Di, 27.06.2006 15:44

Re: Per Makro Buttons ausblenden

Beitrag von stommy7 »

hmm irgendwie verschwinden die Buttons nun auch schon, wenn ich nur scrolle.

Scheint noch ein kleiner Bug zu sein....
Antworten