Seite 1 von 1

RadioButton? [erledigt]

Verfasst: So, 12. Feb 2017 15:42
von Wolfgang_B
Hallo,
ich stehe momentan wieder mal auf dem Schlauch.

Ich habe 3 Radio Buttons. Wie kann ich elegant auslesen bzw. wie die ausgewählte Caption in einer Funktion weiterverarbeiten? Problemstellung -> ich möchte aus 3 Rechnungsarten eine auswählen und diese Information mit anderen Daten in einer Funktion per Pushbutton (STORE_Rechnungsart(xxx)) weiterverarbeiten bzw. die Caption in der DB speichern.

In der Beschreibung vom RadioButton Objekt ist ein ähnliches Beispiel. Hier wird die Caption mit "bSelected := {|mp1,mp2,obj| QOut( obj:caption ) }" ausgelesen. Ich habe testweise aus QOut -> MsgBox probiert und bekomme hier auch brav die Caption vom selektierten RadioButton. Wie kann ich jetzt damit weiterarbeiten? Vom Typ (VALTYP(bselected) ist das ein B -> Codeblock. Sagt mir aber nix ...

Beste Grüße

Wolfgang

Re: RadioButton?

Verfasst: So, 12. Feb 2017 17:19
von peternmb
Wie wäre es z.B. mit einer If-Schleife

Code: Alles auswählen

if radio1:getData()
   mach_das()
elseif radio2:getData()
   mach_dies()
else
   mach_sonstwas()
endif

Re: RadioButton?

Verfasst: Mo, 13. Feb 2017 2:50
von AUGE_OHR
hi,
Wolfgang_B hat geschrieben:Ich habe 3 Radio Buttons. Wie kann ich elegant auslesen bzw. wie die ausgewählte Caption in einer Funktion weiterverarbeiten?
Radiobutton treten üblicherweise in einer Group auf.
Es kann nur ein Radiobutton aktive sein.
leider wird das nicht automatisch geregelt d.h. man muss selbst dafür sorgen das die anderen nicht aktive sind.

---

XbpRadioButton() sollten, als Gruppe, den selben Parent haben z.b. Static-GroupBox
den o:selected Callback Slot würde ich so aufbauen

Code: Alles auswählen

   // jedes XbpRadioButton()
   o:selected := {| lCheck, uNIL, oSelf | cCaption := CheckRadio(oSelf,oParent),;
                                          IF(!EMPTY(cCaption), MachWeiter(cCaption),NIL)  } 

FUNCTION CheckRadio(oSelf,oParent)
LOCAL aChild := oParent:Childlist()
LOCAL i,iMax
LOCAL cCaption := ""

   iMax := LEN(aChild)
   FOR i := 1 TO iMax
      IF aChild[i] = oSelf
         aChild[i]:SetData(.T.)
         cCaption := aChild[i]:Caption
      ELSE
         aChild[i]:SetData(.F.)
      ENDIF  
   NEXT
RETURN cCaption
bei Verwendung der DXE LIB kann man auch solche Radio / 3-State Buttons machen
DXE_Radio_3State.jpg
DXE_Radio_3State.jpg (64.23 KiB) 4045 mal betrachtet

Re: RadioButton?

Verfasst: Mo, 13. Feb 2017 8:29
von brandelh
Auch wenn das im Beispiel so angezeigt wird (caption zur Anzeige wer aktiviert wurde),
im normalen Programm sollte man keine Verzweigung nach der Caption auswählen, spätestens wenn ein Kunde eine anderssprachige Version will hat man ein Problem.
Oder man muss die Beschriftung ändern ...

Als Anzeige in einer msgbox("Sie haben "+oRB:caption+" gewählt !") ist das natürlich was anderes.

Code: Alles auswählen

oRB_Ein:Selected := {|mp1,mp2,obj| "E" }
oRB_Aus:Selected := {|mp1,mp2,obj| "A" }
so kann man einen "Rückgabewert" festlegen und später im Programm prüfen ob "E" oder "A" zurückgegeben wurde, nach einem Select (mit der Maus).

Code: Alles auswählen

bekomme hier auch brav die Caption vom selektierten RadioButton. Wie kann ich jetzt damit weiterarbeiten? 
Vom Typ (VALTYP(bselected) ist das ein B -> Codeblock. Sagt mir aber nix ...
du solltest die Grundlagen über Eventgesteuerte Programmierung lesen (Hilfe).
Die VARIABLE des Objekts wird mit einem Codeblock bestückt, der ausgeführt wird, nachdem ein Event (Maus selectiert den RB) ausgelöst wurde.
Falls man selbst einen codeblock auswerten möchte, kann man Eval(bBlock) => Rückgabewert nutzen.

Re: RadioButton?

Verfasst: Mo, 13. Feb 2017 9:24
von Rolf Ramacher
Hallo Wolfgang

ich mache das so. Hier wähle ich aus "alle Saison" oder Saison von 1-9 diese information steht in einem Array

Code: Alles auswählen

	bSelected := {|mp1,mp2,obj| aFelder[6][2]:=obj:caption  } 

   oXbp := XbpRadiobutton():new( drawingArea, , {020,220}, {100,20} )
   oXbp:caption := aFelder[6][1]
   oXbp:tabStop := .T.
	oXbp:setInputFocus:={ ||  HiliteSle( oXbp )  } 
	oXbp:selected:=bSelected
   oXbp:create()
	oXbp:setdata(.t.)
	oXbp:killInputFocus:={ ||  DeHiliteSle( oXbp )  } 

	oStatic := XbpStatic():new( drawingArea,, {150,220},  {50,20} ) 
	oStatic:options := XBPSTATIC_TEXT_LEFT
	oStatic:caption := "oder"
	oStatic:create()

	aPos:={230,220}

	For i = 1 to 9
	   oXbp := XbpRadiobutton():new( oDlg, , aPos, {40,20} )
	   oXbp:caption := strzero(i,1)
	   oXbp:tabStop := .T.
		oXbp:setInputFocus:={ || HiliteSle( oXbp )  } 
		oXbp:selected:=bSelected
	   oXbp:create()
		oXbp:killInputFocus:={ ||  DeHiliteSle( oXbp )  } 
		aPos[01]+=50
	Next i
In der weiteren Ausdruckfuntion wird so ausgewertet:

Code: Alles auswählen

	If aFelder[6][2]="Alle Saison"
		cSaison:=aFelder[6][1]
		lSai:=.f.
	Else
		cSaison:="Saison: "+aFelder[6][2]
		lSai:=.t.
	EndIf
funktioniert tadellos - vielleicht hiflt es dir

Re: RadioButton?

Verfasst: Mi, 15. Feb 2017 9:13
von Wolfgang_B
Hallo Kollegen,

herzlichen Dank für die Tipps,

ich habe mich für die Version von Rolf entschieden. Merci Rolf. Quick and dirty, funktioniert aber einwandfrei. Man muß allerdings die Situation abfangen, wenn nichts angeklickt wird und die Standardeinstellung übernommen wird. In diesem Fall wird sonst NIL zurückgegeben.

@Hubert - Du hast recht, das Studium theoretischer Grundlagen wären bestimmt hilfreich. Ein Selbststudium fällt mir aufgrund der spärlichen Dokumentation bzw. Literatur von Xbase++ allerdings sehr schwer. Ich werde mich aber redlich weiter bemühen :D

Beste Grüße

Wolfgang