TClientSocket EventHandler ändern

Hallo,

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;

Vielen Dank für die Hilfe

Sven

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

Hallo Martin,

vielen Dank für die schnelle und kompetente Hilfe.

MfG

Sven