Object Pascal
Methoden
Bei Methoden handelt es sich um Prozeduren und Funktionen, die zu einer Klasse gehören.
Deklaration, Implementierung und Aufruf
Methoden werden mit ihrem Kopf innerhalb der Klasse deklariert. An einer späteren Stelle im Code folgt die Implementierung der Methode. Diese erfolgt wie bei einer normalen Prozedur oder Funktion, außer dass vor den Methodennamen der Name der Klasse - getrennt durch einen Punkt - geschrieben wird.
Deklaration (im interface- oder implementation-Abschnitt einer Unit):
type
TAuto = class
private
FFarbe: string;
FBaujahr: integer;
procedure SetFarbe(Farbe: string);
public
property Farbe: string read FFarbe write SetFarbe;
end;
Implementierung (im implementation-Abschnitt einer Unit):
procedure TAuto.SetFarbe(Farbe: string);
begin
...
end;
Der Aufruf erfolgt dann am Name einer Instanz der Klasse:
var auto: TAuto;
...
auto.SetFarbe('rot');
Self
Von einer Klasse können mehrere Instanzen gleichzeitig existieren. Innerhalb einer Methode kann über den Bezeichner Self auf die aufrufende Instanz zugegriffen werden. Beim Aufruf von weiteren Methoden derselben Klasse oder beim Zugriff auf Felder, kann Self auch weggelassen werden. Self steht innerhalb einer Methode also für den Namen des Objekts.
procedure TAuto.SetFarbe(Farbe: string);
begin
FFarbe := 'rot';
self.FFarbe := 'rot'; //gleichbedeutend
In Klassenmethoden enthält Self die Klasse. Über Self.Create kann man deshalb eine Instanz der Klasse erzeugen.
Sender
Wird über den Objektinspektor einer Komponente ein Ereignis zugeordnet, wird automatisch das Gerüst einer Ereignisbehandlungsmethode erzeugt. Für das OnClick-Ereignis von Button1 auf Form1 zum Beispiel:
procedure TForm1.Button1Click(Sender: TObject);
begin
end;
Self steht hier für form1, da Button1Click eine Methode von TForm1 ist. Und TForm1 hat nur die eine Instanz form1. Will man dagegen wissen, welche Komponente das Ereignis ausgelöst hat - es könnten ja mehrere Buttons mit dieser Ereignisbehandlungsmethode verknüpft sein -, verwendet man den Parameter Sender:
if Sender = Button1 then ...
Klassenmethoden
Methoden werden normalerweise an einer Instanz (einem Objekt) aufgerufen. Bei Klassenmethoden ist das anders. Wie der Name bereits sagt, werden diese an einer Klasse aufgerufen. Definiert werden Klassenmethoden wie normale Methoden, jedoch mit dem Zusatz class:
type
TKlasse = class(TObject)
public
class function GetInfo: string;
end;
class function TKlasse.GetInfo: string;
begin
...
end;
Aus Klassenmethoden heraus kann nicht auf Felder der Klasse zugegriffen werden, sondern nur auf globale Variablen.
Beispiel: Eine Klassenmethode "simuliert" eine Klassenvariable und zählt, wie viele Objekte es von einer Klasse gibt:
unit UFlaeche;
interface
type
TFlaeche = class(TObject)
private
protected
function berechneFlaeche: double; virtual; abstract;
function berechneUmfang: double; virtual; abstract;
public
constructor Create;
destructor Free;
class function count: integer;
property Flaeche: double read berechneFlaeche;
property Umfang: double read berechneUmfang;
end;
implementation
var anzahl: integer;
constructor TFlaeche.Create;
begin
inc(anzahl);
end;
destructor TFlaeche.Free;
begin
dec(anzahl);
end;
class function TFlaeche.count: integer;
begin
result:=anzahl;
end;
end.
Im Konstruktor (Create) wird die Anzahl erhöht, im Destruktor (Free) wieder herabgesetzt. Über die Klassenmethode Count (und natürlich über die globale Variable) kann nun festgestellt werden, wie viele Instanzen es von TFlaeche gibt.
Botschaftsmethoden
Um auf Botschaften (eigene oder die vom Betriebssystem) zu reagieren, werden Botschaftsmethoden angelegt. Eine Botschaftsmethode hat immer einen einzigen var-Parameter. In Deklaration steht dahinter die Direktive message und die ID der Botschaft. Folgende Methode reagiert auf die Windows-Botschaft WM_CHAR:
type
TTextBox = class(TCustomControl)
private
procedure WMChar(var Message: TWMChar); message WM_CHAR;
...
end;
Weitere Informationen
Weitere Informationen über Methoden sind in den Abschnitten "Verbergen, überschreiben, überladen" sowie "Virtuelle, dynamische und abstrakte Methoden" zu finden.