[gelöst] Checkbox getByName()

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

Moderator: Moderatoren

TrueColor
******
Beiträge: 547
Registriert: Do, 11.03.2010 11:23

[gelöst] Checkbox getByName()

Beitrag von TrueColor »

Hallo,

ich möchte Checkboxen mittels .getByName() manipulieren, bekomme aber immer wieder eine Exception "Type: com.sun.star.container.NoSuchElementException". Die Namen der Checkboxen stimmen aber. Was mache ich falsch?

Code: Alles auswählen

' -------------------------
'   öffentliche Variablen
' -------------------------
' werden im Kopfbereich deklariert
'
' Gültigkeit globaler Variablen:
' GLOBAL: innerhalb der gesamten Staroffice-Sitzung in allen geladenen Bibliothken, 
' Modulen, Prozeduren und Funktionen
' PUBLIC: innerhalb aller Module einer Bibliothek
' PRIVATE: innerhalb eines Moduls, diese Variablennamen können daher auch in mehreren
' Modulen parallel verwendet werden
'
Private oDoc As Object 
Private oSheet As Object 
Private oDrawPage As Object 
Private oForm As Object

Private aStatusFilter(1 to 8) as Boolean

' ------------------
'   Werte_zuweisen
' ------------------
' Beschreibung: Den öffentlichen Variablen Werte zuweisen, Array und Checkboxen initialisieren
' benötigte Macros: keine
'
Sub Werte_zuweisen

    Dim i as Integer 'Laufvariable

    oDoc = ThisComponent
    oSheet = oDoc.currentcontroller.activesheet
    oDrawPage = oSheet.DrawPage 
    oForm = oDrawPage.Forms

    oForm.getByName("Chk_StatusFilter1").model.State = 1
    oForm.getByName("Chk_StatusFilter2").model.State = 1
    oForm.getByName("Chk_StatusFilter3").model.State = 1
    oForm.getByName("Chk_StatusFilter4").model.State = 1
    oForm.getByName("Chk_StatusFilter5").model.State = 1
    oForm.getByName("Chk_StatusFilter6").model.State = 1
    oForm.getByName("Chk_StatusFilter7").model.State = 1
    oForm.getByName("Chk_StatusFilter8").model.State = 1

    for i = 1 to 8
      'oForm.getByName("Chk_StatusFilter(i)").model.State = 1
      aStatusFilter(i) = 1
    next

End Sub
Vielen Dank!
Zuletzt geändert von TrueColor am Do, 16.08.2012 08:50, insgesamt 1-mal geändert.
System:
LibO 6 + LibO 7
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Checkbox getByName()

Beitrag von balu »

Hallo True
NoSuchElementException
Eigentlich sehr eindeutig: Da gibt es kein Element!
Und warum?
Weil Du vergessen hast die DrawPage mittels des richtigen Index anzusprechen. Also in der Art von:

Code: Alles auswählen

	oZeichenEbene = ThisComponent.Sheets(1).DrawPage.Forms
	oForm = oZeichenEbene.getByIndex(0)
Hier im Forum gibt es satt und lang Threads mit Code-Schnipsel zu der DrawPage. Nur mal so am Rande bemerkt.

Du wirst aber noch auf einen anderen Fehler stoßen, den Du aber wohl mittels XRAY selber beseitigen kannst.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
TrueColor
******
Beiträge: 547
Registriert: Do, 11.03.2010 11:23

Re: Checkbox getByName()

Beitrag von TrueColor »

Hallo Balu,

ich konnte leider bisher nirgendwo herauslesen, dass es mehre DrawPages pro Sheet gibt. Wo ist das dokumentiert?

Oder meinst du nicht die DrawPage, sondern das Formularelement? Aber von dem kenne ich doch den Namen (mit .hasByName(...) bekomme ich True, ohne eine Exception).

Grüße
Robert
System:
LibO 6 + LibO 7
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Checkbox getByName()

Beitrag von balu »

Hallo Robert,
ich konnte leider bisher nirgendwo herauslesen, dass es mehre DrawPages pro Sheet gibt. Wo ist das dokumentiert?
Pro Tabellenblatt gibt es ja auch nur eine, aber die muss ja angesprochen werden, sonst läuft da nix. Vielleicht hilft ja auf die schnelle Dannenhöfer.

Oder meinst du nicht die DrawPage, sondern das Formularelement?
Nein, ich meine die DrawPage.


Ich bin noch kein richtiger Freund von der DrawPage, da ich mein aktuelles Wissen mir durch Dialoge angeeignet habe, und von daher kann ich dir nicht bei allem helfen. Aber dennoch habe ich das eine oder andere diesbezüglich schon dazu gelernt, und dazu gehört nun mal das ansprechen der DrawPage mittels getByIndex(0). Das wollt ich dir damit sagen.

Vielleicht findest Du ja noch weitere Infos dazu in der Doku von Andrew.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Checkbox getByName()

Beitrag von komma4 »

balu hat geschrieben:Pro Tabellenblatt gibt es ja auch nur eine
Das ist so nicht richtig.

Ein Formular liegt auf einer (unbenannten) DrawPage, jede Grafik (im Vordergrund = nicht über Seitenformat eingefügte) auf einer benannten (bspw. Grafik 2) Drawpage.
Zwei Grafiken, ein Formular: print ThisComponent.Sheets().getByName( "Tabelle2" ).DrawPage.getCount() zeigt 3 an
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)
TrueColor
******
Beiträge: 547
Registriert: Do, 11.03.2010 11:23

Re: Checkbox getByName()

Beitrag von TrueColor »

Oh, da habe ich die ganze Sache missverstanden. Ich meinte, irgendwo gelesen zu haben, dass zw. Formularelementen in Dialogen und direkt auf dem Sheet eingefügten ein Unterschied ist, weil es bei letzterem nur eine gibt. Ich werde es testen.
Vielleicht hilft ja auf die schnelle Dannenhöfer.
Dannenhöfer indiziert aber auch nicht die Drawpage, sondern die Formularelemente
4.2.6 Wie kann man Kontrollfelder unsichtbar schalten?
[...]
oform=odoc.drawpage.forms.getbyindex(0)
[...]
Vielleicht findest Du ja noch weitere Infos dazu in der Doku von Andrew.
Leider nur unzureichend, ich hatte gehofft, da ein Kapitel zu finden, was sich ausführlich mit den Formularelementen beschäftigt. Naja, Kapitel 13 und 15 waren schon interessant, aber für mich unzureichend, aber nach 15 hört es auf. Oder gibt es irgendwo eine neuere Version?
Du wirst aber noch auf einen anderen Fehler stoßen, den Du aber wohl mittels XRAY selber beseitigen kannst.
Wie kann ich Xray auf _meinen_ Code anwenden? Für mich erschließt sich das Teil nur wie ein Nachschlagewerk. Aber wenn ich z.B. .getByName() suche, muss ich schon wissen, wie der Baum aussieht, in welchen Elementen das erlaubt ist, um das im Xray zu finden.

Kann es sein, dass ein installiertes Xray die Rendering Engine stört? Habe ich so den Eindruck, musste immer erst weg- und wieder hinscrollen, damit die neuen Zelleinträge sichtbar werden.

Danke euch beiden!

Edit: Vermerk Dannenhöfer
System:
LibO 6 + LibO 7
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Checkbox getByName()

Beitrag von balu »

Hallo,

wie ja schon gesagt, die DrawPage ist nicht mein Freund :?
TrueColor hat geschrieben:
Vielleicht findest Du ja noch weitere Infos dazu in der Doku von Andrew.
Leider nur unzureichend, ich hatte gehofft, da ein Kapitel zu finden, was sich ausführlich mit den Formularelementen beschäftigt. Naja, Kapitel 13 und 15 waren schon interessant, aber für mich unzureichend, aber nach 15 hört es auf. Oder gibt es irgendwo eine neuere Version?
Von welcher Version sprichst Du da, von der deutschen oder der Originalen?

TrueColor hat geschrieben:
Du wirst aber noch auf einen anderen Fehler stoßen, den Du aber wohl mittels XRAY selber beseitigen kannst.
Wie kann ich Xray auf _meinen_ Code anwenden? Für mich erschließt sich das Teil nur wie ein Nachschlagewerk. Aber wenn ich z.B. .getByName() suche, muss ich schon wissen, wie der Baum aussieht, in welchen Elementen das erlaubt ist, um das im Xray zu finden.
Was soll ich jetzt dazu sagen? Ich weiss ja noch nicht mal wie weit Du jetzt mit deinem eingangs zitierten Code und meiner vorgeschlagenen Änderung gekommen bist. Hast Du die Änderung übernommen, und bist Du jetzt mittlerweile schon auf den "neuen" Fehler gestoßen? Es wäre wirklich schön wenn Du erst mal Feedback gäben würdest, anstatt mit weiteren und neuen Fragen zu antworten.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Checkbox getByName()

Beitrag von DPunch »

Servus
komma4 hat geschrieben:
balu hat geschrieben:Pro Tabellenblatt gibt es ja auch nur eine
Das ist so nicht richtig.
Jedes Tabellenblatt hat immer genau eine einzige Drawpage.
Dein Beispiel (ThisComponent.Sheets().getByName( "Tabelle2" ).DrawPage.getCount()) gibt die Anzahl der Shapes auf dieser Drawpage zurück.
TrueColor hat geschrieben:Die Namen der Checkboxen stimmen aber. Was mache ich falsch?
Nun, mit

Code: Alles auswählen

    oDrawPage = oSheet.DrawPage
    oForm = oDrawPage.Forms
referenziert oForm nur den Container der in der Drawpage enthaltenen Formulare. Per .getByName kannst Du dort die Formulare per Namen ansprechen.
Chk_StatusFilter1-8 sind aber keine Formulare (oForm.getByName("Chk_StatusFilter1") wird die Fehlermeldung "No such element" zurückgeben, wenn es kein Formular mit Namen "Chk_StatusFilter1" gibt), sondern Steuerelemente, welche immer genau einem Formular zugeordnet sind.
Wenn Du Dir dieses Formular per Index

Code: Alles auswählen

oForm = oDrawPage.Forms.getByIndex(0)
oder per Name

Code: Alles auswählen

oForm = oDrawPage.Forms.getByName("meinFormular")
greifst, hast Du über oForm auch Zugriff auf die Steuerelemente.
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Checkbox getByName()

Beitrag von komma4 »

DPunch hat geschrieben:Jedes Tabellenblatt hat immer genau eine einzige Drawpage.
Dein Beispiel (ThisComponent.Sheets().getByName( "Tabelle2" ).DrawPage.getCount()) gibt die Anzahl der Shapes auf dieser Drawpage zurück.
Du hast recht - da habe ich mich getäuscht.
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)
TrueColor
******
Beiträge: 547
Registriert: Do, 11.03.2010 11:23

Re: Checkbox getByName()

Beitrag von TrueColor »

Hallo,

erstmal sorry für die lange Stille meinerseits. Hab jetzt noch ein bisschen rumexperiementiert...err... das ganze empirisch gelöst :D

Ok, das mit dem Index der DrawPage habe ich nun theoretisch, der Beschreibung nach, verstanden.

Das mit den Forms nun dank DPunch wohl auch, öhm... glaube ich :-)
Also Dokument kann enthalten n Sheets mit je 1 Drawpage für Formulare (und n für direkt eingefügte Grafiken) mit n Formularen mit je 1 Kontrollelement.

Praktisch fkt. aber nur (opder besser: es bleibt zumindest erstmal nicht an dieser Stelle hängen), wenn ich DrawPage nicht indiziere, Forms aber doch indiziere. Hm... macht aber irgendwie Sinn, wenn es nur 1 DrawPage für für Formularelemente gibt.

Code: Alles auswählen

Private oDoc As Object 
Private oSheet As Object 
Private oDrawPage As Object 
Private oForms As Object
Private oControl As Object
Private oChk1 As Object

Private aStatusFilter(1 to 8) as Boolean

' ------------------
'   Werte_zuweisen
' ------------------
' Beschreibung: Den öffentlichen Variablen Werte zuweisen, Array und Checkboxen initialisieren
' benötigte Macros: keine
'
Sub Werte_zuweisen

    Dim i as Integer 'Laufvariable

    oDoc = ThisComponent
    oSheet = oDoc.currentcontroller.activesheet
    oDrawPage = oSheet.DrawPage
    oForms = oDrawPage.Forms(0)
    oChk1 = oForms.getByName("Chk_StatusFilter1")
    
    'Dim anzahlDrawPage as Integer
    'anzahlDrawPage = oSheet.DrawPage.getCount()
    
    'Xray oSheet
    'Xray oDrawPage

    oChk1.State = 1
Wieso wirft mir der Beobachter für anzahlDrawPage eigentlich 19 aus, wenn es doch nur 1 geben soll?
System:
LibO 6 + LibO 7
TrueColor
******
Beiträge: 547
Registriert: Do, 11.03.2010 11:23

Re: Checkbox getByName()

Beitrag von TrueColor »

balu hat geschrieben:
TrueColor hat geschrieben:
Vielleicht findest Du ja noch weitere Infos dazu in der Doku von Andrew.
Leider nur unzureichend, ich hatte gehofft, da ein Kapitel zu finden, was sich ausführlich mit den Formularelementen beschäftigt. Naja, Kapitel 13 und 15 waren schon interessant, aber für mich unzureichend, aber nach 15 hört es auf. Oder gibt es irgendwo eine neuere Version?
Von welcher Version sprichst Du da, von der deutschen oder der Originalen?
Von beiden. Sowohl in der deutschen Übersetzung als auch im englischen Original ist Kapitel 15 das letzte Kapitel. Ich hatte gehofft, da noch etwas zu finden, was sich tiefer mit den Formularelementen beschäftigt.
System:
LibO 6 + LibO 7
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Checkbox getByName()

Beitrag von DPunch »

Servus
TrueColor hat geschrieben:Also Dokument kann enthalten n Sheets mit je 1 Drawpage für Formulare (und n für direkt eingefügte Grafiken) mit n Formularen mit je 1 Kontrollelement.
Nein.

1 (Calc-)Dokument -> n Sheets
---
1 Sheet -> 1 Drawpage
---
1 Drawpage -> n Shapes
1 Drawpage -> 1 Forms-Container
---
1 Forms-Container -> n Formulare
---
1 Formular -> n Kontrollelemente
1 Formular -> n Formulare
TrueColor hat geschrieben:Praktisch fkt. aber nur (opder besser: es bleibt zumindest erstmal nicht an dieser Stelle hängen), wenn ich DrawPage nicht indiziere, Forms aber doch indiziere.
Wie Du ja selbst sagst, ist das logisch und ergibt sich zwangsläufig aus oben genannten Zusammenhängen.
Es gibt nur eine Drawpage, daher steht natürlich kein IndexAccess (die Funktionalität, die einen Zugriff über den Index erlaubt) zur Verfügung.
.Forms ist ein Container mit 0 bis n Elementen, der sowohl IndexAccess, als auch NameAccess zur Verfügung stellt (.getByIndex / .getByName), aber ist selber kein Formular, daher *musst* Du das gewünschte Formular innerhalb des Containers zuerst, z.B. per Index, identifizieren.
TrueColor hat geschrieben:Wieso wirft mir der Beobachter für anzahlDrawPage eigentlich 19 aus, wenn es doch nur 1 geben soll?
Weil, wie ich bereits weiter oben erwähnt habe
(ThisComponent.Sheets().getByName( "Tabelle2" ).DrawPage.getCount()) gibt die Anzahl der Shapes auf dieser Drawpage zurück.
Jede Grafik, jedes Kontrollelement (zumindest jedes über die normale Benutzeroberfläche erstellte) hat/ist ein Shape, "eine Zeichnung" auf der Drawpage.
TrueColor
******
Beiträge: 547
Registriert: Do, 11.03.2010 11:23

Re: Checkbox getByName()

Beitrag von TrueColor »

Hallo,
DPunch hat geschrieben:
TrueColor hat geschrieben:Wieso wirft mir der Beobachter für anzahlDrawPage eigentlich 19 aus, wenn es doch nur 1 geben soll?
Weil, wie ich bereits weiter oben erwähnt habe
(ThisComponent.Sheets().getByName( "Tabelle2" ).DrawPage.getCount()) gibt die Anzahl der Shapes auf dieser Drawpage zurück.
Jede Grafik, jedes Kontrollelement (zumindest jedes über die normale Benutzeroberfläche erstellte) hat/ist ein Shape, "eine Zeichnung" auf der Drawpage.
Dann ist das ne böse Falle, dass der Forms-Container durchlässig ist. Oder bedeutet das, dass Grafik der Kontrollelemente direkt auf der DrawPage liegt, die Logik aber in den Formularen?


Ich habe
8 Checkboxen
4 Buttons
1 Textfeld
1 Listenfeld
Summe 14
könnte man doch gutmütigerweise den Ausklappmodus vom Listenfeld und 1x das Zeug vom Autofilter dazuzählen und vlt. noch den Forms-Container selbst. Komme ich immer noch nicht auf 19. Würde mich schon interessieren, was der da noch zählt. Aber ok, das ist momentan nebensächlich.

Das erste Macro bleibt nicht mehr hängen, scheint fehlerfrei durchzulaufen. Die anderen hängen immer noch, obwohl die Komponenten gleich aussehen. Das muss ich mir nochmal angucken und ggf. morgen mal die ganze Datei hochladen.

Vielen Dank für eure Geduld!
System:
LibO 6 + LibO 7
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Checkbox getByName()

Beitrag von DPunch »

Servus
TrueColor hat geschrieben:Oder bedeutet das, dass Grafik der Kontrollelemente direkt auf der DrawPage liegt, die Logik aber in den Formularen?
So ist es - Darstellung und Logik sind strikt getrennt, beides kann auch unabhängig voneinander existieren.
TrueColor hat geschrieben:Ich habe (...) Summe 14 könnte man doch gutmütigerweise den Ausklappmodus vom Listenfeld und 1x das Zeug vom Autofilter dazuzählen und vlt. noch den Forms-Container selbst. Komme ich immer noch nicht auf 19.
FormsContainer, Ausklappmodus etc zählen da definitiv nicht dazu. Aber alles, was irgendwie dargestellt werden soll, sei es Diagramme, Zeichnungen, Grafiken, Kontrollelemente, etc.
TrueColor
******
Beiträge: 547
Registriert: Do, 11.03.2010 11:23

Re: Checkbox getByName()

Beitrag von TrueColor »

Hallo,
DPunch hat geschrieben:
TrueColor hat geschrieben:Oder bedeutet das, dass Grafik der Kontrollelemente direkt auf der DrawPage liegt, die Logik aber in den Formularen?
So ist es - Darstellung und Logik sind strikt getrennt, beides kann auch unabhängig voneinander existieren.
Schade, dass das nirgendwo so explizit aufgeführt ist und man sich das mühsam selbst erarbeiten muss. Style und Logik getrennt ist zwar lobenswert, aber wenn die Hierarchie der Zugriffsebenen (hm... so würde ich das jetzt mal beschreiben) unterschiedlich ist, obwohl das Kontrollelement doch ein einzelnes abgeschlossenes Modul ist (ich verwende das Kontrollelement, und nicht: ich verwende die Grafik für ein Kontrollelement und ich verwende die Logik für ein Kontrollelement), ist das meiner Meinung nach schlechtes Design.

----

Ich hab mal meine Datei hochgeladen. Würdet ihr bitte mal drüberschauen? Es geht um das 2. Tabellenblatt "Prj_Uebersicht", die linke Gruppe der Formularelemente (also 8 Checkboxen und die beiden Buttons) und das Macro-Module "StatusFilter" (und "OnStart", mit dem die Initialisierung beim Dokument laden geschieht).

Sub Werte_zuweisen, also die Initialisierung, läuft jetzt anstandslos durch. Jedoch bei den einzelnen Formularelementen ("AlleAn", "AlleAus", "StatusFilter1"...) bekomme ich einen Fehler, dass die Objektvariable oForms.getByName(aCheckboxNames(i)) nicht belegt sei. Der Code ist aber identisch mit dem Sub "Werte_zuweisen" und die Variablen sind alle als PRIVAT deklariert. Ich habe keine Idee mehr, woran das nun liegen kann.

Vielen Dank!
Dateianhänge
Projekte aktuell_v04-05_20120815.ods
(66.97 KiB) 361-mal heruntergeladen
System:
LibO 6 + LibO 7
Antworten