@Button.OnClick:=@MeineProcedur;
Das sollte so zwar Compilieren - funktionieren sollte es jedoch nicht einwandfrei.
Ein Methodenzeiger (also das, worauf OnClick normalerweise zeigt) ist normalerweise so aufgebaut:
Delphi-Quellcode:
type
TMethod = record
Code: Pointer;
Data: Pointer;
end;
PMethod = ^TMethod;
"Code" spezifiziert hierbei die Codestelle der Prozedur, "Data" die Instanz der Klasse. Jede Methode einer Klasse kann man sich im Prinzip wie eine normale Prozedur mit einem zusätzlichen Parameter "self" vorstellen:
Dieser Code...
Delphi-Quellcode:
type
TMyClass = class
value: integer;
procedure Test;
end;
[...]
procedure TMyClass.Test;
begin
Writeln(value);
end;
...ist vom Prinzip her das selbe wie...
Delphi-Quellcode:
type
TMyClass = record
value: integer;
end;
PMyClass = ^TMyClass;
procedure TMyClass_Test(self: Pointer);
begin
Writeln(PMyClass(self)^.value);
end;
Wenn du nun den Methodenzeiger wie von dir gezeigt einfach so überschreibst, können da die tollsten Sachen passieren, da "Data" in ein Register geschrieben wird, welches eigentlich für einen Parameter gedacht ist (Angabe ohne Gewähr, ich kann mir das nur so vorstellen, überprüft habe ich es nicht). Außerdem wird für "Data" irgendein Wert angenommen, da ein normaler Funktionszeiger ja nur 4 Byte und nicht 8 Byte wie ein Methodenzeiger breit ist.
Ich hoffe das dies die Sache etwas klarer macht,
Andreas