ich werd noch wahnsinnig, eigentlich will ich einfach die ClientSocket in einer DLL nutzen. Also mache ich folgendes :
Ich definiere eine ErrorEventProzedur
procedure MyErrorHandler (Sender:TObject;Socket:TCustomWinSocket;ErrorEvent:TErrorEvent;var ErrorCode:Integer);
begin
bla
bla
end;
procedure Init()
begin
MySock:=TClientSocket.Create(nil); //nil, weil ich kein Form habe
//Soweit alle OK.
//Nun will ich MySock meinen ErrorHandler zuweisen
MySock.OnError:=MyErrorHandler;
//Er bringt mir die Fehlermeldung
// "Inkompatible Typen: Methodenzeiger und reguläre Prozedur.
//Wie mache ich also aus meiner Prozedur einen Methodenzeiger ?
end;
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.