Also gut, für alle Fälle eine kleine Einweisung in Parameter (eigentlich: Argumente). Nehmen wir einmal folgende Funktionsdeklaration:
function MyFunc(const InputString: string; var InputInt: integer; out OutputDouble: double): Boolean;
Diese Funktion erwartet 3 Argumente:
- einen String
- eine Integer
- eine Double
und gibt als Ergebnis Boolean zurück (also entweder true oder false). Alle 3 werden unterschiedlich gehandhabt. Das
const vor InputString bedeutet, dass das Argument innerhalb der Funktion nicht geändert wird/werden soll. Das
var vor InputInt bedeutet, dass das übergebene Argument innerhalb der Funktion ausgewertet und evtl. geändert werden kann. Das
out vor OutputDouble bedeutet, dass das Argument innerhalb der Funktion nicht berücksichtigt, sondern als reines Ausgabeargument behandelt werden soll. Von allen 3 Argumenten wird innerhalb der Funktion keine lokale Kopie angelegt, da diese als Referenzen übergeben werden (call by reference). Anders verhält sich dies, wenn ein Argument ohne const, var oder out entgegegenommen wird. In diesem Fall wird mit einer lokalen Kopie des Wertes gearbeitet, das Original bleibt davon unberührt (call by value). Auch hierfür ein Beispiel:
Delphi-Quellcode:
procedure Proc1(InputInt: integer);
begin
InputInt := 42;
end;
procedure Proc2(var InputInt: integer);
begin
InputInt := 42;
end;
procedure TFormMain.TestProcs;
var MyInt: integer;
begin
MyInt := 100;
Proc1(MyInt); //call by value
ShowMessage(IntToStr(MyInt)); //Ausgabe: 100
Proc2(MyInt); //call by reference
ShowMessage(IntToStr(MyInt)); //Ausgabe: 42
end;
Übrigens muss man wegen der evtl. Veränderlichkeit des Wertes bei var- und out-Parametern immer eine Variable deklarieren und diese übergeben. So würde sich dieser Aufruf nicht kompilieren lassen:
Delphi-Quellcode:
procedure TFormMain.TestProcs;
begin
Proc2(42);
end;
Wieso dies? 42 ist eine Konstante, Proc2 erwartet aber eine Variable, da der Wert veränderlich sein soll, was eine Konstante ja nun einmal nicht ist.
Zum Schluss noch ein paar Worte zu überladenen Routinen und Default-Argumenten. Seit Delphi 4 kann man Routinen überladen, d.h. eine Routine mit dem selben Namen kann unterschiedlichste Argumente entgegennehmen. Das Einzige, was dabei zu beachten ist, ist, dass der Compiler klar unterscheiden können muss, welche Version denn nun gemeint ist. Auch dazu ein Beispiel:
Delphi-Quellcode:
function EineFunc(
const s:
string): Boolean;
overload;
function EineFunc(
const d: Double): Boolean;
overload;
function EineFunc(
const d: Double;
var i: integer;
const Bla: string='
Wuppdi'): Boolean;
overload;
Das Schlüsselwort "overload" kennzeichnet so eine überladene Routine und sagt Delphi, dass man das mit Absicht so macht und nicht etwa, weil man nicht aufgepasst hat
. Wir können dieser Funktion entweder einen String, eine Double oder eine Double und eine Integer (plus ggf. einen String) übergeben. Durch die Eindeutigkeit ist sichergestellt, dass immer die richtige Version aufgerufen wird. In der 3. Version gibt es die Besonderheit mit dem vorbelegten String "Bla". Dieses Argument kann, muss aber nicht übergeben werden. Wird es nicht übergeben, nimmt die Funktion automatisch die Vorgabe (in diesem Fall "
Wuppdi").
So, ich hoffe, das war ausführlich genug und ich habe keinen größeren Quatsch erzählt. Bei Fragen einfach noch einmal nachhaken.