Galileo Computing < openbook >
Galileo Computing - Bücher zur Programmierung und Softwareentwicklung
Galileo Computing - Bücher zur Programmierung und Softwareentwicklung

...powered by haas.homelinux.net...

Einstieg in VB.NET von René Martin
- Für Programmiereinsteiger -
Einstieg in VB.NET
gp Kapitel 2 Aufbauwissen VB.NET
  gp 2.1 Ein zweiter Dialog
  gp 2.2 Ein Süßigkeitenautomat
  gp 2.3 Eine Listbox
  gp 2.4 With ... End With
  gp 2.5 Die Liste
  gp 2.6 Eine ComboBox
  gp 2.7 Die Select-Case-Verzweigung
  gp 2.8 Ein theoretischer Exkurs: Ereignisse
    gp 2.8.1 Dynamisch ein- und ausblenden
    gp 2.8.2 Dynamische Größenänderung
  gp 2.9 Zwei völlig überflüssige Beispiele
  gp 2.10 Schleifen
  gp 2.11 For ... Next
  gp 2.12 Do ... Loop
  gp 2.13 Eine Schleife über den Süßigkeiten
  gp 2.14 Ein theoretischer Exkurs: Sammlungen oder Collections
  gp 2.15 Die For ... Each-Schleife
  gp 2.16 Schleifen spielerisch
    gp 2.16.1 Primzahlen
    gp 2.16.2 Fibonacci-Zahlen
    gp 2.16.3 ggT und kgV
    gp 2.16.4 Ein Scherz zum Schluss
  gp 2.17 Rekursives Programmieren
  gp 2.18 Arrays (Datenfelder)
    gp 2.18.1 Eindimensionale Arrays
    gp 2.18.2 Mehrdimensionale Arrays
  gp 2.19 Konstanten
  gp 2.20 Funktionen
  gp 2.21 Zusammenfassung


Galileo Computing

2.8 Ein theoretischer Exkurs: Ereignisse  downtop

Bislang haben wir von Objekten nur Methoden und Eigenschaften angesehen. Sie erinnern sich: Nach einem Objekt wird ein Punkt eingegeben, danach folgt der Name der Methode (in der Auswahlliste durch einen fliegenden lila Radiergummi erkennbar) oder der Name der Eigenschaft (symbolisiert durch einen Finger, der auf ein Blatt zeigt). Nun besitzen Objekte auch Ereignisse. Diese werden durch einen gelben Blitz gekennzeichnet. Wählt man aus dem linken Dropdown-Feld das entsprechende Objekt aus, so erscheinen im rechten Feld alle zugehörigen Ereignisse. Leider muss zuerst links das Objekt gewählt werden.

Abbildung

Abbildung 2.11   Im linken Fenster wird das Steuerelement ausgewählt ...

Abbildung

Abbildung 2.12   ... und im rechten das Ereignis.

Wird eins bereits verwendet, so ist es fett gekennzeichnet.

Ein Ereignis könnte nun folgende Gestalt haben:

Private Sub Button1_Click(ByVal sender As _
System.Object, ByVal e As System.EventArgs) _
Handles Button1.Click

Sehen wir uns die Bestandteile etwas genauer an: Das Schlüsselwort Private sorgt dafür, dass die Prozedur nur innerhalb der Klasse, das heißt innerhalb des Formulars Gültigkeit hat. Das ist vernünftig, wenn auf einem zweiten Formular ein Button den gleichen Namen trägt. Button_Click ist der Name des auslösenden Ereignisses. Man könnte ihn umbenennen in Mr_Hippo oder Langnese. Der Name hat keinerlei Einfluss auf das Ereignis. Das Ereignis selbst befindet sich am Ende und trägt den Namen Button1.Click. Damit die Klasse »weiß«, dass zu diesem Objekt ein Ereignis gehört, wird zu Beginn festgelegt:

Friend WithEvents Button1 As _
System.Windows.Forms.Button
Abbildung

Abbildung 2.13   Hinter dem weggeblendeten Code verbergen sich die Initialisierungen.

Abbildung

Abbildung 2.14   Hier wird festgelegt, dass das Steuerelement Ereignisse haben kann.

Hinter den beiden Parametern »sender« und »e« verbergen sich das auslösende Objekt und zusätzliche Parameter, die, je nach Ereignistyp, übergeben werden. So besitzt beispielsweise der Parameter »e« des Ereignisses »MouseMove« die Eigenschaften »X« und »Y«, mit denen die Position des Mauszeigers bestimmt werden kann. Oder bei »KeyPress« besitzt »e« »KeyChar«. Damit können eine Reihe von Benutzereingaben auf einem Formular abgefangen werden. Dazu werden im folgenden Kapitel einige Beispiele beschrieben.

Um für unser Beispiel die Fachbegriffe von VB.NET zu verwenden: Das auslösende Ereignis ist SelectedIndexChanged, also das Ändern des Listeneintrags. Überprüft wird die Eigenschaft SelectedIndex, also die Nummer des ausgewählten Eintrags. Damit der Benutzer gezwungen wird, einen der drei Einträge auszuwählen, muss ein anderes Ereignis gewählt werden. In der linken Dropdown-Liste wird das Objekt "cboAuswahl" gewählt, in der rechten Liste, in der sich die Ereignisse befinden, wählt man "Leave" aus. Denn erst nachdem der Benutzer den Text eingegeben oder aus der Liste ausgewählt hat, wird entschieden, ob dieser Eintrag korrekt war:

Private Sub cboAuswahl_Leave(ByVal sender As _
System.Object, ByVal e As System.EventArgs) _
Handles cboAuswahl.Leave
Select Case cboAuswahl.Text
   Case "Einzelauswahl", _
      "Mehrfachauswahl mit Strg/Shift", _
      "Mehrfachauswahl ohne Strg/Shift"
   Case Else
      MessageBox.Show _
      ("Bitte einen gültigen Eintrag auswählen!")
      cboAuswahl.SelectedIndex = 0
      Me.lstListe.SelectionMode = _
      Windows.Forms.SelectionMode.One
End Select
End Sub

Es geht auch anders (wie in jedem beschriebenen Beispiel). Man kann auch das Ereignis TextChanged verwenden. Beispielsweise so:

Private Sub cboAuswahl_TextChanged(ByVal sender As _
Object, ByVal e As System.EventArgs) Handles _
cboAuswahl.TextChanged
If cboAuswahl.SelectedIndex < 0 Or_
   cboAuswahl.SelectedIndex > 2 Then
   MessageBox.Show("Der eingegebene Wert ist kein " & _
   "Eintrag der Liste")
   cboAuswahl.SelectedIndex = 0
End If
Abbildung

Abbildung 2.15   Nun wird der Fehler abgefangen.

Ein anderes Beispiel könnte man auf den Kaffeeautomaten des vorigen Kapitels anwenden. Dort gab es ein Textfeld, in welches der Benutzer nur Zahlen eingeben durfte. Mit der Funktion IsNumeric wird dies beim Verlassen überprüft. Man könnte jedoch schon beim Tippen überprüfen, was denn der Benutzer eigentlich eingibt. Wird das Objekt (hier: »txtGeld«) aus der Liste der Steuerelemente ausgewählt, dann stehen vier Ereignisse zur Verfügung:

KeyPress, KeyUp, KeyDown und TextChanged

Abbildung

Abbildung 2.16   Andere Ereignisse

Die Unterschiede sind gering. Während KeyPress als Objekt »e« empfängt, das die Eigenschaft KeyChar besitzt (also das Zeichen, welches auf der Tastatur gedrückt wurde), so verfügt »e« bei KeyDown über KeyValue und KeyCode. Mit KeyDown kann zusätzlich abgefangen werden, ob die (Umschalt)-, die (Strg)- oder die (Alt)-Taste gedrückt wurde. KeyUp ist für unser Beispiel ungeeignet, da sich das eingegebene Zeichen bereits im Textfeld befindet. Auch TextChanged ist für unser Beispiel unbrauchbar, weil dieses Ereignis nicht abgebrochen werden kann. Und wie bricht man ein Ereignis ab?

Das Objekt »e« verfügt über die Methode Handled(). Wird sie auf True gesetzt, so wird das vom Benutzer ausgelöste Ereignis (hier: der Tastendruck) nicht ausgeführt. Dann bleibt nur noch die Frage, wie die Tasten außerhalb des Zahlenbereichs eingegrenzt werden können. Dafür steht die Funktion Asc zur Verfügung, die den ASCII-Code der Zeichen ermittelt. Also:

Private Sub txtGeld_KeyPress(ByVal sender As _
Object, ByVal e As _
System.Windows.Forms.KeyPressEventArgs) _
Handles txtGeld.KeyPress
Select Case Asc(e.KeyChar.ToString)
   Case Is < Asc("0")
      e.Handled() = True
   Case Is > Asc("9")
      e.Handled() = True
   Case Else
      e.Handled() = False
   End Select
End Sub

Sicherlich könnte man die Lösung auch etwas »knapper« formulieren. Dennoch: Beim Testen fällt auf, dass der Benutzer kein Komma eingeben darf. Auch das kann abgefangen werden:

Private Sub txtGeld_KeyPress(ByVal sender As _
Object, ByVal e As _
System.Windows.Forms.KeyPressEventArgs) _
Handles txtGeld.KeyPress
Select Case Asc(e.KeyChar.ToString)
   Case Asc(",")
      If Me.txtGeld.Text.IndexOf(",") >= 0 Then
         e.Handled() = True
      End If
   Case Is < Asc("0")
...
   End Select
End Sub
Abbildung

Abbildung 2.17   Nun sind nur noch Ziffern und keine anderen Zeichen mehr möglich.

Mit der Methode IndexOf wird überprüft, ob bereits ein Komma in der Zeichenkette vorhanden ist. Falls nicht, so liefert diese Funktion den Wert –1, falls ein oder mehrere Kommata sich darin befinden, gibt sie die erste Position zurück – beginnend bei 0!

Abbildung

Abbildung 2.18   Nun gibt es auch ein Komma.

Zum Schluss stellt sich noch die Frage, ob hinter der Befehlsschaltfläche überprüft werden muss, ob das Textfeld einen numerischen Wert enthält. Die Antwort ist: Ja. Dem findigen Benutzer fällt möglicherweise auf, dass er das Textfeld mit dem Inhalt des Zwischenspeichers füllen kann (über das Kontextmenü Einfügen); also irgendwo irgendetwas markieren, kopieren und ins Textfeld einfügen. Damit steht nun wieder Text und keine Zahl im Feld, was überprüft werden muss.

Eine private Bemerkung an dieser Stelle: Ich verwende sehr viele Gedanken und viele Codezeilen für solche Fragen der falschen Eingabe oder fehlerhaften Bedienung. Ich möchte dem Anwender, der mit meinen Programmen arbeitet, helfen, schnell und effizient zu arbeiten. Dennoch: Ab und zu bin ich verblüfft, wozu Benutzer fähig sind, auf welche Gedanken sie kommen und wie sie die von mir eingebauten Maßnahmen, die sie an etwas hindern sollen, umgehen.


Galileo Computing

2.8.1 Dynamisch ein- und ausblenden  downtop

Im ersten Kapitel wurden bereits einige dynamische Steuerelemente gezeigt, die dem Benutzer helfen, falsche Eingaben zu verhindern.

Dem Benutzer wird auf einem Dialogblatt ein Kontrollkästchen zur Verfügung gestellt. Dieses ist nicht ausgewählt. Zu diesem Kontrollkästchen gehören zwei Beschriftungs- und zwei Eingabefelder. Die Beschriftungsfelder sind grau, das heißt, ihre Eigenschaft Enabled wurde auf False gesetzt. Auch die beiden Textfelder sind inaktiv. Dies geschieht beim Initialisieren des Blattes:

Private Sub frmSeitenzahlenformat_Load(ByVal sender _
   As System.Object, ByVal e As System.EventArgs) _
   Handles MyBase.Load
   Me.txtZahlenformat.Text = "1,2,3..."
   Me.optFortsetzen.Value = True

   Me.lblBeginn.Enabled = False
   Me.txtBeginn.Enabled = False

   Me.lblTrennzeichen.Enabled = False
   Me.txtTrennzeichen.Enabled = False

End Sub
Abbildung

Abbildung 2.19   Ein Beispiel aus Word

Klickt nun der Benutzer auf das Kontrollkästchen »chkKapitelnummer“, werden die beiden Bezeichnungsfelder und die Eingabefelder wieder aktiv (Enabled = True), die Textfelder zusätzlich noch weiß. Falls das Kästchen wieder ausgeschaltet wird, werden die Grundeinstellungen wieder zurückgesetzt:

Private Sub chkKapitelnummer_Click()
   If Me.chkKapitelnummer.Value = True Then
    
      Me.lblBeginn.Enabled = True
      Me.txtBeginn.Enabled = True

      Me.lblTrennzeichen.Enabled = True
      Me.txtTrennzeichen.Enabled = True
    
   Else

      Me.lblBeginn.Enabled = False
      Me.txtBeginn.Enabled = False

      Me.lblTrennzeichen.Enabled = False
      Me.txtTrennzeichen.Enabled = False
    
   End If
End Sub

Das Gleiche gilt für die Optionsbuttons im unteren Teil. Klickt der Benutzer auf den Button »optBeginnen«, dann wird in das Textfeld eine Zahl geschrieben. Klickt er auf den oberen Button, verschwindet diese Zahl wieder:

Private Sub optBeginnen_CheckedChanged(ByVal sender As System.Object, ByVal e 
As System.EventArgs) 
Handles optBeginnen.CheckedChanged
   txtBeginnen.Value = "1"
   txtBeginnen.SetFocus
End Sub
Private Sub optFortsetzen_CheckedChanged(ByVal sender As System.Object, ByVal e 
As System.EventArgs) 
Handles optFortsetzen.CheckedChanged
   txtBeginnen.Value = ""
End Sub
Abbildung

Abbildung 2.20   Ein Klick auf das Kontrollkästchen zeigt das Textfeld.

Häufig ist es nötig, die Dialogblätter so zu entwerfen, dass sie ihre Gestalt ändern können, je nachdem, was angeklickt wurde: Ein Klick auf ein Kontrollkästchen bewirkt, dass ein Optionsbutton sichtbar oder aktivierbar wird. Ein Klick auf ein Zeichen vergrößert das Dialogblatt. Zum Beispiel erscheint in Word in Format Schriftart Abstand die Größe 12 Punkt im Feld Punkt erst dann, wenn das Kontrollfeld Unterschneidung ab eingeschaltet wurde und verschwindet wieder, wenn das Kontrollkästchen deaktiviert wird.

Abbildung

Abbildung 2.21   Der Text erscheint, wenn das Kontrollkästchen angeklickt wird.

Oder die Einträge des Menüs Tabelle bleiben so lange deaktiviert, bis der Cursor sich nicht in einer Tabelle befindet.

Abbildung

Abbildung 2.22   Die Menüeinträge sind inaktiv.

Abbildung

Abbildung 2.23   Sitzt der Cursor in der Tabelle, werden die Einträge aktiv.

Jeder vom Benutzer eingegebene Wert wird gelöscht, wenn das Feld wieder ausgeschaltet wird. Das Blatt Bearbeiten Suchen (oder Ersetzen) lässt sich erweitern und reduzieren, um mehr Optionen anzuzeigen, die nicht zum Standard gehören.


Galileo Computing

2.8.2 Dynamische Größenänderung  toptop

Hierzu kann wieder das Klick-Ereignis benutzt werden: Ein Klick auf eine Schaltfläche vergrößert oder verkleinert die Form und ändert dabei die Beschriftung. Die Schaltfläche soll den Namen »cmdAnzeige« haben, die Form »frmRobert10«: Wenn die Höhe der Form Me 165 beträgt, so wird sie nach einem Klick auf die Schaltfläche vergrößert (auf 265) und die Beschriftung der Befehlsschaltfläche von »Reduzieren« in »Erweitern« geändert. Beträgt die Größe nicht 165 (dann beträgt sie 265), so wird sie mit einem Klick verkleinert und die ursprüngliche Beschriftung wiederhergestellt:

Private Sub butAbbrechen(ByVal sender As System.Object, ByVal e 
As System.EventArgs) 
Handles butAbbrechen.Click
   If Me.Height = 165 Then
      Me.Height = 265
      Me. butAbbrechen.Text = "Reduzieren"
   Else
      Me.Height = 165
      Me. butAbbrechen.Text = "Erweitern"
   End If
End Sub
Abbildung

Abbildung 2.24   Eine dynamische Dialogbox

Abbildung

Abbildung 2.25   Beschriftung und Größe ändern sich

  

VB.NET

Einstieg in ASP.NET

Einstieg in C#

Visual C#

VB.NET und Datenbanken

Einstieg in XML