Einzelnen Beitrag anzeigen

Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#6

Re: Neues On... Ereignis zuweisen

  Alt 22. Dez 2009, 22:14
@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
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat