Abfrage von Radiogroup Optionen in Basic
Moderator: Moderatoren
Abfrage von Radiogroup Optionen in Basic
Hallo,
wer kann mir weiterhelfen bei der Abfrage des Status von Optionsfeldgruppen (als OptionBox oder als RadioGroup). Ein Formular besitzt eine Optionsfeldgruppe mit den Optionsfeldern Drucker und Bildschirm. Beiden Feldern wurde der Objektname RadioGroup1 zugewiesen, um diese der Gruppe zuzuordnen. Der folgende Code liefert die Status-Eigenschaft des ersten Optionsfelds zurück:
Sub Main
Dim oDoc as Object
Dim oForm As Object
Dim oFeld1 As Object
Dim txt as String
oDoc=thisComponent ' Referenz auf Dokument
oForm=oDoc.DrawPage.Forms.GetByName("Form1") ' erstes Formular
' hole jetzt den Feldnamen und den Wert
oFeld1 = oForm.getByName("RadioGroup1")
If oFeld1.status = 1 Then _
MsgBox "Drucker markiert"
End Sub
Aber wie um aller Welt komme ich an den Status des zweiten oder dritten Optionsfelds der Gruppe ran. Irgendwie müsste es so was wie eine Auflistung geben, über die ich die einzelnen Optionsfeldobjekte der Gruppe durchlaufen und deren status-Wert ermitteln könnte. Und es müsste doch auch möglich sein, per Basic-Anweisung gezielt die Markierung auf eines der Optionsfelder der Gruppe zu setzen. Nur wie?
G. Born
wer kann mir weiterhelfen bei der Abfrage des Status von Optionsfeldgruppen (als OptionBox oder als RadioGroup). Ein Formular besitzt eine Optionsfeldgruppe mit den Optionsfeldern Drucker und Bildschirm. Beiden Feldern wurde der Objektname RadioGroup1 zugewiesen, um diese der Gruppe zuzuordnen. Der folgende Code liefert die Status-Eigenschaft des ersten Optionsfelds zurück:
Sub Main
Dim oDoc as Object
Dim oForm As Object
Dim oFeld1 As Object
Dim txt as String
oDoc=thisComponent ' Referenz auf Dokument
oForm=oDoc.DrawPage.Forms.GetByName("Form1") ' erstes Formular
' hole jetzt den Feldnamen und den Wert
oFeld1 = oForm.getByName("RadioGroup1")
If oFeld1.status = 1 Then _
MsgBox "Drucker markiert"
End Sub
Aber wie um aller Welt komme ich an den Status des zweiten oder dritten Optionsfelds der Gruppe ran. Irgendwie müsste es so was wie eine Auflistung geben, über die ich die einzelnen Optionsfeldobjekte der Gruppe durchlaufen und deren status-Wert ermitteln könnte. Und es müsste doch auch möglich sein, per Basic-Anweisung gezielt die Markierung auf eines der Optionsfelder der Gruppe zu setzen. Nur wie?
G. Born
-
- *
- Beiträge: 15
- Registriert: Do, 15.04.2004 15:22
@MoorhuhnXY
Hier ein kleines Beispiel:
es muß ein Basic-Dialog Namens "mein_Dialog" mit einer Schaltfläche und 2 Optionsfeldern existieren Namen: "OptionButton1" und "OptionButton2", bei einem der Optionsfelder muß im Eigenschaftendialog unter 'Status' "ausgewählt" ausgewählt sein
In der Library "Standard" (Modul1) des aktiven Dokuments wird folgender Code zum Anzeigen des Dialogs benötigt:
Der Schaltfläche des Basic-Dialogs ist im selben Modul folgender Code zugeordnet:
Ich hoffe das Prinzip wird deutlich.
P.S.:
Hast Du hier irgendwo den geposteten Code gefunden? Unter dem angegebenen Link finde ich nichts.
Gruß
Stephan
Hier ein kleines Beispiel:
es muß ein Basic-Dialog Namens "mein_Dialog" mit einer Schaltfläche und 2 Optionsfeldern existieren Namen: "OptionButton1" und "OptionButton2", bei einem der Optionsfelder muß im Eigenschaftendialog unter 'Status' "ausgewählt" ausgewählt sein
In der Library "Standard" (Modul1) des aktiven Dokuments wird folgender Code zum Anzeigen des Dialogs benötigt:
Code: Alles auswählen
Option Explicit
Dim oDialog as Object
Dim ergebnis as Boolean
Sub LoadForm
DialogLibraries.LoadLibrary("Standard")
oDialog = createUnoDialog(DialogLibraries.Standard.mein_Dialog)
oDialog.execute()
End Sub
Code: Alles auswählen
Sub Abfrage
ergebnis = oDialog.getControl("OptionButton1").State
msgbox ergebnis
If ergebnis = True Then
msgbox "Option 1 ist ausgewählt"
Else
Msgbox "Option 2 ist ausgewählt"
End if
end sub
P.S.:
Hab hier mal die Lösung gepostet.
...
...aber deine Lösung nicht.
Hast Du hier irgendwo den geposteten Code gefunden? Unter dem angegebenen Link finde ich nichts.
Gruß
Stephan
Hey alle,
hier misch ich mal mit, denn da habt ihr euch ein "tolles" Thema rausgesucht. OOo und Optionsfelder...
Seit Versin 1.1.1 ist das behoben, es können unterschiedliche Optionsfeldgruppen erstellt werden. Die Zusammengehörigkeit ist auch nicht vom Gruppierungsrahmen abhängig. Alle Optionsfelder mit dem selben Namen bilden eine Gruppe - in der jeweils nur eins ausgewählt werden kann!
Man kann natürlich verschieden Gruppen erstellen.
Etwas komplizierter wird die Auswertung per Makro, da jetzt die "Namen" ja gleich sind und somit eine individuelle Ansprache quasi unmöglich ist.
Es gibt zwar die Möglichkeit, jedem Optionsfeld einen "Referenzwert" mitzugeben, den man auch per Makro auslesen kann, mir ist aber auch noch keine "echte" Möglichkeit eingefallen, den Optionsbutton direkt anzusprechen.
Also, wer noch eine hübsche Idee hat, her damit.
Gruss
Thomas
hier misch ich mal mit, denn da habt ihr euch ein "tolles" Thema rausgesucht. OOo und Optionsfelder...
Das ist nur für die Version 1.1.0 so richtig ... und war ein Bug. So soll es natürlich nicht sein.Alle Optionsfelder in einem Formular, egal ob diese optisch in mehreren Optionsgruppen liegen oder nicht, werden (unabhängig von den zugewiesenen Objektnamen) zu einer Gruppe zugeordnet.
Seit Versin 1.1.1 ist das behoben, es können unterschiedliche Optionsfeldgruppen erstellt werden. Die Zusammengehörigkeit ist auch nicht vom Gruppierungsrahmen abhängig. Alle Optionsfelder mit dem selben Namen bilden eine Gruppe - in der jeweils nur eins ausgewählt werden kann!
Man kann natürlich verschieden Gruppen erstellen.
Etwas komplizierter wird die Auswertung per Makro, da jetzt die "Namen" ja gleich sind und somit eine individuelle Ansprache quasi unmöglich ist.
das funktioniert leider nur, wenn es nur ein Optionsfeld gibt (mit dem Namen "OptionButton1") dann aber ist ein Optionsfeld überflüssig (besser Checkbox). Beispiel: hat man drei Optionen zur auswahl, ist der Status nicht mehr bestimmbar.ergebnis = oDialog.getControl("OptionButton1").State
Es gibt zwar die Möglichkeit, jedem Optionsfeld einen "Referenzwert" mitzugeben, den man auch per Makro auslesen kann, mir ist aber auch noch keine "echte" Möglichkeit eingefallen, den Optionsbutton direkt anzusprechen.
Also, wer noch eine hübsche Idee hat, her damit.
Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
-
- *
- Beiträge: 15
- Registriert: Do, 15.04.2004 15:22
Hallo,
@Stephan
ich galube die "Lösung" ist nur das was da steht, einen Quellcode war wohl nicht gemeint.
@toxitom
der Referenzwert ist bestimmt der Wert den man im Assistenten angeben kann (oder in den Eigenschaften). Weißt du wie man den Wert erhält. Das wäre doch schon mal eine gute Auswertmöglichkeit.
Gruppe: RadioGroup
RadioButton1 = 1
RadioButton2 =2
wenn RadioGroup = 2 dann "Radio2 wurde aktiviert"
hab mich auch schon gewundert das das mit verschiedenen Namen funktionieren soll, weil dann die Gruppenzugehörigkeit weg war. ...hmm also Bug, na ja.
MoorhuhnXY
@Stephan
ich galube die "Lösung" ist nur das was da steht, einen Quellcode war wohl nicht gemeint.
@toxitom
der Referenzwert ist bestimmt der Wert den man im Assistenten angeben kann (oder in den Eigenschaften). Weißt du wie man den Wert erhält. Das wäre doch schon mal eine gute Auswertmöglichkeit.
Gruppe: RadioGroup
RadioButton1 = 1
RadioButton2 =2
wenn RadioGroup = 2 dann "Radio2 wurde aktiviert"
hab mich auch schon gewundert das das mit verschiedenen Namen funktionieren soll, weil dann die Gruppenzugehörigkeit weg war. ...hmm also Bug, na ja.
MoorhuhnXY
Hallo zusammen,
irgendwie ist hier der Wurm drin oder habe ich etwas falsch verstanden? Seit Beginn dieses Threads geht es immer darum das zu einer Gruppe gehörende Optionsbutton den gleichen Namen haben sollen ... oder so ähnlich wobei mir unklar ist wie Günther Born darauf kam, irgendwie scheinen aber alle seiner Meinung zu sein.
Richtig ist doch, meiner Meinung nach, Folgendes (OOo 1.1.1 / SO 7.0 Patch2):
die Gruppenbildung der Optionsbutton auf einem Basic-Dialog erfolgt einzig durch die Zuordnung der einzelnen Optionsbutton zu einer bestimmten TAB-Reihenfolge. Optionsbutton die zu einer Gruppe gehören müssen aufeinanderfolgende TAB-Positionen haben. Zwischen den einzelnen Gruppen muß mindestens 1 TAB-Position anderweitig vergeben sein, z.B. an eine Schaltfläche. Die Namen der Optionsbutton können völlig beliebig sein, egal wie die Gruppenbildung ist. In diesem Sinne sollte mein bereits gepostetes Beispiel funktionieren und tut es auch.
Ich habe jetzt mal ein etwas komplexeres Beispiel erstellt:
Basic-Dialog mit 6 Optionsbutten in 2 Gruppen je 3 so gruppiert wie oben beschrieben, 1 Schalrfläche zum Anzeigen der aktuellen Werte der Optionsbutton und 6 Schaltflächen zum Setzen der 2x3 Optionen mittels Basic-Code.
Es ist somit möglich die Optionen per Maus oder per Basic-Code zu setzen und die gesetzten Optionen auszulesen, zwischen allen Optionen wird klar unterschieden. Wird in diesem Zusammenhang sonst noch etwas benötigt?
Gruß
Stephan
irgendwie ist hier der Wurm drin oder habe ich etwas falsch verstanden? Seit Beginn dieses Threads geht es immer darum das zu einer Gruppe gehörende Optionsbutton den gleichen Namen haben sollen ... oder so ähnlich wobei mir unklar ist wie Günther Born darauf kam, irgendwie scheinen aber alle seiner Meinung zu sein.
Richtig ist doch, meiner Meinung nach, Folgendes (OOo 1.1.1 / SO 7.0 Patch2):
die Gruppenbildung der Optionsbutton auf einem Basic-Dialog erfolgt einzig durch die Zuordnung der einzelnen Optionsbutton zu einer bestimmten TAB-Reihenfolge. Optionsbutton die zu einer Gruppe gehören müssen aufeinanderfolgende TAB-Positionen haben. Zwischen den einzelnen Gruppen muß mindestens 1 TAB-Position anderweitig vergeben sein, z.B. an eine Schaltfläche. Die Namen der Optionsbutton können völlig beliebig sein, egal wie die Gruppenbildung ist. In diesem Sinne sollte mein bereits gepostetes Beispiel funktionieren und tut es auch.
Ich habe jetzt mal ein etwas komplexeres Beispiel erstellt:
Basic-Dialog mit 6 Optionsbutten in 2 Gruppen je 3 so gruppiert wie oben beschrieben, 1 Schalrfläche zum Anzeigen der aktuellen Werte der Optionsbutton und 6 Schaltflächen zum Setzen der 2x3 Optionen mittels Basic-Code.
Code: Alles auswählen
'========================================================
'Demonstrationsbeispiel zur Verwendung des Optionsbuttons
'
'Autor: Stephan M. Schwarz Datum: 15.07.2004
'========================================================
Option Explicit
Dim oDialog as Object
Dim ergebnis as Boolean
Dim Optionsname
Dim Wert
Sub LoadForm
DialogLibraries.LoadLibrary("Standard")
oDialog = createUnoDialog(DialogLibraries.Standard.mein_Dialog)
'Vorgabewert für jede Gruppe setzen
setzen_11
setzen_21
'anzeigen
oDialog.execute()
End Sub
'=====================================================
'Setzen der Optionen per Code für beide Optionsgruppen
'=====================================================
'Gruppe1/Option1
Sub setzen_11
Optionsname = "OptionButton1"
Wert = TRUE
setzen_der_Option (Optionsname, Wert)
End sub
'Gruppe1/Option2
Sub setzen_12
Optionsname = "OptionButton2"
Wert = TRUE
setzen_der_Option (Optionsname, Wert)
End sub
'Gruppe1/Option3
Sub setzen_13
Optionsname = "OptionButton3"
Wert = TRUE
setzen_der_Option (Optionsname, Wert)
End sub
'Gruppe2/Option1
Sub setzen_21
Optionsname = "OptionButton4"
Wert = TRUE
setzen_der_Option (Optionsname, Wert)
End sub
'Gruppe2/Option2
Sub setzen_22
Optionsname = "OptionButton5"
Wert = TRUE
setzen_der_Option (Optionsname, Wert)
End sub
'Gruppe2/Option3
Sub setzen_23
Optionsname = "OptionButton6"
Wert = TRUE
setzen_der_Option (Optionsname, Wert)
End sub
'=========================================
'aktuelle Werte für alle Optionen anzeigen
'=========================================
Sub kontrolle
msgBox "Gruppe1/Option1 = " & oDialog.getControl("OptionButton1").State & CHR(13) & _
"Gruppe1/Option2 = " & oDialog.getControl("OptionButton2").State & CHR(13) & _
"Gruppe1/Option3 = " & oDialog.getControl("OptionButton3").State & CHR(13) & _
"Gruppe2/Option1 = " & oDialog.getControl("OptionButton4").State & CHR(13) & _
"Gruppe2/Option2 = " & oDialog.getControl("OptionButton5").State & CHR(13) & _
"Gruppe2/Option3 = " & oDialog.getControl("OptionButton6").State
End Sub
Function setzen_der_Option (Optionsname , Wert)
oDialog.getControl(Optionsname).State = Wert
End Function
Gruß
Stephan
Zuletzt geändert von Stephan am Fr, 16.07.2004 19:42, insgesamt 1-mal geändert.
@ Stefan,
Um ein bischen Klarheit in das Dunkel zu bringen: Ja, wir sprechen von unterschiedlichen Dingen. Während du Dialog-Boxen meinst (und da funktioniert es, so wie du es beschreibst), gibt es auch noch "einfache" Formulare, in die du Optionsbutons einbauen kannst. Und das ist sehr viel häufiger der Fall, als mit eigenständigen Dialogboxen zu arbeiten.
Und dort haben wir das Phänomen: In einem Formular wurden in Version 1 *alle* Optionsfelder in Abhängigkeit zueinander gesetzt. Dieser Fehler wurde ab Version 1.1.1 behoben, mit dem Effekt, dass jetzt immer die Optionsfelder zusammen gehören, die den gleichen Namen tragen. Und jetzt beginnt die Schwierigkeit der Ansprache, bei Objekten mit gleichen Namen.
Die Zusammengehörigkeit einer Optionsfeldgruppe bedeutet: Es kann immer nur ein Feld aktiviert werden, alle anderen werden automatisch ausgeschaltet.
@ Moorhuhn,
jo, der Referenzwert ist genau wie der Status eine Eigenschaft des Objektes und kann somit auch ausgelesen werden. Das ist auch nicht schwierig - die Problematik liegt im Bekommen des richtigen Objektes. Bei gleichen Namen der Objekte (Optinsfeld-Name = Name des Objektes) ist das einfach Glückssache, welches gerade ausgewählt wurde. Hab da noch keine Systematik feststellen können. Um den Wert zu erhalten:
wobei oForm das Formularobjekt ist.
Der Referenzwert selbst nützt ja auch nichts, wenn man das Objekt nicht hat. Wahrscheinlich gibt es noch ein Gruppenobjekt, vielleicht muss man auch eine Nummerierung erzeugen und dann per Schleife durchzählen oder irgendwie anders... Da fehlt mir noch die riichtige Idee.
Gruss
Thomas
Um ein bischen Klarheit in das Dunkel zu bringen: Ja, wir sprechen von unterschiedlichen Dingen. Während du Dialog-Boxen meinst (und da funktioniert es, so wie du es beschreibst), gibt es auch noch "einfache" Formulare, in die du Optionsbutons einbauen kannst. Und das ist sehr viel häufiger der Fall, als mit eigenständigen Dialogboxen zu arbeiten.
Und dort haben wir das Phänomen: In einem Formular wurden in Version 1 *alle* Optionsfelder in Abhängigkeit zueinander gesetzt. Dieser Fehler wurde ab Version 1.1.1 behoben, mit dem Effekt, dass jetzt immer die Optionsfelder zusammen gehören, die den gleichen Namen tragen. Und jetzt beginnt die Schwierigkeit der Ansprache, bei Objekten mit gleichen Namen.
Die Zusammengehörigkeit einer Optionsfeldgruppe bedeutet: Es kann immer nur ein Feld aktiviert werden, alle anderen werden automatisch ausgeschaltet.
@ Moorhuhn,
jo, der Referenzwert ist genau wie der Status eine Eigenschaft des Objektes und kann somit auch ausgelesen werden. Das ist auch nicht schwierig - die Problematik liegt im Bekommen des richtigen Objektes. Bei gleichen Namen der Objekte (Optinsfeld-Name = Name des Objektes) ist das einfach Glückssache, welches gerade ausgewählt wurde. Hab da noch keine Systematik feststellen können. Um den Wert zu erhalten:
Code: Alles auswählen
sWert = oForm.getByName("Optionsfeldname").getRev
Der Referenzwert selbst nützt ja auch nichts, wenn man das Objekt nicht hat. Wahrscheinlich gibt es noch ein Gruppenobjekt, vielleicht muss man auch eine Nummerierung erzeugen und dann per Schleife durchzählen oder irgendwie anders... Da fehlt mir noch die riichtige Idee.
Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Hallo zusammen,
endlich vollbracht - hoffe ich ...
@Toxitom
... Sorry.
(Ich programmiere häufiger mit Access und dort ist 'Formular' die Bezeichnung für das was unter VBA eigentlich 'UserForm' und unter StarBasic 'Basic-Dialog' heißt. Ich habe das Ganze so verinnerlicht das ich alle diese Objekte umgangssprachlich als 'Formular' bezeichne. Dieser "Denkreflex" hat mich bei OpenOffice schon öfter auf die falsche Fährte geführt, so auch in diesem Thread...)
@Alle
Für ein OpenOffice-Formular (2 Optionsgruppen mit je 3 Optionen) funktioniert folgender Code (getestet OpenOffice 1.1.1 und SO 7 Patch 2):
Es kann auf jede einzelne Option (Optionsbutton) zugegriffen und jede Option mittels StarBasic-Code gesetzt werden.
Gruß
Stephan
endlich vollbracht - hoffe ich ...
@Toxitom
Ja Du hast völlig Recht, es steht "Formular" am Anfang des ThreadsUm ein bischen Klarheit in das Dunkel zu bringen: Ja, wir sprechen von unterschiedlichen Dingen. Während du Dialog-Boxen meinst (und da funktioniert es, so wie du es beschreibst), gibt es auch noch "einfache" Formulare, in die du Optionsbutons einbauen kannst. Und das ist sehr viel häufiger der Fall, als mit eigenständigen Dialogboxen zu arbeiten.

(Ich programmiere häufiger mit Access und dort ist 'Formular' die Bezeichnung für das was unter VBA eigentlich 'UserForm' und unter StarBasic 'Basic-Dialog' heißt. Ich habe das Ganze so verinnerlicht das ich alle diese Objekte umgangssprachlich als 'Formular' bezeichne. Dieser "Denkreflex" hat mich bei OpenOffice schon öfter auf die falsche Fährte geführt, so auch in diesem Thread...)
@Alle
Für ein OpenOffice-Formular (2 Optionsgruppen mit je 3 Optionen) funktioniert folgender Code (getestet OpenOffice 1.1.1 und SO 7 Patch 2):
Code: Alles auswählen
Option Explicit
Global oDoc as Object
Global oView as Object
Global oForm as Object
Global anzeige as String
Sub formular_initialisieren
oDoc = ThisComponent
oView = oDoc.CurrentController
'nur ein Formular namens 'Standard' wird berücksichtigt
oForm = oDoc.DrawPage.Forms.GetByName("Standard")
'Optionen voreinstellen für beide Gruppen
option_setzen ("Option 1-1")
option_setzen ("Option 2-1")
End Sub
sub ergebnis_anzeigen
Dim Radio_Gruppe
Dim a , b AS String
Dim n As Integer
Dim wert As String
For n = 0 to oForm.Count - 1
Radio_Gruppe = oForm.GetByIndex( n )
If Radio_Gruppe.Name = "Gruppe1" Then
If Radio_Gruppe.State = 0 then
wert = "FALSE"
Else
wert = "TRUE"
End If
a = a & "Optionsbutton '" & Radio_Gruppe.label & "' hat Wert: " & wert & CHR(13)
Else
If Radio_Gruppe.Name = "Gruppe2" Then
If Radio_Gruppe.State = 0 then
wert = "FALSE"
Else
wert = "TRUE"
End If
b = b & "Optionsbutton '" & Radio_Gruppe.label & "' hat Wert: " & wert & CHR(13)
End If
End if
Next
msgbox a & CHR(13) & b
End sub
Sub option_11_setzen
option_setzen ("Option 1-1")
End Sub
Sub option_12_setzen
option_setzen ("Option 1-2")
End Sub
Sub option_13_setzen
option_setzen ("Option 1-3")
End Sub
Sub option_21_setzen
option_setzen ("Option 2-1")
End Sub
Sub option_22_setzen
option_setzen ("Option 2-2")
End Sub
Sub option_23_setzen
option_setzen ("Option 2-3")
End Sub
Function option_setzen (anzeige)
Dim Radio_Gruppe
Dim n
For n = 0 to oForm.Count - 1
Radio_Gruppe = oForm.GetByIndex( n )
If Radio_Gruppe.label = anzeige Then
Radio_Gruppe.State = 1
End If
Next
End Function
Es kann auf jede einzelne Option (Optionsbutton) zugegriffen und jede Option mittels StarBasic-Code gesetzt werden.
Gruß
Stephan
Zuletzt geändert von Stephan am Mo, 19.07.2004 14:16, insgesamt 1-mal geändert.
Hei Stefan,
na, das war ja Fleissarbeit. Also ich wäre an der Datei interessiert. Kannst du mir gerne mit PM schicken.
Aber, auch nach Studium des Codes, bin ich mir noch nicht im Klaren, ob das Problem tatsächlich gelöst ist. Deswegen vielleicht die Datei.
OK, du nutzt - glaube ich - verschieden Namen. Dann hätten wir doch die ganze arbeit nicht. Nur - mit veschiedenen Namen funktionieren die Optionsbuttens nicht. Im Formulat darfst du ja immer nur eins auswählen, und das geht nur, wenn die Namen gleich sind... und hier drehen wir uns im Kreis.
Aber vielleicht überseh ich etwas.
Gruss
Thomas
na, das war ja Fleissarbeit. Also ich wäre an der Datei interessiert. Kannst du mir gerne mit PM schicken.
Aber, auch nach Studium des Codes, bin ich mir noch nicht im Klaren, ob das Problem tatsächlich gelöst ist. Deswegen vielleicht die Datei.
OK, hiermit überprüfst du die Namen der Objekte (kannst du übrigens auch direkt erreichen, ohne Schleife...) - aber genau hier setzt doch auch die Problematik ein: Die Namen der Optionsfelder sind gleich - wie unterscheidest du die?If Radio_Gruppe.label = anzeige Then
Radio_Gruppe.State = 1
End If
OK, du nutzt - glaube ich - verschieden Namen. Dann hätten wir doch die ganze arbeit nicht. Nur - mit veschiedenen Namen funktionieren die Optionsbuttens nicht. Im Formulat darfst du ja immer nur eins auswählen, und das geht nur, wenn die Namen gleich sind... und hier drehen wir uns im Kreis.
Aber vielleicht überseh ich etwas.
Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Nachtrag:
Der Weg ist aber wahrscheinlich der richtige. (Aktuell wenig Zeit, um mich reinzuknien). Also ungetestet:
Wobei man den Optionsfeldern eben noch einen eindeutigen Reverenzwert mitgeben muss. Durch die Schleife erhält man alle Objekte, die gleichen Namens werden dann mit der if-Schleife aufgelöst und man hat das, was man sucht. Und unter Tuwas... kann man eben Anweisungen ausführen, State überprüfen oder setzen und so weiter...
Gruss
Thomas
Der Weg ist aber wahrscheinlich der richtige. (Aktuell wenig Zeit, um mich reinzuknien). Also ungetestet:
Code: Alles auswählen
...
For n = 0 to oForm.Count - 1
Radio_Gruppe = oForm.GetByIndex( n )
If Radio_Gruppe.Name = "Gruppe1" Then
REM ^^^^ hier wird es mehrere Ergebnisse geben
If Radio_Gruppe.RefValue = 1 then
msgBox "erstes Optionsfeld"
tuwas....
Elseif Radio_Gruppe.RefValue = 2 then
msgbox "zweites Optionsfeld"
tuwas....
..... und so weiter
End If
Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Hallo Thomas,
Die Grundidee war (im Prinzip hattest Du es schon ähnlich angedeutet) das man in VBA die Objects-Auflistung z.B. einer UserForm in etwa so abfragen kann (Achtung kein wirklicher Code):
For each Object in UserForm.Objects
If Objekt.<irgendeineEigenschaft> = <gesuchterWert> Then
'... etwas tun
End if
Next Object
Das Verfahren ist so ähnlich wie die Suche nach dem gerade aktiven Blatt einer Calc-Datei mittels Makro. Dort kann man auch nicht direkt den Index des aktiven Blattes ermitteln, aber man kann den Namen ermitteln und in einer Schleife den Index durchzählen und immer schauen ob der dem aktuellen Index zugeordnete Name dem gesuchten entspricht.
Dein Vorschlag mit den Referenzwerten ist nicht besser und nicht schlechter als meiner mittels Label, man könnte sicher auch noch andere Eigenschaften finden, welche sich eignen.
Datei kommt umgehend per Email, hoffe das ist Dir recht.
Gruß
Stephan
das kannst Du laut sagen, habe mehrere Stunden gegrübelt.na, das war ja Fleissarbeit.
Die Grundidee war (im Prinzip hattest Du es schon ähnlich angedeutet) das man in VBA die Objects-Auflistung z.B. einer UserForm in etwa so abfragen kann (Achtung kein wirklicher Code):
For each Object in UserForm.Objects
If Objekt.<irgendeineEigenschaft> = <gesuchterWert> Then
'... etwas tun
End if
Next Object
ich unterscheide nicht die Optionsfelder anhand des Namens, sondern des Labels (der Beschriftung), die Namen müssen für eine Gruppe gleich sein, aber die Label können beliebig sein. In dem Sinne wie wir hier sprechen gibt es für einen bestimmten Namen mehrere "Treffer", jeder dieser Treffer hat aber einen anderen Index und jeder Index hat (falls so vorgegeben) ein anders Label. Du kannst das abkürzen indem Du einmal den Index der betreffenden Optionsbutton ermittelst und dann mit diesen Fixwerten arbeitest, aber das wäre keine allgemeine Lösung.Die Namen der Optionsfelder sind gleich - wie unterscheidest du die?
Das Verfahren ist so ähnlich wie die Suche nach dem gerade aktiven Blatt einer Calc-Datei mittels Makro. Dort kann man auch nicht direkt den Index des aktiven Blattes ermitteln, aber man kann den Namen ermitteln und in einer Schleife den Index durchzählen und immer schauen ob der dem aktuellen Index zugeordnete Name dem gesuchten entspricht.
Dein Vorschlag mit den Referenzwerten ist nicht besser und nicht schlechter als meiner mittels Label, man könnte sicher auch noch andere Eigenschaften finden, welche sich eignen.
Datei kommt umgehend per Email, hoffe das ist Dir recht.
Gruß
Stephan
Stimmt nicht. Dein Vorschlag bezüglich RefValue ist prinzipiell besser weil die Label-Eigenschaft (bzw. deren Wert) für den Benutzer sichtbar ist und es auch praktisch gesehen vorkommen kann das Beschriftungen von Optionen in verschiedenen Optionsgruppen gleich sein müssen/sollen, man könnte zwar tricksen (Orginalbeschriftung mit anderem "Beschriftungs"feld überdecken) aber das ist ja nicht Sinn der Sache.Dein Vorschlag mit den Referenzwerten ist nicht besser und nicht schlechter als meiner mittels Label, man könnte sicher auch noch andere Eigenschaften finden, welche sich eignen.
Im Moment habe ich jedoch noch das Problem das Ausdrücke der Form:
Radio_Gruppe.RefValue
den Fehler ('Eigenschaft oder Methode nicht gefunden') liefern. Sollte .RefValue nur ein prinzipieller Vorschlag sein, oder das korrekte/tatsächliche Schlüsselwort für die Eigenschaft? Ich nehme an es wird funktionieren wenn man für .RefValue das richtige Schlüsselwort benutzt.
Gruß
Stephan
Hallo Stefan,
Noch ein eSchäche wiest dein Code aktuell auf: Die Abfrage der Werte funktioniert zwar so wie gewünscht, nur die Anzeige der Werte aller Optionsbutons ist ja selten das Ziel einer Optionsfeldgruppe. Dieses wäre eher, eine spezielle Aktion, wenn ein bestimmtes Optionsfeld ausgewählt ist. Das ist aber so nicht direkt möglich. Denn schon bei der ersten Namensgleichheit würde ja die Aktion ausgelöst, und dann nochmals bei jeder weiteren... Da braucht man schon noch eine eindeutige Unterscheidung.
Insofern wäre mein Codevorschlag schon der bessere:
Über die Schleife suchen nach dem Namen der Optionsfelder, dadurch ist die Optionsfeldgruppe eindeutig bestimmt. Innerhalb dieser eine entsprechende Bedingungsverzweigung, festgemacht man RefValue wert, der natürlich eindeutig vergeben werden muss.
Deine Beispieldatei ist übrigens sehr gut, wenn wir (bzw. du - Ehre wem Ehre gebührt) den Code noch anpassen, sollte diese Beispiel gleich als Refernezbeispiel und eventuell Schulungsbeispiel mit Dokumentation dem OpenOffice-Projekt zur Verfügung gestellt werden.
Bleibt nur noch ein Nachsatz: Eigentlich finde ich den Weg dennoch ziemlich umständlich, verglichen mit den anderen Möglichkeiten der Formularansprache. Irgendwie glaube ich immer noch, es müsste einen einfacheren geben.
Gruss
Thomas
Sorry, da hast du natürlich recht. Hab ich verwechselt, da ich normalerweise natürlich nach dem Namen suche... Mit der Suche nach dem Label ist es natürlich mögllich, diese zu unterscheiden.ch unterscheide nicht die Optionsfelder anhand des Namens, sondern des Labels (der Beschriftung), die Namen müssen für eine Gruppe gleich sein, aber die Label können beliebig sein.
Das ist schon der richtige Ausdruck, liefert einen String zurück (kannst du in den Eigenschaften setzen). Der Fehler liegt aber wahrscheinlich daran, dass dein Code (noch) nicht fehlersicher ist. Die Eigenschaft RefValue gibt es nur bei Optionsfeld-Objekten. Bei deiner Schleife werden aber alle Objekte zunächst referiert, so dass durchaus auch ein Objekt zuerst auftaucht, das keine RevValue Eigenschaft hat. Und dann gibt es einen Fehler.Radio_Gruppe.RefValue
Noch ein eSchäche wiest dein Code aktuell auf: Die Abfrage der Werte funktioniert zwar so wie gewünscht, nur die Anzeige der Werte aller Optionsbutons ist ja selten das Ziel einer Optionsfeldgruppe. Dieses wäre eher, eine spezielle Aktion, wenn ein bestimmtes Optionsfeld ausgewählt ist. Das ist aber so nicht direkt möglich. Denn schon bei der ersten Namensgleichheit würde ja die Aktion ausgelöst, und dann nochmals bei jeder weiteren... Da braucht man schon noch eine eindeutige Unterscheidung.
Insofern wäre mein Codevorschlag schon der bessere:
Über die Schleife suchen nach dem Namen der Optionsfelder, dadurch ist die Optionsfeldgruppe eindeutig bestimmt. Innerhalb dieser eine entsprechende Bedingungsverzweigung, festgemacht man RefValue wert, der natürlich eindeutig vergeben werden muss.
Deine Beispieldatei ist übrigens sehr gut, wenn wir (bzw. du - Ehre wem Ehre gebührt) den Code noch anpassen, sollte diese Beispiel gleich als Refernezbeispiel und eventuell Schulungsbeispiel mit Dokumentation dem OpenOffice-Projekt zur Verfügung gestellt werden.
Bleibt nur noch ein Nachsatz: Eigentlich finde ich den Weg dennoch ziemlich umständlich, verglichen mit den anderen Möglichkeiten der Formularansprache. Irgendwie glaube ich immer noch, es müsste einen einfacheren geben.
Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
So ich es lese sehe ich sofort - ja hast Du recht ich werde das ändern. Das mein Code nicht fehlersicher ist wußte ich aber Deine Kritik bringt mich auf den Gedanken das mein Code ist überhaupt nicht fehlersicher ist. Ich hatte bisher nur Glück das ich nur 3 Arten von Steuerelementen auf dem Formular hatte...Das ist schon der richtige Ausdruck, liefert einen String zurück (kannst du in den Eigenschaften setzen). Der Fehler liegt aber wahrscheinlich daran, dass dein Code (noch) nicht fehlersicher ist. Die Eigenschaft RefValue gibt es nur bei Optionsfeld-Objekten. Bei deiner Schleife werden aber alle Objekte zunächst referiert, so dass durchaus auch ein Objekt zuerst auftaucht, das keine RevValue Eigenschaft hat. Und dann gibt es einen Fehler.
Ich werde das wohl spontan erst mal mit On Error... lösen, aber sicher gibt es ein Konstrukt "IF <Objekt>.Supports(UNO)Service" muß da erstmal wieder den richtigen Service suchen. (Nirgens gibt es eine systematische umfassende Darstellung zu den ganzen "UNO-Geschichten", auch das Developersguide bietet nur eine willkürliche Auswahl.)
Noch ein eSchäche wiest dein Code aktuell auf: Die Abfrage der Werte funktioniert zwar so wie gewünscht, nur die Anzeige der Werte aller Optionsbutons ist ja selten das Ziel einer Optionsfeldgruppe. Dieses wäre eher, eine spezielle Aktion, wenn ein bestimmtes Optionsfeld ausgewählt ist.
Naja es war nur eine Demodatei und diese sollte nur belegen das ich alle Optionbutton per Code auslesen und setzen kann.
Ansonsten ist die Erstellung einer spezifischen Abfrage kein Problem und wenn andererseits etwas "losgehen" soll wenn der Benutzer die Option manuell ändert (z.B. Inhalt von Kombinationsfeldern ändern) geht das über die Ereignisse des Optionsfeldes. Ich habe da auch noch ein eleganteres Codebeispiel wie man sowas mit einem "Listener" realisiert, aber das ist ganz sicher nicht als Beispiel (zum Erlernen der Grundlagen der Star-Basic-Programmierung) geeignet.
Genau das mache ich doch (siehe Sub ergebnis_anzeigen) bzw. kann es ("immer") so machen wie in dem Sub, für die Beispieldatei sah ich nicht die Notwendigkeit für alle Aktionen so vorzugehen. Ich habe bisher nur erst nach Name und dann nach Label gesucht und hatte Dir bezüglich RefValue schon zugestimmt das das zweckmäßiger ist.Über die Schleife suchen nach dem Namen der Optionsfelder, dadurch ist die Optionsfeldgruppe eindeutig bestimmt. Innerhalb dieser eine entsprechende Bedingungsverzweigung, festgemacht man RefValue wert, der natürlich eindeutig vergeben werden muss.
Mmm... weiß nicht. Aber: Irgendwie glaube ich immer noch, es sollte einen einfacheren geben. (i.S. von den Entwicklern von OpenOffice so implementiert)Bleibt nur noch ein Nachsatz: Eigentlich finde ich den Weg dennoch ziemlich umständlich, verglichen mit den anderen Möglichkeiten der Formularansprache. Irgendwie glaube ich immer noch, es müsste einen einfacheren geben.
Wenn Du meinst das wäre nützlich für das OpenOffice-Projekt werde ich das jetzt noch mal gründlich überarbeiten.
Bitte teile mir doch mal mit welche Funktionalität(en), Deiner Meinung nach, in der Beispieldatei realisiert werden sollten.
Gruß
Stephan
Hallo Stephan,
also, es sollte keine Kritik sein höchstens Vorschläge zur Verbesserung.
Ansonsten ist die schon ok, also ncht zu viel Aufwand.
Gruss
Thomas
also, es sollte keine Kritik sein höchstens Vorschläge zur Verbesserung.
Das ist natürlich richtig. Ein unbedarfter User hat aber die Lösung noch nicht erreicht! Und so schlägt sich der Bogen zum ersten und ursprünglichen Thread: Da hat einer zwei Optionsfelder (Bildschirm, Drucker) und muss nun per Basic entscheiden, welche Aktion zu tun ist. Also: Schleife über alle Formularfelder, die Optionsfeldgruppe heraussuchen. Innerhalb dieser suchen, welches Optionsfeld eingeschaltet ist (State=true), dieses Optionsfeld eindeutig identifizieren (geht nicht über name) und dann eine entsprechende Aktion ausführen.Genau das mache ich doch (siehe Sub ergebnis_anzeigen) bzw. kann es ("immer") so machen wie in dem Sub,
Eben genau dieses. Also zum Beispiel eine MsgBox, dass genau das Ereignis "Option 2-1" oder so ausgewählt wurde.Bitte teile mir doch mal mit welche Funktionalität(en), Deiner Meinung nach, in der Beispieldatei realisiert werden sollten.
Ansonsten ist die schon ok, also ncht zu viel Aufwand.
Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic