// Wenn man dynamisch erzeugten Komponenten ein Ereignis
(Event) zuweisen möchte
// und benutzt dazu eine einfache Prozedur
(Funktion), erhält man die Fehlermeldung
// "
Inkompatible Typen: Methodenzeiger und reguläre Prozedur". Man benötigt also
// einen Methodenzeiger. Das ist so etwas wie ein doppelter Zeiger, besser gesagt
// ein Record mit zwei Pointern.


// Getestet mit D4 unter XP

// Variante 1:
// Am einfachsten erlangt man das, in dem man in ein bestehendes Objekt (class)
// eine Prozedur
(Funktion) einlagert.

 ... 
  private 
    { Private-Deklarationen } 
  public 
    procedure MyClick(Sender: TObject); 
  end; 
 
var 
  Form1: TForm1; 
 
implementation 
 
{$R *.dfm} 
 
var 
  L: TLabel; 
 
procedure TForm1.MyClick(Sender: TObject); 
begin 
  Caption := 'He, mein Freund, klickst du überall drauf ??'; 
end; 
 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
  L := TLabel.create(self); 
  L.parent := self; 
  L.caption := 'Klick hier drauf'; 
  L.left := 20; 
  L.top := 100; 
  L.OnClick := MyClick; 
end; 
 
procedure TForm1.FormDestroy(Sender: TObject); 
begin 
  L.free; 
end;



//---------------------------------------------------------

// Variante 2:
// Bei einfachen Events kann man Delphi austricksen und einen Methodenzeiger
// vorgaukeln. Allerdings kann man keine Parameter übergeben, da diese wegen
// des fehlenden zweiten Zeigers völlig falsch zugewiesen werden würden.

var 
  F: TNotifyEvent; 
  L: TLabel; 
 
procedure MyClick; 
begin 
  Form1.Caption := 'Hörst du vielleicht mal mit der Klickerei auf ?!'; 
end; 
 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
  L := TLabel.create(self); 
  L.parent := self; 
  L.caption := 'Klick mich'; 
  L.left := 20; 
  L.top := 100; 
  @F := @MyClick; 
  L.OnClick := F; 
end; 
 
procedure TForm1.FormDestroy(Sender: TObject); 
begin 
  L.free; 
end; 

//---------------------------------------------------------

// Variante 3:
// Besser ist es, den Methodenzeiger mittels "TMethod" und "procedure of object"
// nachzubilden, dann können auch alle entsprechenden Parameter übergeben werden.

var 
  F: procedure(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer) of object; 
  L: TLabel; 
 
procedure MyMouseUp(Form: TForm; Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
begin 
  if Sender is TLabel then 
    Form.Caption := TLabel(Sender).Caption; 
end; 
 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
  L := TLabel.create(self); 
  L.parent := self; 
  L.caption := 'Schaun mer mal was passiert, wennste draufklickst'; 
  L.left := 20; 
  L.top := 100; 
  TMethod(F).Code := @MyMouseUp; 
  TMethod(F).Data := self; 
  L.OnMouseUP := F; 
end; 
 
procedure TForm1.FormDestroy(Sender: TObject); 
begin 
  L.free; 
end;




 

Zugriffe seit 6.9.2001 auf Delphi-Ecke