Visual Basic Forum

Visual Basic Forum
für VB6 und VB.NET Programmierer
 
RegistrierenRegistrieren  LoginLogin

Neues Thema eröffnen   Neue Antwort erstellen    Visual Basic Forum Foren-Übersicht -> [VB6] Texte und Ebooks
Autor
Nachricht
ZiG_
Überflieger
Überflieger

Anmeldedatum: 07.03.2007
Beiträge: 1248

[Text] Prozeduren
Verfasst am: 09.03.2008, 21:24

Thema: Procedures (Prozeduren)
Autor: ZiG

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

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 Wink


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 »<b><font color=red>« Webmaster »</fo



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 Wink

mfg
_________________
 
chiller1415_
Poster
Poster

Anmeldedatum: 16.12.2007
Beiträge: 125


Verfasst am: 12.03.2008, 17:55

Cooles Tut danke:D
_________________
 
c0re_
« Moderator »<b><font color=green>« Moderator »</font



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
Ü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. Wink
Deswegen der Tipp mit der Sub + ByRef.
_________________
Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
 
c0re_
« Moderator »<b><font color=green>« Moderator »</font



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
Ü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)
 
Neues Thema eröffnen   Neue Antwort erstellen    Visual Basic Forum Foren-Übersicht -> [VB6] Texte und Ebooks

Tags: byref übergeben, werte byref, werte übergeben, byval, geschwindigkeit, unterschied

 
 Verwandte Themen   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Wie kann ich mich bei euch anmelden?? 387 20.05.2002, 01:28
Keine neuen Beiträge Eine kleine Frage an euch.. 373 30.09.2007, 09:57
Keine neuen Beiträge TopMost Funktion unter DirectX 432 27.07.2007, 11:48
Keine neuen Beiträge Wie Funktion nutzen ? 540 29.06.2007, 21:59
Keine neuen Beiträge update funktion einbauen 741 29.01.2007, 00:11
 



[ Time: 0.3987s ][ Queries: 105 (0.0451s) ][ GZIP on - Debug on ]