[gelöst] Checkbox getByName()

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: [gelöst] Checkbox getByName()

Re: [gelöst] Checkbox getByName()

von TrueColor » Do, 16.08.2012 12:02

F3K Total hat geschrieben:Einen Tipp möchte ich Dir noch geben:
Ich habe das

Code: Alles auswählen

i = right(oChkBox.Name,1)
verwendet, weil Du alle Markierfelder so schön gleichmäßig benamst hast und es weniger als 10 Stück sind.
Bei mehr als 9 verwende ich dann auch 2 Stellen, weil ich diesen Stellensprung hasse :-)
Normalerweise verwende ich für diesen Fall

Code: Alles auswählen

i = event.source.model.tag
und trage die auszulesende Zahl/Text dann unter den Eigenschaften/Allgemein/Zusatzinformation des jeweiligen Feldes ein.
Oh, da kann man eigene Tags vergeben? Muss ich mir merken, klingt nützlich!

Re: [gelöst] Checkbox getByName()

von F3K Total » Do, 16.08.2012 11:23

Moin,
das sieht doch super aus!
Mit Transferleistung!
1+
Einen Tipp möchte ich Dir noch geben:
Ich habe das

Code: Alles auswählen

i = right(oChkBox.Name,1)
verwendet, weil Du alle Markierfelder so schön gleichmäßig benamst hast und es weniger als 10 Stück sind.
Normalerweise verwende ich für diesen Fall

Code: Alles auswählen

i = event.source.model.tag
und trage die auszulesende Zahl/Text dann unter den Eigenschaften/Allgemein/Zusatzinformation des jeweiligen Feldes ein.

Beste Grüße R

Re: Checkbox getByName()

von TrueColor » Do, 16.08.2012 08:49

Hallo,

nachdem ich jetzt die Optimierung der einzelnen Checkboxen auch auf die beiden Buttons angewendet habe, fkt. das jetzt alles einwandfrei.

Code: Alles auswählen

REM  *****  BASIC  *****

' -------------------------
'   ö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
'
Global aStatusFilter(1 to 8) as Boolean
Global aCheckboxNames(1 to 8) as String

Private oForms as Object

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

    Dim i as Integer 'Laufvariable

    oForm = ThisComponent.CurrentController.ActiveSheet.DrawPage.Forms(0)
    
    aCheckboxNames(1) = "Chk_StatusFilter1"
    aCheckboxNames(2) = "Chk_StatusFilter2"
    aCheckboxNames(3) = "Chk_StatusFilter3"
    aCheckboxNames(4) = "Chk_StatusFilter4"
    aCheckboxNames(5) = "Chk_StatusFilter5"
    aCheckboxNames(6) = "Chk_StatusFilter6"
    aCheckboxNames(7) = "Chk_StatusFilter7"
    aCheckboxNames(8) = "Chk_StatusFilter8"
    
    for i = 1 to 8
      oForm.getByName(aCheckboxNames(i)).State = 1
      aStatusFilter(i) = true
    next

End Sub

' ---------------------
'   StatusFilter_Alle
' ---------------------
' Beschreibung: schaltet alle Checkboxen an/aus
' benötigte Macros: keine
'
Sub StatusFilter_Alle (Event)

    Dim oButton as Object
    Dim i as Integer
    
    oForm = ThisComponent.CurrentController.ActiveSheet.DrawPage.Forms(0)
    oButton = Event.Source.Model

    Select Case oButton.Name
      Case "Btn_StatusFilter_AlleAn"
        for i = 1 to 8
          oForm.getByName(aCheckboxNames(i)).State = 1
          aStatusFilter(i) = true
        next
      Case "Btn_StatusFilter_AlleAus"
        for i = 1 to 8
          oForm.getByName(aCheckboxNames(i)).State = 0
          aStatusFilter(i) = false
        next
    End Select

End Sub

' ----------------
'   StatusFilter
' ----------------
' Beschreibung: schaltet die einzelnen Checkboxen an/aus
' benötigte Macros: keine
'
Sub StatusFilter (Event)

    Dim oChkBox as Object
    Dim i as Integer

    oChkBox = Event.Source.Model

    Select Case oChkBox.State
      Case 0
        i = right(oChkBox.Name,1)
        aStatusFilter(i) = true
      Case 1
        i = right(oChkBox.Name,1)
        aStatusFilter(i) = false
    End Select

End Sub
Nochmals vielen Dank euch allen für eure Geduld.

Jetzt kann ich mich an die eigentlichen Filter machen. Hm... ich werde mich dann sicher wieder melden müssen. Mal sehen, wie weit ich komme :-)

Re: Checkbox getByName()

von TrueColor » Do, 16.08.2012 07:23

DPunch hat geschrieben:Die interne Repräsentation von TRUE ist -1.
-1? Ok, dann ist TRUE/FALSE tatsächlich besser.

Re: Checkbox getByName()

von DPunch » Mi, 15.08.2012 19:18

Servus
TrueColor hat geschrieben:Ja eben, deshalb hatte ich ja solche Probleme damit, weil ich dachte, es wäre ein einzelnes. Das es anders ist, auf diesen Trichter bin ich erst durch eure Hilfe gekommen, deshalb auch meine verwunderte Frage, die du ja bestätigt hast.
Dann hatte ich Dich da anscheinend missverstanden, Dein letztes Statement hat sich für mich so angehört, als würdest Du es als schlechtes Design betrachten, weil das Kontrollelement ja schliesslich ein abgeschlossenes Modul sei. Nichts für ungut.
TrueColor hat geschrieben:Was sind die Vorteile? Von der Lesbarkeit finde ich 0/1 besser.
Über die Lesbarkeit kann man sich sicher streiten (ich persönlich finde, FALSE/TRUE sorgt für deutlich mehr Lesbarkeit), im Hinterkopf behalten muss man dabei allerdings immer:
1 ist ungleich TRUE. Die interne Repräsentation von TRUE ist -1.

Code: Alles auswählen

	MsgBox (1 = TRUE)		'FALSE
	MsgBox (1 = FALSE)		'FALSE
	MsgBox (NOT 1 = TRUE)	'FALSE
	MsgBox (NOT 1 = FALSE)	'FALSE

Re: Checkbox getByName()

von TrueColor » Mi, 15.08.2012 15:49

Hallo,
DPunch hat geschrieben:
TrueColor hat geschrieben: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 kann Dir nicht ganz folgen - das Kontrollelement ist eben *kein* "einzelnes abgeschlossenes Modul", ganz im Gegenteil, genau darum ging es doch bei Deiner letzten Frage.
Ja eben, deshalb hatte ich ja solche Probleme damit, weil ich dachte, es wäre ein einzelnes. Das es anders ist, auf diesen Trichter bin ich erst durch eure Hilfe gekommen, deshalb auch meine verwunderte Frage, die du ja bestätigt hast.
balu hat geschrieben:Und nach dem der aufruf aus der Sub "onStart" abgearbeitet wurde, springt das Makro wieder in das Modul "onStart" zurück. Dadurch ist das Modul "StatusFilter" nicht mehr aktiv und die Variablen haben ihre Gültigkeit verloren.
Na toll, daran hatte ich nicht gedacht! Ich hatte schon kurz den Gedanken, mal mit GLOBAL zu testen, aber nur so just for fun. Ich wollte die Module möglichst getrennt halten, hatte mich deshalb für PRIVATE entschieden.

Oder ist PUBLIC besser als GLOBAL? Ich schätze das Risiko bei GLOBAL relativ hoch ein, das irgendetwas kollidiert, ist so ein Bauchgefühl.

Gibt es denn eine andere Möglichkeit, wie ich mehrere Macros beim Laden des Dokuments starten kann, ohne die jeweiligen Module verlassen zu müssen? Ich würde gern bei PUBLIC bleiben, weil ich dann nicht immer die anderen Module auf Kollision prüfen müsste.
DPunch hat geschrieben:2.) Aus den acht Makros StatusFilter... habe ich ein eventgesteuertes gemacht.
Damit hast du mir vorgegriffen. Die Optimierung dieser Sache lag mir auch noch am Herzen. Werde ich mir anschauen!

Kannst du mir i = right(ochkbox.Name,1) näher erläutern? Was macht right?
(Edit: der Papiergroschen ist gelandet: Teilstring von rechts, Länge = 1 Zeichen)
DPunch hat geschrieben:3.) Der boolean-Varialblen aStatusFilter ordne ich true und false statt 0 und 1 zu
Was sind die Vorteile? Von der Lesbarkeit finde ich 0/1 besser.
DPunch hat geschrieben:greifst Du auf das erste Formular (Index 0) der Drawpage zu, Einzahl!
Sinnfällig wäre diese Bezeichnung, ohne s
Klingt sinnvoll, damit erschliesst sich dem Lesenden der Code besser.

Vielen Dank euch allen!

Re: Checkbox getByName()

von DPunch » Mi, 15.08.2012 13:58

Servus
TrueColor hat geschrieben: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 kann Dir nicht ganz folgen - das Kontrollelement ist eben *kein* "einzelnes abgeschlossenes Modul", ganz im Gegenteil, genau darum ging es doch bei Deiner letzten Frage.

Re: Checkbox getByName()

von F3K Total » Mi, 15.08.2012 12:50

Hi,
habe mal einiges geändert:
1.) die Variablen global, sonst sind sie nach Durchführung eines Makros weg.

Code: Alles auswählen

Global aStatusFilter(1 to 8) as Boolean
Global aCheckboxNames(1 to 8) as String
2.) Aus den acht Makros StatusFilter... habe ich ein eventgesteuertes gemacht.

Code: Alles auswählen

Sub StatusFilter (event)
dim i as integer
ochkbox = event.source.model
nstate = ochkbox.state
    Select Case nstate
      Case 0
       i = right(ochkbox.Name,1)
       aStatusFilter(i) = true
      Case 1
       i = right(ochkbox.Name,1)
       aStatusFilter(i) = false
    End Select
End Sub
3.) Der boolean-Varialblen aStatusFilter ordne ich true und false statt 0 und 1 zu
4.) In den StatusFilter_Alle... Makros fehlte der Bezug zum Formular

Code: Alles auswählen

    oDoc = ThisComponent
    oSheet = oDoc.currentcontroller.activesheet
    oDrawPage = oSheet.DrawPage
    oForms = oDrawPage.Forms(0)
Edit: oder du deklarierst oForms auch global
ein kleiner Hinweis:
mit

Code: Alles auswählen

 oDrawPage.Forms(0)
greifst Du auf das erste Formular (Index 0) der Drawpage zu, Einzahl!
Sinnfällig wäre diese Bezeichnung, ohne s:

Code: Alles auswählen

oForm = oDrawPage.Forms(0)
oder kürzer:

Code: Alles auswählen

oForm = ThisComponent.currentcontroller.activesheet.DrawPage.forms(0)
Viel Erfolg
Gruß R

Edit: @Balu
habe gerade dran gearbeitet, als Du Deinen Beitrag geschickt hast und dies erst nach dem Absenden gemerkt. :)
Dateianhänge
Projekte aktuell_v04-05_20120815.ods
(64.71 KiB) 142-mal heruntergeladen

Re: Checkbox getByName()

von balu » Mi, 15.08.2012 12:31

Hallo Robert,
Würdet ihr bitte mal drüberschauen?
Ich hab mal reingeschaut und kann dir auch eine Lösung anbieten, gibt bestimmt noch eine andere. Doch zuvor erstmal zum Fehler.

Du hast bezüglich der Gültigkeit der Variablen dir die wichtigsten Punkte von Dannenhöfer (vermute ich) aufgeschrieben. Ist in Ordnung so. Jedoch hast Du das wohl noch nicht wirklich alles richtig verstanden.
und die Variablen sind alle als PRIVAT deklariert.
Und genau da hast Du ein verständigungsproblem, und folglich hast Du dir dadurch selber ein Bein gestellt. Mach dir nix draus, mir erging es da nicht besser.

Ich fasse jetzt mal mit meinen eigenen Worten sehr stark das zusammen, was Dannenhöfer geschrieben hat. Aber auch nur zu dem Therma PRIVATE, damit Du verstehst was da schief läuft.

Private Variablen haben nur in dem Modul ihre Gültigkeit wo sie aufgerufen werden. Wird dieses Modul verlassen, wird ihre Gültigkeit aufgehoben.

Du rufst also beim öffnen der Datei im Modul "onStart" in der Sub "onStart" das Modul "StatusFilter" die Sub "Werte_zuweisen" auf. In dem Modul "StatusFilter" werden die Variablen für dieses Modul deklariert und defeniert. Und nach dem der aufruf aus der Sub "onStart" abgearbeitet wurde, springt das Makro wieder in das Modul "onStart" zurück. Dadurch ist das Modul "StatusFilter" nicht mehr aktiv und die Variablen haben ihre Gültigkeit verloren.


Mein Vorschlag wäre jetzt; ersetze in der Sub "StatusFilter" die Private deklarationen durch GLOBAL. Dann funktionieren wengistens schon mal die "AlleAn", "AlleAus". (Getestet)
Wie gesagt, das ist ein Vorschlag meinerseits, gibt wohl auch noch bestimmt ne andere.



Gruß
balu

Re: Checkbox getByName()

von TrueColor » Mi, 15.08.2012 11:07

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

Re: Checkbox getByName()

von DPunch » Di, 14.08.2012 19:51

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.

Re: Checkbox getByName()

von TrueColor » Di, 14.08.2012 16:46

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!

Re: Checkbox getByName()

von DPunch » Di, 14.08.2012 15:27

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.

Re: Checkbox getByName()

von TrueColor » Di, 14.08.2012 13:52

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.

Re: Checkbox getByName()

von TrueColor » Di, 14.08.2012 13:48

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?

Nach oben