Abfrage von Radiogroup Optionen in Basic

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: Abfrage von Radiogroup Optionen in Basic

Re: Abfrage von Radiogroup Optionen in Basic

von Stephan » Fr, 27.02.2009 21:51

Nix für ungut!
Nö, so war das nicht gemeint, dann hätte ich ja den post in einen separaten Thread stellen können, ich fand das nur für spätere Leser ggf. etwas verwirrend und wollte das ein wenig 'kennzeichnen'


zumal:
Abschließend noch die Erkenntnis, dass später eingefügte Optionsfelder bei mir nie als "dazugehörend" erkannt wurden - evtl. kann das tatsächlich an der nicht fortlaufenden TAB-Reihenfolge liegen.
ja nun nur ein:
natürlich liegt es an der nicht vorhandenen Aufeinanderfolge bei der Tab-REihenfolge
verdient (das ist doch der relevante Unterschied zu Formularen, wo die Namen zählen)

und es wohl auch besser wäre die eigentlich bestimmende Eigenschaft .State (und nicht .hasfocus) zur Auswertung zu benutzen.



Gruß
Stephan

Re: Abfrage von Radiogroup Optionen in Basic

von oktobaer » Fr, 27.02.2009 21:30

... OK, Du hast Recht - im Betreff ist es aber allgemein beschrieben...

Habe Beitrag gelöscht!

Oktobaer

Re: Abfrage von Radiogroup Optionen in Basic

von Stephan » Fr, 27.02.2009 21:24

Hoffe diese Ausführung hilft Euch etwas weiter...
zumindest gehört sie nicht zum Thema des Thredas, denn hier gehnts die ganze Zeit um Optionsbutton in Formularen und nicht in Basic-Dialogen und die Handhabung unterscheideet sich nunmal zwischen Formular und Dialog.



Gruß
Stephan

Re: Abfrage von Radiogroup Optionen in Basic

von oktobaer » Fr, 27.02.2009 21:16

Beitrag gelöscht, da es um OB's in Dialogen und nicht in Formularen ging...

Oktobaer

Re: Abfrage von Radiogroup Optionen in Basic

von sarotti » Do, 26.02.2009 14:20

Hallo noch einmal,

Sorry, da hatte ich wohl einen kleinen Denkfehler. Der Gruppierrahmen ist tatsächlich nur "schmückendes Beiwerk". Jetzt aber der funktionierende Code zu Optionsfeldern:

Code: Alles auswählen

Sub Formular_Optionsfeld

oForm=ThisComponent.drawpage.forms.getByIndex(0)

sOptionName="RadioGroup1"                                           'so heißt das Element

for i =0 to oForm.count-1                                                'alle Elemente des Formulars durchlaufen
	oFeld=oForm.getByIndex(i)
	
	if oFeld.name=sOptionName then                         'bis der Name des Elementes mit sOptionName übereinstimmt
		
		if oFeld.state=1 then                                 'das merkierte Element hat State=1
			iWert=oFeld.RefValue                    'RefValue liefert den hinterlegten Referenzwert
			sLabel=oFeld.Label                        'angezeigter Name der Option
		end if
		
	end if
next
REM **** und die weitere Verarbeitung
msgBox sLabel + ": "+iWert

end sub
Gruss
sarotti

Lösung: Abfrage von Radiogroup Optionen in Basic

von sarotti » Mi, 25.02.2009 21:29

Hallo zusammen,

altes Thema - aus 2004 und 2006 der letzte Eintrag...trotzdem - für mich durchaus aktuell....!!!

Nachdem ich nach einigem probieren und etwas "fummeln" eine eigene Lösung gefunden habe, habe ich mal ins Forum geschaut und nach einer "eleganteren" Lösung gesucht. Obwohl ein paar Tage alt, ist hier der eine oder andere Ansatz, der zunächst vielversprechend war...

Naja, ich poste einfach mal meine Lösung, die unabhängig vom Namen des Optionsfeld die Gruppierfunkton des Optionsrahmens nutzt... dieser hat nämlich nicht nur die Aufgabe eines gestalterischen Elements...

Code: Alles auswählen

Sub Formular_Optionsfeld

oForm=ThisComponent.drawpage.forms.getByIndex(0)
oGruppe=oForm.getByName("GroupBox")               'das ist der Gruppierrahmen
for i =1 to oGruppe.parent.count-1                'die Elemente der Gruppe durchlaufen (ACHTUNG: GroupBox ist auch ein Element)
	oFeld=oForm.getByIndex(i)
	if oFeld.state=1 then                         'das merkierte Element hat State=1
		iWert=oFeld.RefValue                      'RefValue liefert den hinterlegten Referenzwert
		sLabel=oFeld.Label                        'Label ist die Benennung der Option
	end if
next

msgBox sLabel + ": "+iWert

end sub
...vielleicht hilfts ja dem einen oder anderen weiter...

Gruß sarotti

Optionbuttons

von gottfried-faass » Fr, 03.02.2006 23:27

Der Beitrag kommt etwas verspätet.

Ich bin bei der Analyse des Bespiels "burger_factory" des SDK über die Behandlung von Objectboxen und Gruppierungen derselben gestoßen.

Ich hab das umgebaut, da es mir sehr umständlich erschien.

Ich hebe die Gruppierung der (3) Optionboxen auf, und gebe Ihnen individuelle Namen.
Jede ruft sein eigenes Minimakro auf und das gibt der eigentlichen Routine für die Option eine ID mit. Leider habe ich nicht herausfinden können, ob man Macroaufrufen gleich Parameter mitgeben kann, was natürlich noch sinnvoller wäre. (Weiß wer ob und wie ?)

Beispielcode
........

REM 3 Macros für 3 Optionsbuttons (beim Auslösen !!!)
SUB Age1 : call Age(1) : end sub
SUB Age2 : call Age(2) : end sub
SuB Age3 : call Age(3) : end sub

REM Gruppenbildung -> Setzt die jeweils nicht gewählten rück.

Function Age(ix as integer)
if ix <> 1 then : oForm.GetByName( "AgeRB1" ).State = 0 : end if
if ix <> 2 then : oForm.GetByName( "AgeRB2" ).State = 0 : end if
if ix <> 3 then : oForm.GetByName( "AgeRB3" ).State = 0 : end if

REM Hier kann man dann eine Routine aufrufen.
call tuwasmit(ix)

End function

von Toxitom » Sa, 17.07.2004 13:46

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

von Stephan » Sa, 17.07.2004 12:35

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

von Toxitom » Sa, 17.07.2004 09:13

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

von Stephan » Sa, 17.07.2004 07:57

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

von Stephan » Fr, 16.07.2004 21:49

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

von Toxitom » Fr, 16.07.2004 21:07

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

von Toxitom » Fr, 16.07.2004 20:55

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

von Stephan » Fr, 16.07.2004 19:32

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

Nach oben