MyBase-Schlüsselwort Wolfgang Kluge

eine wirklich große Änderung beim Vergleichen von VB6 und vb.NET ist die Möglichkeit(bzw. das ständige vorhandensein) zum Übersteuern(Override) von Funktionen.
Beim Übersteuern von Funktionen werden schon vorhandene Funktionen aus der Basisklasse überschrieben.

Dabei kann es natürlich schnell passieren, dass die schon vorhandene auch noch mitgenutzt werden soll, aber duch das Überschreiben ja nicht mehr aufgerufen wird ;)

Als Beispiel:

Eine Form hat unter vb.net zB die Übersteuerbare Funktion WndProc
(Viele kennen diese Funktion schon, da man seit VB5 (ohne Zusatzdll´s) diese Funktion auch Umleiten kann um zb die MouseWheel - Ereignisse abzufragen, die Windows an die Fensterklasse schickt.)

In dieser Funktion will man nun "reinhören", um auf bestimmte Ereignisse reagieren zu können..
In VB.Net ist das auch recht Simple.. man Übesteuert die Funktion. (Wenn man die IDE vor sich hat, sieht und findet man dies schnell..versprochen) Wenn man sich diese Funktion ausgewählt hat, erscheint folgendes im Codefenster:

Protected Overrides Sub WndProc(ByRef m As System.WinForms.Message)
  Debug.WriteLine("WndProc - Aufruf")
End Sub


Nachdem nun aber die Funktion keinen weiteren Code enthällt, (ausser der Debug-Anweisung), wird auch kein weiterer Code mehr Ausgeführt(klingt logisch..ist es auch)..
Alles was da mal war(also in der Basisklasse) wird nicht mehr aufgerufen..Folge in diesem Beispiel ist, dass nichts mehr funktioniert

Und genau hier schlägt nun das Schlüsselwort MyBase zu. Mit MyBase kann man auf eben die Funktionen zugreifen, die in der Basisklasse enthalten sind..

Wenn man also nun folgenden Aufruf noch dazubringt funktioniert alles wieder;)
MyBase.WndProc(m)


Ein weiteres, vielleicht auch besseres Beispiel ist die Übersteuerbare Funktion OnMouseWheel einer Form. Eine Form kann (wie im moment auch schon, wird aber nicht sehr oft genutzt) Scrollbalken haben..In VB.Net hat die Form dazu verschiedene Eigenschaften , um diese zu aktivieren..
Nun kann man auf das MouseWheel-Ereigniss reagieren, oder die Funktion an sich Übersteuern.. letzteres hat den Vorteil, dass man, noch bevor etwas passiert ist, auf dieses Ereigniss reagieren kann, während das Ereigniss erst danach ausgelöst wird.

Also wird diese Funktion aus der Overrides-Liste ausgewählt und es erscheint folgendes:
Protected Overrides Sub OnMouseWheel(ByRef e As System.WinForms.MouseEventArgs)

End Sub


Weiterhin kann man eigentlich sofort den Aufruf der Funktion aus der Basisklasse einfügen, da man sich sonst um das Scrollen der Inhalte, das neudarstellen der Scrollbalken usw. selbst kümmern darf(und das ist nicht wenig).

also kommt die Zeile

MyBase.OnMouseWheel(e)

schonmal dazu

Davor allerdings, kann man nun eine Eigenschaft aus System.WinForms.MouseEventArgs auslesen um entsprechend darauf zu reagieren. Z.B. könnte man beim Raufscrollen etwas anders anzeigen als beim Runterscrollen. Und zwar noch bevor gescrollt wird... Man kann so auch das Scrollen verhindern..

Nur mit dem Ereignis OnMouseWheel hat man diese Chance nicht.. da ist es schon zu spät *g*!


Einen Fehler, den man nicht (auf keinen Fall, gar nie-nicht *g*) machen darf, ist MyBase mit dem Schlüsselwort Me bzw. MyClass zu verwechseln..
Ein solch fataler Fehler würde einen Selbstaufruf (rekursiv) mit sich bringen und nie wieder die Schleife verlassen...Auch sowas kann man ausnutzen, sollte aber durchdacht sein und eine Abbruchbedinung (wie jeder rekursive Aufruf) haben.