VB -43: Radio-Buttons

Eine Option kommt selten allein...

Bisher haben wir die Auswahl der Übung über unser Menü "Übung" mit den entsprechenden Untermenüs gemacht. Bei sehr vielen Auswahlmöglichkeiten kann das jedoch unübersichtlich werden. Wir wollen uns deshalb einer möglichen Alternative zuwenden: Auswahl über "Radio-Buttons".

Der Begriff "Radio" ist dabei der Funktionsweise von manchen Radios entlehnt, wo beim Drücken eines Knopfes die anderen automatisch rausspringen, d.h. es kann immer nur ein Knopf (z.B. zur Kanalwahl) gedrückt sein. Korrekter ist die Bezeichnung "Option"-Button/Control.

Wie bei unserem Radio treten Option-Buttons üblicherweise nicht alleine auf, sondern sie sind in einem Options-"Feld" angeordnet. Man legt dazu einen Optionsbutton an und kopiert ihn dann je nach Bedarf entsprechend oft und versieht jeden Button mit einem Index.

Wir könnten jetzt alle möglichen Rechenoperationen samt Grenzwerten in einem einzigen großen Feld anordnen. Es ist jedoch sowohl für den Benutzer als auch für die Programmlogik überschaubarer, wenn wir auch hier eine hierarchische Struktur wie in unserem Menü aufbauen. Zu diesem Zweck gibt es Frames (Rahmen), mit der man Optionsbuttons (aber auch andere Controls) gruppieren kann. Sie sind als Container zu betrachten, schlatet man z.B. einen Frame ab oder verschiebt ihn, wirkt sich das auf alle darin enthaltenen Controls aus.

Wir nehmen also einen größeren Umbau an unserem Programm vor:

Beim Erstellen von Optionsbuttons innerhalb von Frames muß man darauf achten, daß der Rahmen aktiviert ist, bevor man den Optionsbutton hineinmalt oder kopiert. Sonst kann es zwar so aussehen, als sei ein Button innerhalb eines Frames (rein optisch), logisch ist er aber diesem vielleicht nicht zugeordnet (man kann das z.B. kontrollieren, wenn man den Frame verschiebt, dann muß sich der Inhalt mit verschieben).

fraUebung(0) ist hier ein übergeordneter Rahmen, der zunächst der Auswahl der Grundrechenart dient, die weiteren Frames dienen der Auswahl der Rechengrenzen. Da sie erst ins Blickfeld kommen sollen, wenn sie auch wirklich gebraucht werden, weisen wir ihnen die Eigenschaft .visible=False zu.

     Private Sub Form_Load()
     Dim i As Integer
        For i = 1 To 4
            fraUebung(i).Visible = False    'Rahmen unsichtbar machen
        Next i
        fraUebung(0).Visible = True         'Rahmen sichtbar machen
     End Sub
 

Zum Erstellen der Frames kann man am einfachsten die Form soweit Vergrößern, daß alle Frames darauf Platz haben. Wenn dann alle Frames konstruiert sind, schiebt man sie deckungsgleich übereinander und verkleinert die Form auf das nötige Maß.

Jetzt müssen wir natürlich noch den Code anpassen:

Da wir einige Variablen jetzt sowohl in unserer Hauptform als auch in frmUebung benötigen, deklarieren wir diese jetzt global in unserem Modul allgemein.bas:

     Public aktiveUebung As String      'aktuelle Übungsart global bekannt machen
     Public MaxErgebnisWert As Integer  'aktuelles Max-Ergebnis global bekanntmachen
     Public MinErgebnisWert As Integer  'aktuelles Min-Ergebnis global bekanntmachen
     Public MaxFaktor As Integer        'aktueller Max-Faktor global bekanntmachen
 

Um Verwechslungen auszuschließen, benenne ich unsere Prozedur "UebungWaehlen" in "UebungAusfuehren" um.

Um die frmUebung aufzurufen, fügen wir folgende Zeilen in unser mnuUebung-Click-Ereignis ein:

     Private Sub mnuUebung_Click()
        frmUebung.Show vbModal          'zeigt die Auswahlform für Übungen an
        Unsichtbar
        UebungAusfuehren
     End Sub
 

Da die Auswahlform nur solange sichtbar sein soll, wie benötigt, rufen wir sie mit dem Zusatz "vbModal" auf. Diese Konstante bewirkt, daß die aufrufende Form erst wieder bearbeitet werden kann, wenn die "Kind"-Form frmUebung wieder von der Bildfläche verschwunden ist.

Beim Start von frmUebung wird zunächst der einzig sichtbare Frame fraUebung(0) angezeigt. Hier kann zwischen den Rechenarten gewählt werden:

     Private Sub optUebung_Click(Index As Integer)
        Select Case Index
        Case 0
            aktiveUebung = "Zählen"         'Uebung merken
            Exit Sub
        Case 1
            MaxErgebnisWert = 9
            MinErgebnisWert = 2
            aktiveUebung = "SymbAddition"   'Uebung merken
            Exit Sub
        Case 2
            aktiveUebung = "Addition"       'Uebung merken
        Case 3
            aktiveUebung = "Subtraktion"    'Uebung merken
        Case 4
            aktiveUebung = "Multiplikation" 'Uebung merken
        Case 5
            aktiveUebung = "Division"       'Uebung merken
        End Select

        fraUebung(0).Visible = False        'aktiven Rahmen unsichtbar machen
        fraUebung(Index - 1).Visible = True 
        'zum Rahmen mit der ausgewählten Rechenart wechseln
     End Sub
 

In den ersten beiden Fällen können wir sofort die Prozedur verlassen, da es hier keine weitere Auswahl gibt. In den anderen Fällen merken wir uns die Übungsart, lassen den ersten Frame verschwinden und machen stattdessen den Frame sichtbar, der die weiteren Optionen zur ausgewählten Rechenart anzeigt.

Alle Prozeduren, die von unserem Übungsmenü übrig geblieben sind (mnuAddition...) löschen wir aus der Hauptform, sie werden jetzt im Modul frmUebung ausgeführt:

     Private Sub optAddition_Click(Index As Integer)
        ErgebnisWert (Index)            'Zahlenbereich aus Options-Index bestimmen
     End Sub

     Private Sub optDivision_Click(Index As Integer)
        MaxFaktorSuchen (Index)         'Zahlenbereich aus Options-Index bestimmen
     End Sub

     Private Sub optMultiplikation_Click(Index As Integer)
        MaxFaktorSuchen (Index)         'Zahlenbereich aus Options-Index bestimmen
     End Sub

     Private Sub optSubtraktion_Click(Index As Integer)
        ErgebnisWert (Index)            'Zahlenbereich aus Options-Index bestimmen
     End Sub
 

Anmerkung: Man sieht leicht, daß man auch hier noch zusammenfassen könnte, aber wir lassen es der Übersichtlichkeit halber mal so stehen.

Jetzt müssen wir noch die Prozeduren "Ergebniswert" und "MaxFaktorSuchen" für unsere frmUebung zugänglich machen. Wir verfrachten sie dazu aus der Hauptform in unser Modul allgemein.bas, wodurch wir von überall darauf zugreifen können.

Das war's auch schon. Der User kann den OK-Button drücken, die Form verschwindet wieder und es wird an der aufrufenden Stelle des Hauptprogramms mit den Rechenübungen weitergemacht:

     Private Sub cmdOK_Click()
        Unload Me
     End Sub
 

Beispielprojekt laden

zurück Index weiter


© Copyright 1998-2000 J.Behling EMail schreiben ABC-Ware's Homepage
Weitergabe und Druck (auch in Teilen, mit Ausnahme von Privatgebrauch) ohne ausdrückliche Genehmigung der Autorin untersagt.