[Gelöst]Base Unterformular mit Makro ausblenden

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

Moderator: Moderatoren

ghostman
*
Beiträge: 11
Registriert: So, 28.09.2014 10:29

[Gelöst]Base Unterformular mit Makro ausblenden

Beitrag von ghostman »

Moin allerseits

Normalerweise versuche ich meine Probleme selbst mit Tante Google zu lösen, hier komme ich aber nicht weiter. Nachstehendes Makro habe ich hier im Forum gefunden und angepasst.

Code: Alles auswählen

Sub AusblendenFormDatenOrteSubZeittafelBilder

Dim oDoc as Object, oController as Object, oForm as Object, oSubForm as Object, oSubSubForm as Object, oControlEinAus as Object, oControlBedingung as Object, oView as Object
   
    oDoc = thisComponent
    oController = oDoc.getCurrentController()
    oForm = odoc.drawpage.forms.getbyName("FormDatenOrte")
    oSubForm = oForm.getByName("FormDatenOrteSubZeittafel")
    oSubSubForm = oSubForm.getByName("FormDatenOrteSubZeittafelBilder")
    oControlBedingung =  oForm.getByName("chkbox")
    if oControlBedingung.state = 1   then
    oControlEinAus = oSubSubForm.getByName("fldBildpfadGrafisch")
    oView = oController.getControl(oControlEinAus)
    oView.visible = true
   
    ELSE
    oControlEinAus = oSubSubForm.getByName("fldBildpfadGrafisch")
    oView = oController.getControl(oControlEinAus)
    oView.visible = false
	endif
End Sub
So weit so gut. Nur wenn ich jedes Feld einzeln ausblenden muss, dann...
Nun dachte ich mir, ich passe das Makro wie folgt an und blende gleich das ganze SubForm "FormDatenOrteSubZeittafelBilder" aus.

Code: Alles auswählen

Sub AusblendenFormDatenOrteSubZeittafelBilder

Dim oDoc as Object, oController as Object, oForm as Object, oSubForm as Object, oControlEinAus as Object, oControlBedingung as Object, oView as Object
   
    oDoc = thisComponent
    oController = oDoc.getCurrentController()
    oForm = odoc.drawpage.forms.getbyName("FormDatenOrte")
    oSubForm = oForm.getByName("FormDatenOrteSubZeittafel")
    Rem oSubSubForm = oSubForm.getByName("FormDatenOrteSubZeittafelBilder")
    oControlBedingung =  oForm.getByName("chkbox")
    if oControlBedingung.state = 1   then
    oControlEinAus = oSubForm.getByName("FormDatenOrteSubZeittafelBilder")
    oView = oController.getControl(oControlEinAus) <--- Hier erhalte ich eine Fehlermeldung beim aktivieren der ChkBox!!!
    oView.visible = true
   
    ELSE
    oControlEinAus = oSubForm.getByName("FormDatenOrteSubZeittafelBilder")
    oView = oController.getControl(oControlEinAus) <--- Hier erhalte ich eine Fehlermeldung beim deaktivieren der ChkBox!!!
    oView.visible = false
	endif
End Sub
Weiss jemand von Euch, was ich falsch mache?
Bin für jeden Tipp Dankbar und muss zugeben, dass ich die Makrosprache (noch) nicht wirklich verstanden habe.

Besten Dank
Alex
Zuletzt geändert von ghostman am Mo, 06.10.2014 07:11, insgesamt 1-mal geändert.
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Base Unterformular mit Makro ausblenden

Beitrag von F3K Total »

Hi,
ganze Formulare kann man nicht als ein Element ausblenden.
Es geht aber, das entsprechende Formular zu durchsuchen und alle darauf liegenden Elemente auszublenden.
Anbei ein einfaches Beispiel um ein Subformular auszublenden.
  • Platziere auf dem Hauptformular zwei Optionsfelder, benenne eines mit Einblenden eines mit Ausblenden
  • Ordne diesen Feldern jeweils zum Ereignis Status geändert das folgende Makro zu.
Ggf. müssen die Bezeichnungen der Formulare angepasst werden.

Code: Alles auswählen

Sub S_SHOW_HIDE_OPT(Event)
    ofrmGROUPS = ThisComponent.drawpage.forms.getbyname("frmGROUPS")
    ofrmGROUP_PARTS = ofrmGROUPS.getbyname("frmGROUP_PARTS")
    oOpt =  Event.Source
    if oOpt.State then
        if oOpt.model.Label = "Einblenden" then bShow = true else bShow = false
        for i = 0 to ofrmGROUP_PARTS.Count -1
            ofrmGROUP_PARTS(i).EnableVisible = bShow
        next i
    endif
End Sub
Edit: Variante zwei, mit einem Markierfeld (Checkbox)
  • Platziere auf dem Hauptformular ein Markierfeld, benenne es z.B mit Ein-/Ausblenden
  • Ordne diesem Feld zum Ereignis Status geändert das folgende Makro zu.
Ggf. müssen die Bezeichnungen der Formulare angepasst werden.

Code: Alles auswählen

Sub S_SHOW_HIDE_CHK(Event)
    oMainForm = ThisComponent.drawpage.forms.getbyname("MainForm")
    oSubForm = oMainForm.getbyname("SubForm")
    ochkbox =  Event.Source
    if ochkbox.State = 1 then bShow = true else bShow = false
    for i = 0 to oSubForm.Count -1
        oControl = oSubForm(i)
        oControl.EnableVisible = bShow
    next i
End Sub
HTH R
ghostman
*
Beiträge: 11
Registriert: So, 28.09.2014 10:29

Re: Base Unterformular mit Makro ausblenden

Beitrag von ghostman »

Danke F3K Total

Eine Frage voraus, warum benötigt Deine Variante 1 eine "Endif" Anweisung und Variante 2 nicht?
Meine Theorie, wenn die IF Anweisung auf einer Zeile steht wird kein Endif benötigt :roll:

Nach etwas Bastelei funktioniert Variante 2 ganz gut, zumindest mit dem einem SubSubForm. Beim zweiten "SubForm" bekomme ich aber eine "Basic Laufzeit" Fehlermeldung:
Eigenschaft oder Methode nicht gefunden: EnableVisible.
Das "MainForm" hat unter anderem ein "SubForm". Dem "Subform" ist ein TabSteuerElem. und ein "SubSubForm" zugeordnet.

Code: Alles auswählen

Sub AusblendenFormDatenOrteSubZeittafelBilder
    oMainForm = ThisComponent.drawpage.forms.getbyname("FormDatenOrte")
    oSubForm = oMainForm.getbyname("FormDatenOrteSubZeittafel")
    oSubSubForm = oSubForm.getByName("FormDatenOrteSubZeittafelBilder")
    ochkbox =  oMainForm.getByName("chkbox")
    if ochkbox.State = 1 then bShowA = true else bShowA = false
    for iA = 0 to oSubSubForm.Count -1
        oControlA = oSubSubForm(iA)
        oControlA.EnableVisible = bShowA
    next iA
    
    if ochkbox.State = 1 then bShowB = true else bShowB = false
    for iB = 0 to oSubForm.Count -1
        oControlB = oSubForm(iB)
        oControlB.EnableVisible = bShowB <--- Hier tritt der Fehler auf!!!
    next iB
End Sub
Lustiger weise funktioniert das Makro, nur wo kommt die Fehlermeldung her? Ich kapiere es einfach nicht, das eine"SubSubForm" kann ich ausblenden, beim "SubForm" bekomme ich eine Fehlermeldung, grrr.
Beide "For" Anweisungen machen doch das gleiche, warum tun sie es denn nicht :-?
Kann das Problem mit dem "SubSubForm" welches dem "SubForm" untergeordnet ist zusammenhängen?
Lg
Alex
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Base Unterformular mit Makro ausblenden

Beitrag von F3K Total »

Moin, keine Ahnung, ohne Beispieldatei ist es Fischen im Trüben.
Gruß R
ghostman
*
Beiträge: 11
Registriert: So, 28.09.2014 10:29

Re: Base Unterformular mit Makro ausblenden

Beitrag von ghostman »

Aber gerne doch.
Anbei eine Beispieldatei mit einem Formular.
Im Formular gibt es zwei Optionsgruppen, die linke schaltet die Elemente des SubForm's Ein/Aus. Die rechte Gruppe schaltet die Elemente des SubSubForm's Ein/Aus.
Die beiden Makros sind gleich, beziehen sich jedoch auf andere Teile des Formulars.
Das Problem muss fast mit dem SubSubForm zusammenhängen, welches dem SubForm untergeordnet ist.

Hier werden ja alle Elemente im SubForm nacheinander abgearbeitet.

Code: Alles auswählen

for i = 0 to oSubForm.Count -1
            oSubForm(i).EnableVisible = bShow
        next i
Das Element "SubSubForm" kann aber offensichtlich nicht ein- oder ausgeschaltet werden und dies könnte zum Fehler führen.

Nur was kann ich dagegen tun?

Lg
Alex
Dateianhänge
OOForum.odb
(15.44 KiB) 189-mal heruntergeladen
ghostman
*
Beiträge: 11
Registriert: So, 28.09.2014 10:29

Re: Base Subform mit Makro ausblenden -->Bessere Lösung gesu

Beitrag von ghostman »

Guten Morgen allerseits

Ich habe eine möglich Lösung gefunden, aber damit bin ich noch nicht ganz zufrieden. Das muss doch besser gehen, siehe letzten Abschnitt.

Also, zuerst noch einmal das Problem, wie in obiger Beispieldatenbank dargestellt:

Code: Alles auswählen

Sub S_SHOW_HIDE_OPT_Sub(Event)
    oMainForm = ThisComponent.drawpage.forms.getbyname("MainForm")
    oSubForm = oMainForm.getbyname("SubForm")
    oSubSubForm = oSubForm.getbyname("SubSubForm")
    oOpt =  Event.Source
    if oOpt.State then
        if oOpt.model.Label = "Einblenden" then bShow = true else bShow = false
        for i = 0 to oSubForm.Count -1
            oSubForm(i).EnableVisible = bShow   '<--- Hier entsteht der Laufzeitfehler!
        next i
    endif
End Sub
Eigentlich ist der Fehler logisch, denn die Zeilen

Code: Alles auswählen

        for i = 0 to oSubForm.Count -1
            oSubForm(i).EnableVisible = bShow   '<--- Hier entsteht der Laufzeitfehler!
        next i
versuchen ein Formular-Element Un-/Sichtbar zu machen, was offensichtlich nicht möglich ist. Natürlich könnte ich nun den Fehler mit "On Error resume Next" ignorieren, was aber keine Option ist. Besser scheint mir jedoch

Code: Alles auswählen

Sub S_SHOW_HIDE_OPT_Sub(Event)
    oMainForm = ThisComponent.drawpage.forms.getbyname("MainForm")
    oSubForm = oMainForm.getbyname("SubForm")
    oSubSubForm = oSubForm.getbyname("SubSubForm")
    oSubSubFormName = oSubSubForm.name   '<-- Namen des SubSubForm's auslesen
    oOpt =  Event.Source
    if oOpt.State then
        if oOpt.model.Label = "Einblenden" then bShow = true else bShow = false
        	for i = 0 to oSubForm.Count -1
        	if oSubForm(i).name = oSubSubFormName then '<-- Verbesserungswürdige if Klausel
        	else
                oSubForm(i).EnableVisible = bShow
               endif
            next i
    endif
End Sub
eine weitere if Klausel, um das Formular-Element zu umgehen.

Nun zu meinem Problem, bei einem Formular-Element geht das ja, aber wenn ich nun mehrere dieser Formular-Elemente habe, wird das Makro unnötig kompliziert.

Es muss doch eine Anweisung geben alla

Code: Alles auswählen

...
if oSubForm(i).FORMULAR-ELEMENT = true then
  Tue dieses, oder nichts
   else
  Tue jenes
...
um alle Formular-Elemente zu überspringen.


Besten Dank für eure Hilfe

Alex
ghostman
*
Beiträge: 11
Registriert: So, 28.09.2014 10:29

Re: Base Subform mit Makro ausblenden -->Lösung gefunden

Beitrag von ghostman »

ghostman hat geschrieben: Es muss doch eine Anweisung geben alla

Code: Alles auswählen

...
if oSubForm(i).FORMULAR-ELEMENT = true then
  Tue dieses, oder nichts
   else
  Tue jenes
...
um alle Formular-Elemente zu überspringen.
Nach langem Suchen und überfliegen von drei Werken zu Base und Makros habe ich die Lösung im
.SupportsService("com.sun.star.form.component.DataForm")
Gefunden.

Code: Alles auswählen

Sub S_SHOW_HIDE_OPT_Sub(Event)
    oMainForm = ThisComponent.drawpage.forms.getbyname("MainForm")
    oSubForm = oMainForm.getbyname("SubForm")
    oSubSubForm = oSubForm.getbyname("SubSubForm")
    oOpt =  Event.Source
    if oOpt.State then
        if oOpt.model.Label = "Einblenden" then bShow = true else bShow = false
        	for i = 0 to oSubForm.Count -1
			if oSubForm(i).SupportsService("com.sun.star.form.component.DataForm") then
        	else
            oSubForm(i).EnableVisible = bShow
            endif
        next i
    endif
End Sub
Lg
Alex
Antworten