Index:
1. Einleitung
2. Aufbau einer Funktion
3. Werte übergeben
4. ByVal, ByRef, Optional
5. Tipps und Tricks
6. Nachwort
1. Einleitung
Die meisten werden sich jetzt denken "Prozeduren? Darüber weiß ich eh schon alles!".
Aber ich bin sicher dass für jeden etwas dabei ist was er noch nicht wußte.
Also fange ich mal an.
Es gibt Sub- bzw. Function Prozeduren und ich gehe mal davon aus, dass die meisten von euch schon mit beiden gearbeitet haben.
Was ist nun der Unterschied zwischen den beiden?
Im Endeffekt eigentlich nur der, dass man bei einer Function einen Wert zurückgeben kann.
Beispiel:
Eine Function zum überprüfen ob eine Datei existiert.
Ihr ruft die Function auf und übergebt ihr den Pfad zur Datei.
Nun wird die Function testen ob die Datei vorhanden ist und dann gegebenfalls True oder False zurückgeben.
Somit erfährt ihr also ob die Datei wirklich existiert oder nicht.
2. Aufbau einer Funktion
Der Aufbau einer Function ist eigentlich nicht anders als der von einer Sub.
Beispiel:
Code:
Private Sub Test()
End Sub
Code:
Private Function Test()
End Function
Man kann also ganz einfach eine Function erstellen. Man muß nur die Namen ändern.
Aber so würde es nicht viel Sinn ergeben, da uns diese Function am Ende nichts zurückgeben würde.
Also müßen wir noch definieren von welchem Datentyp der Rückgabewert ist.
Also ob die Function einen string-, boolean-, integer- oder einen anderen Wert zurückgeben soll.
Code:
Private Function Test() as Boolean
End Function
Wie gesagt kann man hier auch string, integer oder andere Datentypen wählen.
Eine Rückgabe erhalten wir aber so immer noch nicht.
Dazu brauchen wir noch eine Zeile code.
Code:
Private Function Test() as Boolean
Test = True
End Function
Mit dieser Zeile gibt die Function "Test" den Wert "True" zurück.
Natürlich sollte die Function noch eine Aufgabe erledigen und dementsprechend dann einen Wert zurückgeben.
Aber vom Aufbau und Ablauf her sollte das verständlich sein.
3. Werte übergeben
Ihr möchtet eurer Function/Sub Daten übergeben die sie für eine Aufgabe braucht?
Ganz einfach.
Egal ob Sub oder Function. Ihr könnt in den Klammern ganz einfach Variablen deklarieren.
Code:
Private Function Test(nZahl as long, sBuffer as string) as Boolean
Test = True
End Function
Wenn ihr diese Function benutzen wollt, dann müßt ihr in der Klammer also zwei Werte übergeben.
Ein Aufruf würde z.B. so aussehen:
Code:
test (1, "test")
Da wir eine Rückgabe erhalten sollte man daraus aber natürlich eine If Abfrage machen.
Code:
if test(1, "test") = True then
4. ByVal, ByRef, Optional
Es gibt sicher einige, die noch nicht genau wissen was es mit ByVal, ByRef oder Optional aufsich hat.
Ich versuchs mal verständlich zu erklären.
Ihr habt sicher schonmal bei Functions die oben genannten Bezeichnung gesehen.
Beispiel:
Code:
Private Function Test(ByVal nZahl as long, ByRef sBuffer as string) as Boolean
Test = True
End Function
Durch ByVal und ByRef wird einfach bestimmt wie ein Wert an die Function übergeben wird.
Wenn man nicht ByVal oder ByRef vor die Variable schreibt (so wie bei Punkt 3), ist es automatisch ByRef.
ByRef:
ByRef bedeutet "By Reference".
Bei ByRef wird nur die Adresse im Speicher wo der Wert liegt an die Function/Sub übergeben.
Die Function greift dann also direkt auf den originalen Wert zu.
ByRef ist also sehr schnell da nicht extra der Wert kopiert werden muß.
Wenn man aber nicht aufpasst was man in der Function/Sub macht, kann es natürlich dazu kommen dass man den übergebenen Wert überschreibt und so Daten verliert was man eigentlich nicht wollte.
Man sollte also vorsichtig sein ob man etwas per ByRef übergibt. (Nicht vergessen. Default ist ByRef!)
ByVal:
ByVal bedeutet "By Value".
Bei ByVal wird der übergebene Wert (z.B. ein string) kopiert und an die Function/Sub übergeben.
Hat den großen Vorteil, dass man nicht zufällig den originalen Wert überschreibt.
Dafür hat ByVal natürlich den Nachteil der Geschwindigkeit und des Speicherverbrauchs.
Optional:
Optional hat nicht direkt was mit der Art der Übergabe des Wertes zu tun.
Man ist nur (wie der Name eigentlich schon sagt) nicht dazu gezwungen dieser Variable einen Wert zu übergeben.
Beispiel:
Code:
Private Function Test(ByVal nZahl as long, Optional ByRef sBuffer as string) as Boolean
Test = True
End Function
Ich könnte die Function z.B. jetzt so aufrufen:
Code:
If Test(1) = True Then
Ich muß also nicht zwingend den zweiten Wert übergeben.
Optional sollte natürlich nur benutzt werden, wenn eure Function diesen Wert nicht umbedingt benötigt.
Außerdem hat optional noch eine Eigenheit.
Alle folgenden Variablen die man in der Klammer deklariert muß man dann auch optional setzen.
Man sollte also Optionale Werte ganz rechts in die Klammer setzen.
Noch etwas nettes ist, dass man bei Optional der Variable eine Art Default Wert zuweisen kann.
Code:
Private Function Test(Optional ByVal sBuffer as string = "Default") as Boolean
Test = True
End Function
5. Tipps und Tricks
1. Man sollte Functions wirklich nur dann einsetzen wenn man einen Rückgabewert benötigt.
Denn für jede Function wird Speicher reserviert für den gesetzten Datentyp, was natürlich Speicherverschwendung ist und auch Zeit kostet.
2. Wenn möglich, dann am besten einen Boolean Wert als Rückgabe definieren. Diese benötigen wenig Speicher und sind sehr schnell.
3. Auf die Fehlerbehandlung nicht vergessen.
Ansonsten wird in der Prodezur wo ihr die Function/Sub aufgerufen habt auf den Fehler reagiert. Außer ihr habt in dieser auch keine Fehlerbehandlung ^^, dann wird euer Programm abstürzen.
4. Und noch ein netter Tipp von mir.
Subs als Functions missbrauchen ^^
Wie ihr oben lesen konntet, kann man per ByRef die Adresse zum eigentlichen Wert an die Prozedur übergeben.
Gut. Das kann man ausnutzen.
Ihr könnt also einfach eine Sub erstellen an die man verschiedene Werte ByRef übergeben kann und in der Sub könnt ihr diese bearbeiten.
Das hat mehrere große Vorteile.
1.Eine Sub ist schneller als eine Function, da kein Speicher reserviert wird für den Rückgabewert.
2.ByRef übergebene Werte benötigen auch nicht extra Speicher und sind dadurch auch schneller.
3.Man kann mehrere Werte verändern/zurückgeben und nicht nur einen wie bei einer Function.
4.Und man hat noch einen tollen Vorteil. Man kann sogar Arrays übergeben
Aber wie gesagt. ByRef ist mit Vorsicht zu geniessen. Außerdem ist es kein wirklich schöner Programmierstil.
6. Nachwort
Ich weiß. Ist nicht das schwierigste Thema gewesen, aber ich denke das für jeden was dabei war.
mfg, ZiG
Ps.: Falls Fehler entdeckt werden, dienen diese zur allgemeinen Belustigung und als C&P Protection. _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
r4z3r_ « Webmaster »
Anmeldedatum: 06.02.2007 Beiträge: 252
Verfasst am: 12.03.2008, 17:38
Ich finde dein Texttut - wie immer eigentlich - sehr gut gelungen. Ich wusste bisher auch nicht wirklich was es mit ByVal und ByRef wirklich auf sich hat^^
Also n1, hoffe das war nicht dein letztes Tut
mfg _________________
chiller1415_ Poster
Anmeldedatum: 16.12.2007 Beiträge: 125
Verfasst am: 12.03.2008, 17:55
Cooles Tut danke:D _________________
c0re_ « Moderator »
Anmeldedatum: 29.11.2007 Beiträge: 425
Verfasst am: 13.03.2008, 14:43
Schön erklärt. Gibt es auch eine Möglichkeit einer Funktion ein Array zu übergeben? _________________
ZiG_ Überflieger
Anmeldedatum: 07.03.2007 Beiträge: 1248
Verfasst am: 13.03.2008, 14:52
Ja genauso wie andere Variablen.
Code:
Private Function Test(sBuffer() As Byte) As string
Nur zurückliefern kann eine Function kein Array.
Deswegen der Tipp mit der Sub + ByRef. _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
c0re_ « Moderator »
Anmeldedatum: 29.11.2007 Beiträge: 425
Verfasst am: 13.03.2008, 14:58
Hat bei mir letztens nciht funktioniert. Wenn ich nur wüsste welches Projekt es war. ^^ _________________
ZiG_ Überflieger
Anmeldedatum: 07.03.2007 Beiträge: 1248
Verfasst am: 13.03.2008, 15:45
Dann wolltest du das Array wahrscheinlich ByVal übergeben.
Das geht nur mit Variant Variablen. Wie genau weiß ich aber nicht. _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)