Incompatible types method pointer and regular procedure
Im Zusammenhang mit dynamisch zugewiesenen Ereignisprozeduren kommt es bei Anfängern regelmäßig zu der Fehlermeldung "Incompatible types method pointer and regular procedure".
Der Fehler kommt dadurch zustande, dass einer Methode einer Klasse eine normale Prozedur zugewiesen wird, z.b.
Delphi-Quelltext
1:
| MyButton.OnClick := MyClickProcedure; |
Der Unterschied einer Klassenmethode und einer normalen Prozedur ist der, dass einer Methode ein 2., unsichtbarer Parameter (eine Referenz auf ein Objekt) überwiesen wird.
Um dies zu umschiffen gibt es 2 Möglichkeiten:
1. Zuweisung der Prozedur zu einer bestehenden Klasse oder einer Dummyklasse.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| type TMyDummyClass = class class procedure MyOnTimer(Sender: TObject); end;
class procedure TMyDummyClass.MyOnTimer(Sender: TObject); begin ShowMessage('Test'); end;
...
with TTimer.Create(nil) do OnTimer := TMyDummyClass.MyOnTimer; |
2. den 2 versteckten Parameter in die Prozedur mit einbauen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure MyOnTimer(Self: Pointer; Sender: TObject); begin ShowMessage('Test'); end;
var aMethod: TMethod;
aMethod.Code := @MyOnTimer; aMethod.Data := nil; with TTimer.Create(nil) do OnTimer := TNotifyEvent(aMethod); |
Wer sich mit dem Thema noch detaillierter befassen will, der sei hier auf das pointertutorial von
Motzi verwiesen, welches hierzu noch mehr Informationen liefert, und diesem Beitrag als Vorlage diente.
www.manuel-poeter.de...x.php?site=tutorials
Moderiert von Christian S.: Titel geändert
Moderiert von jasocul: Beitrag in Überprüfung
in der regel haben diese leute die regel...