Prozeduren und Funktionen sind grundlegende Bestandteile eines Programmes. Mit Hilfe
von
Prozeduren und Funktionen werden bestimmte Aufgaben in sich abgeschlossen
Unterprogrammen gekapselt. Mit der Hilfe von Prozeduren und Funktionen kann man sich
einen eigenen Befehlsvorrat für ständig wiederkehrende Aufgaben anlegen. Bei Prozeduren
dienen zum Ausführen weiterer Aufgaben, aber man erhält kein direktes Ergebnis zurück.Bei
Funktion wird zum Schluß ein Ergebnis zurückgegeben. An beide kann man Parameter
übergeben.
Aufbau von Prozeduren
Prozeduren werden mit "Sub Prozedurname" eingeleitet und mit "End Sub"
beendet.
Dazwischen kommt der Programmcode.
Hier ein Beispiel:
Sub TestProzedur
msgbox "Heute ist der " & Date
End Sub
Diese Prozedur zeigt in einer MessageBox das aktuelle Datum an. Das ist natürlich
nicht der
Idealfall für eine Prozedur, da hier eigentlich außer einer Programmzeile ( msgbox "Heute ist
der " & Date) drei Zeilen werden. Prozeduren sind dann sinnvoll wenn Aufgaben im Programm
mehrfach aufgerufen werden oder wenn man durch Prozeduren das Programm in übersichtliche
Teilaufgaben zerlegen kann. Das Hauptprogramm ruft dann nur nach einander die Prozeduren
auf oder wiederholt bei Bedarf wieder den Aufruf.
Sie wollen zum Beispiel eine Datei speichern und müssen dazu erst den Dateinamen und
dann
der Speicherort abfragen. Das ist ja eindeutig eine Aufgabe die öfter vorkommen soll. Also
erstes wird nach dem Dateinamen gefragt, danach nach dem Speicherort und zum Schluß wird
die Datei gespeichert.
Hier der Code als Aufgabenbeschreibung:
Sub Speichern
Abfrage des Dateiname
Abfrage des Speicherortes
Zusammensetzen des Dateinamens und Speicherortes
Speichern der Datei
Bestätigung des Speicherns
End Sub
Als StarBasiccode
Sub Speichern
Dateiname = InputBox ("Geben Sie bitte den Dateinamen ein:")
Speicherort = InputBox ("Geben Sie bitte ein Verzeichnis ein:")
mydoc = ThisComponent
myUrl= Speicherort + Dateiname
mydoc.storeasurl(myurl,args())
msgbox "Ihre Datei wurde gespeichert"
End Sub
So jetzt haben wir eine Prozedur von sechs Zeilen die man jederzeit mit einer Zeile
(
"Speichern") im Programm aufrufen kann. Bitte jetzt nicht nach den Details zu Speichern
fragen, dazu komme ich weiter hinten im Buch. Und selbstverständlich gibt es für Speichern ja
den Menüpunkt "Speichern", der eigentlich auch eine Prozedur ist, aber ich wollte ein Beispiel
das man sofort nachvollziehen kann.
Diese Prozedur wollen wir jetzt noch ein wenig ergänzen. Zum Beispiel liegt der Speicherort
schon fest. Das heißt diesen müssen sie nicht abfragen. Jetzt haben sie zwei Möglichkeiten.
Sie können den Speicherort in der Prozedur festlegen. Statt der Abfrage " Speicherort =
InputBox ("Geben Sie bitte den Dateinamen ein:")" kommt dann zum Beispiel "Speicherort
=
"C:\". Dann müssen sie aber für jeden neuen Speicherort eine neue Prozedur schreiben (
SpeichernC, SpeichernD etc). Die zweite Möglichkeit ist, das sie den Speicherort der Prozedur
als Paramter übergeben. Sie können an Prozeduren Parameter nach folgendem Syntax
übergeben: Sub Prozedurname (Paramater1 as Typ, Parameter2 as Typ,....). In unserem
Beispiel übergeben wir den Speicherort als String:
Sub Speichern ( Speicherort as String)
Dateiname = InputBox ("Geben Sie bitte den Dateinamen ein:")
mydoc = ThisComponent
myUrl= Speicherort + Dateiname
mydoc.storeasurl(myurl,args())
msgbox "Ihre Datei wurde gespeichert"
End Sub
Jetzt können Sie diese Prozedure beliebig oft mit verschiedenen Speicherorten aufrufen.
Z.B.
speichern ( "C:\"), speichern("C:\MeineDaten"), etc.
Beim Aufrufen von Prozeduren mit Paramtern müssen Sie nur darauf achten das sie die
gleiche
Anzahl an Parametern und die gleichen Typen übergeben, wie Sie in der Deklaration angeben
haben. In unserem Beispiel kann ich zum Beispiel als Speicherort keine Zahl übergeben (
Speichern( 12) ), da eine Zahl kein String ist.
Was sind nun Funktionen? Eigentlich auch Prozeduren, nur das diese ein Ergebnis zurück
liefern. Eine Procedure führt etwas aus. Eine Funktion führt etwas aus und erzeugt ein
Ergebnis. Um dieses Ergebnis richtig zuordnen zu können muss die Art des Ergebnisses
vorher festgelegt werden. Daher hat eine Funtion folgenden Aufbau:
Function Name ( Parameter1, Paramater2,...) as Typ
Name=Ergebnis
End Function
Sie sieht also der Prozedur sehr ähnlich, nur das statt sub function steht und das
der Typ noch
festgelegt wird. Und das innerhalb der Funktion das Ergebnis übergeben werden muß.
Machen wir hierzu auch ein Beispiel.
Nehmen wir an wir brauchen für unsere Programm eine bestimmte Berechnung mehrmals.
Zum
Beispiel die Mehrwertsteuer eines Bruttobetrages abhängig vom Mehrwertsteuersatz.
( Bruttobetrag 116,- Eur Nettobetrag 100,- Eur, Mehrwersteuer 16,- Eur, 16% Mwst).
Ein Weg zum Ergebnis:
Bruttobetrag - Nettobetrag = Mehrwertsteuer
Nettobetrag = Bruttobetrag / (1+ 1/100 Zinsatz)
Bei der Funhtion müssen wir als Parameter den Bruttobetrag und den Zinsatz übergeben,
als
Ergebnis erhalten wie eine Zahl mit Kommastellen.
Function Mehrwertsteuer ( Brutto as Double, Zinssatz as double) as double
Dim Zinsfaktor as double
Zinsfaktor = 1 + Zinssatz / 100
Netto = Brutto / Zinsfaktor
Mehrwertsteuer = Brutto - Netto
End Function
Diese Funktion wird dann im Programnm mit "variable = mehrwertsteuer (Bruttobetrag,
Zinssatz)" aufgerufen. Zum Beispiel:
steuer = mehrwertsteuer( 1234, 16)
Dann bekommt steuer den Wert 170,206.....
Jetzt können Sie jeder Zeit mit einer Programmzeile die Mehrwertsteuer eines Betrages
ausrechnen lassen.
Funktion können zum Beispiel für mathematische Aufgaben, Textverarbeitungen und für
Wahrheitsprüfungen verwendet werden. Bei eine Wahrheits- Boolschen Funktion wird der
Zustand Wahr oder Falsch ( true oder false) zurückgeben.
Jetzt kommen noch zusätzliche Eigenschaften beim Aufruf von Prozeduren und Funktionen
hinzu. Diese betreffen die Parameter.
a. Optional
Parameter mit der Beigabe "Optional" müssen beim Aufruf nicht übergeben
werden. Diese
werden, wenn sie nicht gefüllt sind automatisch mit einem Leerwert versehen. Ob der
Parameter gefüllt worden ist kann man mit der Funtkion "ismissing" testen. Dieses verhalten
gilt sowohl für Prozeduren, wie auch Funktionen.
if IsMissing(mytext2) then
myText2 = "Keine Text"
end if
Ist der Parameter jetzt nicht gefüllt wird der Text "Kein Text" eingetragen.
Umgekehrt kann man
mit "not IsMissing()" auch die positive Fragen stellen.
b. ByVal
Paramater die mit dem Vorsatz "ByVal" übergeben werden, können keinen neuen
Wert
annehmen. Was bedeutet das?
Normalerweise werden die Parameter an Funktionen als Referenz übergeben. Man könnte
es
als ausleihen beschreiben. Blöderweise kann aber die Prozedur oder Funktion den geliehenen
Parameter auch ändern. Auf diese Weise kann man zum Beispiel auch eine Prozedur als
Funktion verwenden.
Diese Prozedur
Sub NeuerWert( Zahl as Integer)
Zahl = Zahl*100
End Sub
führt genauso zu einem neuen Wert von "Zahl" wie diese Funktion
Function funcNeuerWert(Zahl as Integer)
funcNeuerWert=Zahl*100
End Function
Wenn man diese beiden "Funktionen" ein Programm einbindet:
Sub TestNeuerWert
MyWert=10
NeuerWert(MyWert)
ErsteZahl=MyWertl
MyWert=fNeuerWert(myWert)
ZweiteZahl=MyZahl
MsgBox "Erste Zahl: " +ErsteZahl+" Zweite Zahl: "+ZweiteZahl
end sub
kommt die vielleicht gar nicht gewollte Vervielfachung des Ausgangswertes heraus.
Dies kann man durch zwei Wege verhindern. Der erste ist, wie es sich gehört für einen
guten
Programmierer, ordentlich programmieren und niemals Parameter einer Prozedur oder Funktion
mit neuen Werten belegen, wenn es nicht die Absicht der Prozedur
ist. Eine Funktion sollte
nie einen Parameter als versteckte Rückgabe ändern. Eine Funktion gibt ein Ergebnis zurück
und sollte ansonsten auch nichts ändern.
Der zweite Weg ist der Parameter ByVal. Mit diesem wird der Parameter als Wert übergeben
und nach dem durchlaufen der Prozedur oder Funktion, wird der alte Wert wieder gesetzt.
Wenn man also sicher sein will das sich der Parameter nicht ändern kann, setzt man ByVal
davor. Dies ist auch sinnvoll wenn man eine Funktion oder Prozedur schreibt die man in
mehreren Programmen verwenden will.
Verwendet man in unserem Beispiel in der Prozedur jetzt ByVal
Sub NeuerWert(ByVal Zahl as Integer)
Zahl = Zahl*100
End Sub
Kommen zum Schluß weniger große Zahl heraus.