Hallo Sven,
//Er bringt mir die Fehlermeldung
// "Inkompatible Typen: Methodenzeiger und reguläre Prozedur.
ja, weil Deine „MyErrorHandler“-Prozedur vom Typ
PROCEDURE (Sender:TObject;Socket:TCustomWinSocket;ErrorEvent:TErrorEvent;var
ErrorCode:Integer)
ist, die Variable „OnError“ der Klasse „MySock“ jedoch vom Typ
PROCEDURE (Sender:TObject;Socket:TCustomWinSocket;ErrorEvent:TErrorEvent;var
ErrorCode:Integer)
OF OBJECT
Das „OF OBJECT“ macht den entscheidenden Unterschied. Methodenzeiger sind mit Zeigern auf normale Funktionen grundsätzlich nicht kompatibel, da Methoden zusätzlich einen „Self“-Zeiger auf das Objekt als unsichtbaren Parameter benötigen, und da Methodenzeiger neben der Methode noch das Objekt speichern, von dem sie stammen, und das später zum „Self“-Parameter wird.
//Wie mache ich also aus meiner Prozedur einen Methodenzeiger
Indem Du eine Klasse implementierst, die bloß den Zweck hat, einen entsprechenden Methodenzeiger bereitzustellen, aus dem heraus Du dann problemlos die „MyErrorHandler“-Prozedur aufrufen kannst. Eine andere Möglichkeit gibt es nicht (Typecasting geht aus dem oben genannten Grund nicht mal theoretisch).
Hier ein Beispielcode:
TYPE
TErrorKnecht
= CLASS
PROCEDURE SocketError (Sender:TObject;Socket:TCustomWinSocket;ErrorEvent:TErrorEvent;var ErrorCode:Integer);
END;
VAR
MySock : TClientSocket;
ErrorKnecht: TErrorKnecht;
procedure MyErrorHandler (Sender:TObject;Socket:TCustomWinSocket;ErrorEvent:TErrorEvent;var ErrorCode:Integer);
begin
//bla
//bla
end;
PROCEDURE TErrorKnecht.SocketError (Sender:TObject;Socket:TCustomWinSocket;ErrorEvent:TErrorEvent;var ErrorCode:Integer);
begin
// Hier "Übergang" vom Methodenzeiger zur gewöhnlichen Prozedur
MyErrorHandler(Sender, Socket, ErrorEvent, ErrorCOde)
end;
procedure Init();
begin
MySock:=TClientSocket.Create(nil); //nil, weil ich kein Form habe
MySock.OnError:=ErrorKnecht.SocketError;
end;
begin
ErrorKnecht := TErrorKnecht.Create
end.
Mit freundlichem Gruß
Martin