| 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.