Einführung in Prozeduren

Sie können sich das Programmieren erleichtern, indem Sie Programme in kleinere logische Komponenten unter­teilen. Diese Komponenten - sogenannte Prozeduren - können Sie dann als Bausteine zur Erweiterung von Visual Basic verwenden.

Prozeduren sind hilfreich zur Zusammenfassung von sich wiederholenden oder vielfach verwendeten Operationen, z.B. häufig ausgeführte Berechnungen, Änderungen von Text und Steuerelementen und Datenbankoperationen.

Das Programmieren mit Prozeduren bietet zwei Hauptvorteile:

·     Mit Hilfe von Prozeduren können Sie Ihre Programme in abgetrennte logische Einheiten unterteilen. Diese Einheiten lassen sich leichter auf Fehler überprüfen als ein umfassendes Programm ohne Prozeduren.

·     Prozeduren aus einem Programm können ohne oder nur mit geringfügigen Veränderungen als Bausteine für andere Programme verwendet werden.

In Visual Basic werden verschiedene Arten von Prozeduren verwendet:

·     Sub-Prozeduren geben keinen Wert zurück.

·     Function-Prozeduren geben einen Wert zurück.

·     Property-Prozeduren können Werte zurückgeben und zuweisen sowie auf Objekte verweisen.

Sub-Prozeduren

Eine Sub-Prozedur ist ein Code-Block, der als Reaktion auf ein Ereignis ausgeführt wird. Wenn Sie den Code in einem Modul in Sub-Prozeduren aufteilen, erleichtern Sie sich das Auffinden und Verändern des Codes.

Die Syntax für eine Sub-Prozedur lautet wie folgt:

[Private|Public][Static]Sub Prozedurname (Argumente)

     .... (Anweisungen)

End Sub

Jedes Mal, wenn die Prozedur aufgerufen wird, werden die Anweisungen zwischen Sub und End Sub ausgeführt. Sub-Prozeduren sind standardmäßig öffentlich in allen Modulen, d.h. sie können von überallher in der Anwendung aufgerufen werden.

Die Argumente für eine Prozedur sind mit Variablendeklarationen vergleichbar. Sie deklarieren Werte, die von der aufrufenden Prozedur übergeben werden.

In Visual Basic gibt es zwei Arten von Sub-Prozeduren: allgemeine Prozeduren und Ereignisprozeduren.

Allgemeine Prozeduren

Eine allgemeine Prozedur teilt einer Anwendung mit, wie eine bestimmte Operation durchzuführen ist. Nachdem die Prozedur definiert ist, muß sie explizit durch die Anwendung aufgerufen werden. Eine Ereignisprozedur bleibt dagegen inaktiv, bis ein bestimmtes Ereignis eintritt, das vom Benutzer oder vom System ausgelöst wurde, und wird dann als Reaktion auf dieses Ereignis ausgeführt.

Abbildung 59:   Aufruf allgemeiner Prozeduren durch Ereignisprozeduren

Wann ist es sinnvoll, allgemeine Prozeduren zu erstellen? Allgemeine Prozeduren sind z.B. nützlich, wenn ver­schiedene Ereignisprozeduren die gleichen Operationen durchführen müssen. Eine gute Programmierstrategie besteht in diesem Fall darin, die gemeinsam genutzten Anweisun­gen in eine separate (allgemeine) Prozedur zu schreiben, die von den verschiedenen Ereignisprozeduren aufgerufen wird. Dadurch müssen Sie nicht mehrmals den gleichen Code schreiben, und die Anwendung lässt sich einfacher pflegen. Die Videorecorder-Beispielanwendung verwendet z.B. eine allgemeine Prozedur, die von den Click-Ereignissen für unterschiedliche Tasten aufgerufen wird. Abb. 59 veranschaulicht die Verwendung einer allgemeinen Prozedur. Code in den Click-Ereignissen ruft die Sub-Prozedur ButtonManager auf, die ihren eigenen Code ausführt und die Steuerung anschließend wieder an die Click-Ereignisprozedur zurückgibt.

Ereignisprozeduren

Wenn ein Objekt in Visual Basic erkennt, daß ein Ereignis eingetreten ist, ruft es unter Verwendung des Ereignisnamens automatisch die entsprechende Ereignisprozedur auf. Da durch den Namen eine Verbindung zwischen dem Objekt und dem Code hergestellt wird, spricht man auch davon, daß Ereignisprozeduren mit Formularen und Steuerelementen verbunden sind.

·     Der Name einer Ereignisprozedur für ein Steuerelement setzt sich aus dem eigentlichen Namen des Steuerelements (in der Name-Eigenschaft angegeben), einem Unterstrich (_) und dem Ereignisnamen zusammen. Wenn Sie z.B. wollen, daß eine Befehlsschaltfläche mit dem Namen cmdPlay eine Ereignisprozedur aufruft, wenn darauf geklickt wird, müssen Sie die Prozedur cmdPlay_Click verwenden.

·     Der Name einer Ereignisprozedur für ein Formular setzt sich aus dem Wort "Form", einem Unterstrich und dem Ereignisnamen zusammen. Wenn Sie wollen, daß ein Formular eine Ereignisprozedur aufruft, wenn darauf geklickt wird, müssen Sie die Prozedur Form_Click verwenden. (Wie Steuerelemente haben auch Formulare einen eindeutigen Namen, der aber in den Namen von Ereignisprozeduren nicht verwendet wird.) 

Allen Ereignisprozeduren liegt die gleiche allgemeine Syntax zugrunde.

Syntax für ein Steuerelement-Ereignis

Syntax für ein Formular-Ereignis

Private Sub Steuerelementname_Ereignisname (Argumente)

   .... Anweisungsblock

End Sub

Private Sub Form_Ereignisname(Argumente)

   .... Anweisungsblock

End Sub

Sie können Ereignisprozeduren zwar auch ohne Vorlage schreiben, aber es ist ein­facher, die in Visual Basic zur Verfügung stehenden Code-Prozeduren zu verwenden, die bereits die richtigen Prozedurnamen beinhalten. Sie können im Code-Editor-Fenster eine Schablone auswählen, indem Sie ein Objekt aus dem Objektfeld auswählen und dann eine Prozedur aus dem Prozedurfeld.

Es ist ebenfalls hilfreich, die Name-Eigenschaft ihrer Steuerelemente zu definieren, ehe Sie mit dem Schreiben von Ereignisprozeduren für diese beginnen. Wenn Sie den Namen eines Steuerelements ändern, nachdem Sie ihm eine Prozedur zugeordnet haben, müssen Sie auch den Namen der Prozedur ändern, damit er dem neuen Namen des Steuerelements entspricht. Andernfalls kann Visual Basic keine Verbindung zwischen dem Steuerelement und der Prozedur herstellen. Wenn ein Prozedurname nicht mit einem Steuerelementnamen übereinstimmt, wird die entsprechende Prozedur zu einer allgemeinen Prozedur.

Function-Prozeduren

Visual Basic enthält vom System bereitgestellte Funktionen (sogenannte integrierte Funktionen), wie z.B. Sqr, Cos oder Chr. Zusätzlich können Sie mit Hilfe der Function-Anweisung eigene Function-Prozeduren schreiben.

Die Syntax einer Function-Prozedur lautet wie folgt:

[Private|Public][Static]Function Prozedurname (Argumente) [As Typ]

     ...     Anweisungen

End Function

Wie eine Sub-Prozedur ist eine Function-Prozedur eine separate Prozedur, die Argumente erhalten, Anweisungen ausführen und den Wert ihrer Argumente ändern kann. Im Gegensatz zu einer Sub-Prozedur kann eine Function-Prozedur einen Wert an die aufrufende Prozedur zurückgeben. Es gibt drei Unterschiede zwischen Sub- und Function-Prozeduren:

·     Sie können eine Function-Prozedur aufrufen, indem Sie den Namen der Function-Prozedur und ihre Argumente auf der rechten Seite einer Anweisung oder eines Ausdrucks angeben: Rückgabewert = Funktion().

·     Function-Prozeduren haben (wie Variablen) bestimmte Datentypen, die den Typ des Rückgabewerts bestimmen. (Wird kein As-Abschnitt verwendet, so ist der Typ automatisch der Standardtyp Variant.) 

·     Ein Wert wird zurückgegeben, indem er dem Prozedurnamen selbst zugewiesen wird. Wenn die Function-Prozedur einen Wert zurückgibt, kann dieser dann Teil eines größeren Ausdrucks werden.

Sie können z.B. eine Function-Prozedur schreiben, die die Hypotenuse eines rechtwinkligen Dreiecks aus den anderen Seiten berechnet:

Function Hypotenuse (A As Integer, B As Integer) As String

   Hypotenuse = Sqr(A ^ 2 + B ^ 2)

End Function

Function-Prozeduren werden wie die integrierten Visual Basic-Funktionen aufgerufen:

Label1.Caption = Hypotenuse(CInt(Text1.Text), CInt(Text2.Text))

strX = Hypotenuse(Width, Height)

Arbeiten mit Prozeduren

Erstellen neuer Prozeduren

So erstellen Sie eine neue allgemeine Prozedur

·     Klicken Sie im Menü Extras auf Prozedur hinzufügen.

- Oder -

Geben Sie im Code-Editor-Fenster einen Prozedurkopf ein, und drücken Sie die EINGABETASTE. Der Prozedurkopf kann sehr einfach aufgebaut sein und wie in dem folgenden Beispiel nur Sub oder Function und einen Namen enthalten:

Sub UpdateForm ()

Function GetCoord ()

Visual Basic vervollständigt dann die Schablone für die neue Prozedur.

Auswählen vorhandener Prozeduren

So zeigen Sie eine Prozedur im aktuellen Modul an

·     Wählen Sie zum Anzeigen einer vorhandenen allgemeinen Prozedur im Objektfeld des Code-Editor-Fensters die Option (Allgemein) aus und dann im Prozedurfeld die gewünschte Prozedur.

- Oder -

Wählen Sie zum Anzeigen einer Ereignisprozedur im Objektfeld des Code-Editor-Fensters das geeignete Objekt aus und dann im Prozedurfeld das Ereignis.

Aufrufen von Prozeduren

Es gibt mehrere Verfahren zum Aufrufen von Prozeduren, die vom Prozedurtyp, der Position der Prozedur und der Art der Verwendung in der Anwendung abhängen. In den folgenden Abschnitte wird das Aufrufen von Sub- und Function-Prozeduren erläutert.

Aufrufen von Sub-Prozeduren

Der Unterschied zwischen einer Sub-Prozedur und einer Function-Prozedur besteht darin, dass eine Sub-Prozedur nicht unter Verwendung ihres Namens in einem Aus­druck aufgerufen werden kann. Ein Aufruf einer Sub-Prozedur ist eine eigenständige Anweisung. Außerdem gibt eine Sub-Prozedur im Gegensatz zu einer Function-Prozedur in ihrem Namen keinen Wert zurück. Wie eine Function-Prozedur kann eine Sub-Prozedur aber die Werte aller ihr übergebenen Variablen verändern.

Es gibt zwei Möglichkeiten zum Aufrufen einer Sub-Prozedur:

Beide Anweisungen rufen eine Sub-Prozedur namens Proz1 auf.

Call Proz1 (Argument1, Argument2)

Proz1 Argument1, Argument2

Wenn Sie die Call-Syntax verwenden, müssen Sie Argumente in Klammern einschließen. Wenn Sie das Schlüsselwort Call nicht angeben, dürfen Sie die Argumente nicht in Klammern setzen.

Aufrufen von Function-Prozeduren

In der Regel können Sie eine selbst geschriebene Function-Prozedur genauso aufrufen wie eine in Visual Basic integrierte Funktion (z.B. Abs), und zwar, indem Sie den Namen der Funktion in einem Ausdruck verwenden:

Alle folgenden Anweisungen rufen eine Funktion namens InDez auf.

Print 10 * InDez

X = InDez

If InDez = 10 Then Debug.Print "Bereichsüberlauf"

X = AnotherFunction(10 * InDez)

Sie können eine Function-Prozedur auch wie eine Sub-Prozedur aufrufen. Beide folgenden Anweisungen rufen dieselbe Funktion auf:

Call Year(Now)

Year Now

Wenn Sie eine Funktion in dieser Form aufrufen, verwirft Visual Basic den Rückgabewert.

Anmerkung: Integrierte Funktionen (z.B. Numerische Funktionen, Textfunktionen etc.) siehe Anhang ab S.139

Aufrufen von Prozeduren in anderen Modulen

Öffentliche Prozeduren in anderen Modulen können von überallher im Projekt aufgerufen werden. Sie müssen unter Umständen das Modul angeben, das die aufgerufene Prozedur enthält. Die Vorgehensweise hierbei hängt davon ab, ob sich die Prozedur in einem Formular-, Klassen- oder Standardmodul befindet.

Prozeduren in Formularen

Alle Aufrufe von außerhalb des Formularmoduls müssen auf das Formularmodul mit der Prozedur verweisen. Befindet sich z.B. eine Prozedur namens EineSub in einem Formularmodul mit dem Namen Form1, so lautet die Anweisung für den Aufruf der Prozedur in Form1 wie folgt:

Call Form1.EineSub(Argumente)

Prozeduren in Standardmodulen

Wenn der Prozedurname eindeutig ist, brauchen Sie den Modulnamen nicht im Aufruf anzugeben. Ein Aufruf von innerhalb oder außerhalb des Moduls verweist dann auf diese eindeutige Prozedur. Eine Prozedur ist eindeutig, wenn sie nur an einer Stelle vorkommt. 

Wenn zwei oder mehr Module eine Prozedur mit dem gleichen Namen enthalten, müssen Sie unter Umständen den Namen des Moduls angeben, in dem die gewünschte Prozedur enthalten ist. Wird eine mehrfach vorkommende Prozedur innerhalb eines Moduls aufgerufen, in dem sie enthalten ist, wird die Prozedur in diesem Modul ausgeführt. Wenn eine Prozedur namens CommonName z.B. in Modul1 und Modul2 enthalten ist, wird durch den Aufruf von CommonName innerhalb von Modul2 auch die CommonName-Prozedur in Modul2 ausgeführt und nicht die gleichnamige Prozedur in Modul1.

Bei einem Aufruf einer allgemeinen Prozedur aus einem anderen Modul heraus muß das gewünschte Modul angegeben werden. Zum Aufrufen der CommonName-Prozedur in Modul2 aus Modul1 heraus müssen Sie z.B. folgende Anweisung verwenden:

Module2.CommonName(Argumente)

Übergeben von Argumenten an Prozeduren

Der Code in einer Prozedur benötigt in der Regel einige Informationen über den Zustand des Programms, damit er richtig ausgeführt werden kann. Diese Informationen werden der Prozedur beim Aufruf als Argumente übergeben.

Datentypen von Argumenten

Die Argumente der von Ihnen geschriebenen Prozeduren haben als Voreinstellung den Datentyp Variant. Sie können jedoch auch andere Datentypen für Argumente deklarieren. Der folgenden Funktion können z.B. eine Zeichenfolge und eine Ganzzahl (Datentypen String und Integer) übergeben werden:

Function Mittagsmenü(Wochentag As String, Stunde As Integer) As String

   ' Gibt anhand von Tag und Uhrzeit ein Mittagsmenü zurück.

   If Wochentag = "Freitag" then

      Mittagsmenü = "Fisch"

   Else

      Mittagsmenü = "Huhn"

   End If

   If Stunde > 4 Then Mittagsmenü = "Zu spät"

End Function

Übergeben von Argumenten als Referenz

Durch Übergabe von Argumenten als Referenz erhält die Prozedur Zugriff auf den aktuellen Inhalt der Variablen an ihrer Adresse im Hauptspeicher. Der Wert der Variablen kann also von der Prozedur, der sie übergeben wird, dauerhaft geändert werden. Die Übergabe von Argumenten als Referenz ist die Voreinstellung in Visual Basic.

Wenn Sie einen Datentyp für ein als Referenz übergebenes Argument angeben, müssen Sie für das Argument einen Wert dieses Datentyps übergeben. Sie können dies umgehen, indem Sie anstelle eines Datentyps einen Ausdruck für ein Argument übergeben. Visual Basic wertet einen Ausdruck aus und übergibt ihn nach Möglichkeit mit dem erforderlichen Datentyp.

Sie können eine Variable am einfachsten in einen Ausdruck umwandeln, indem Sie sie in Klammern einschließen. Um z.B. eine als Integer deklarierte Variable an eine Prozedur zu übergeben, die eine Zeichenfolge als Argument erwartet, müssten Sie folgenden Code schreiben:

Sub AufrufendeProzedur()

   Dim intX As Integer

   intX = 12 * 3

   AufgerufeneProzedur(intX)                   'Aufruf mit Übergabe von intX

End Sub

Sub AufgerufeneProzedur(Bar As String)

   MsgBox Bar         'Der Wert von Bar ist die Zeichenfolge "36".

End Sub

Übergeben von Argumenten als Wert

Wird eine Variable als Wert übergeben, so wird nur eine Kopie der Variablen übergeben. Wenn die Prozedur den Wert ändert, betrifft die Änderung nur die Kopie, aber nicht die Variable selbst. Mit dem Schlüsselwort ByVal können Sie festlegen, dass eine Variable als Wert übergeben wird.

Sub PostAccounts(ByVal intAcctNum as Integer)

   ...      Anweisungen ...

End Sub

Verwenden optionaler Argumente

Sie können angeben, dass die Argumente einer Prozedur optional sind, indem Sie das Schlüsselwort Optional in die Argumentliste aufnehmen. Wenn Sie ein optionales Argument angeben, müssen alle darauffolgenden Argumente in der Argumentliste ebenfalls optional sein und mit dem Schlüsselwort Optional deklariert werden. In den beiden folgenden Code-Stücken wird vorausgesetzt, daß ein Formular mit einer Befehlsschaltfläche und einem Listenfeld existiert.

Der folgende Code stellt z.B. alle Argumente optional zur Verfügung:

Dim strName As String

Dim varAddress As Variant

Sub ListText(Optional x As String, Optional y As Variant)  ' AufgerufeneProzedur

   List1.AddItem x

   List1.AddItem y

End Sub

Private Sub Command1_Click()

   strName = "Ihr Name"

   varAddress = 12345             ' Beide Argumente übergeben.

   Call ListText(strName, varAddress)    ' AufrufendeProzedur

End Sub

Der folgende Code stellt dagegen nicht nur optionale Argumente zur Verfügung:

Dim strName As String

Dim varAddress As Variant

Sub ListText(x As String, Optional y As Variant)

   List1.AddItem x

   If Not IsMissing(y) Then

      List1.AddItem y

   End If

End Sub

Private Sub Command1_Click()

   strName = "Ihr Name"                  ' Zweites Argument nicht übergeben

   Call ListText(strName)

End Sub

Wenn ein optionales Argument fehlt, wird dem fehlenden Argument der Datentyp Variant mit dem Wert Empty zugewiesen. Das obige Beispiel verdeutlicht, wie man mit Hilfe der IsMissing-Funktion testen kann, ob optionale Argumente fehlen.

Definieren eines Standardwerts für ein optionales Argument

Es ist auch möglich, einen Standardwert für ein optionales Argument zu definieren. Im folgenden Beispiel wird ein Standardwert zurückgegeben, wenn das optionale Argument nicht an die Function-Prozedur übergeben wird:

Sub ListText(x As String, Optional y As Variant = 12345)

   List1.AddItem x

   List1.AddItem y

End Sub

Private Sub Command1_Click()

   strName = "Ihr Name"                  ' Zweites Argument nicht übergeben.

  Call ListText(strName)                ' "Ihr Name" und "12345" hinzufügen.

End Sub