Abfrage von Radiogroup Optionen in Basic

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

Moderator: Moderatoren

GBorn
Beiträge: 2
Registriert: Mo, 09.02.2004 21:08

Abfrage von Radiogroup Optionen in Basic

Beitrag von GBorn »

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
MoorhuhnXY
*
Beiträge: 15
Registriert: Do, 15.04.2004 15:22

Beitrag von MoorhuhnXY »

Hallo,
das verstehe ich nicht ganz. Problematik ist mir klar, aber deine Lösung nicht.
Wie muß ich jetzt die einzelnen Radiobuttens einer Gruppe "RadioGroup1" denn nun ansprechen?

Gruß
MoorhuhnXY
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

@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:

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
Der Schaltfläche des Basic-Dialogs ist im selben Modul folgender Code zugeordnet:

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
Ich hoffe das Prinzip wird deutlich.

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
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey alle,

hier misch ich mal mit, denn da habt ihr euch ein "tolles" Thema rausgesucht. OOo und Optionsfelder...
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.
Das ist nur für die Version 1.1.0 so richtig ... und war ein Bug. So soll es natürlich nicht sein.
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.
ergebnis = oDialog.getControl("OptionButton1").State
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.
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
MoorhuhnXY
*
Beiträge: 15
Registriert: Do, 15.04.2004 15:22

Beitrag von MoorhuhnXY »

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
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

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.

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 
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
Zuletzt geändert von Stephan am Fr, 16.07.2004 19:42, insgesamt 1-mal geändert.
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

@ 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:

Code: Alles auswählen

sWert = oForm.getByName("Optionsfeldname").getRev
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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Hallo zusammen,

endlich vollbracht - hoffe ich ...

@Toxitom
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.
Ja Du hast völlig Recht, es steht "Formular" am Anfang des Threads :oops: ... 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):

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.
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

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.
If Radio_Gruppe.label = anzeige Then
Radio_Gruppe.State = 1
End If
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?
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
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Nachtrag:
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 
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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Hallo Thomas,
na, das war ja Fleissarbeit.
das kannst Du laut sagen, habe mehrere Stunden gegrübelt.

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

Die Namen der Optionsfelder sind gleich - wie unterscheidest du die?
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.
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
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

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.
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.
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
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hallo Stefan,

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.
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.
Radio_Gruppe.RefValue
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.
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
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

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.
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...
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.
Ü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.
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.
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.
Mmm... weiß nicht. Aber: Irgendwie glaube ich immer noch, es sollte einen einfacheren geben. (i.S. von den Entwicklern von OpenOffice so implementiert)

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
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hallo Stephan,

also, es sollte keine Kritik sein höchstens Vorschläge zur Verbesserung.
Genau das mache ich doch (siehe Sub ergebnis_anzeigen) bzw. kann es ("immer") so machen wie in dem Sub,
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.
Bitte teile mir doch mal mit welche Funktionalität(en), Deiner Meinung nach, in der Beispieldatei realisiert werden sollten.
Eben genau dieses. Also zum Beispiel eine MsgBox, dass genau das Ereignis "Option 2-1" oder so ausgewählt wurde.
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
Antworten