![]() |
Prozedur umleiten?
hi,
ich schreib grad eine dll, und versuche eine verbindung auzubauen und möchte OnConnect reagieren...aber wieso geht das hier nicht bzw was ist daran falsch:
Delphi-Quellcode:
?
library Project2;
uses Classes, ScktComp, md5; {$R *.res} procedure sockConnect(Socket: TSocketNotifyEvent); begin Socket. // <<< hier nach dem "." erscheint nichtmal ein popup... end; var sock: TClientSocket; begin sock := TClientSocket.Create(nil); sock.Address := '213.39.196.118'; sock.Port := 1234; sock.OnConnect := sockConnect; sock.Open; end. |
Re: Prozedur umleiten?
Ich weiss gar nicht wie strikt das gehandabt wird, aber fehlt da nicht noch interface und implementation? Ach ne. Im Programm/library ist es ja auch kein Problem. :coder2:
Tja manchmal funktioniert das Popup-Fenster einfach nicht richtig. Problem ist hier aber vermutlich, dass OnConnect als Methodenzeiger (procedure of object) definiert ist. Das bedeutet das die Prozedur auch in einem Objekt eingebettet werden muss. Such mal hier im Forum nach ![]() P.S: Einfach mal kompilieren. Und dann mal schauen, was für Fehler kommen. Vielleicht musst du einfach eine weitere Unit miteinbinden. |
Re: Prozedur umleiten?
Hi,
Ich denke dein "OnConnect" erwartet eine Prozedur vom Typ TNotifyEvent. Das was du das zuweist, ist jedoch nur eine [dp]reguläre Prozedur[/dp]. In Wahrheit wird ein ![]()
Delphi-Quellcode:
Ich hoffe das hilft Dir.
THandler = class(TObject)
public procedure sockConnect(Sender: TObject; Socket: TCustomWinSocket); end; // ... procedure THandler.sockConnect(Sender: TObject; Socket: TCustomWinSocket); begin //code end; // ... var Handler: THandler; begin Handler := THandler.Create; sock := TClientSocket.Create(nil); sock.Address := '213.39.196.118'; sock.Port := 1234; sock.OnConnect := Handler.sockConnect; sock.Open; // ... // Handler irgendwann dann freigeben end. mfG mirage228 Edit: Die Deklaration Deiner OnConnect Methode war nicht ganz korrekt. |
Re: Prozedur umleiten?
heisst das ich muss extra ein object erzeugen um eine methode umzuleiten?
@mirage, ich teste das mal, danke ;) BTW: wieso kommt denn kein "of object" mit dran? |
Re: Prozedur umleiten?
Zitat:
es geht auch anders:
Delphi-Quellcode:
Edit: Die Deklaration von "OnConnect" sieht so aus, die Prozedur von dir war falsch :-\
procedure sockConnect(Self, Sender: TObject; Socket: TCustomWinSocket);
begin //code end; var FOnConnect: TSocketNotifyEvent; begin sock := TClientSocket.Create(nil); sock.Address := '213.39.196.118'; sock.Port := 1234; TMethod(FOnConnect).Code := @sockConnect; TMethod(FOnConnect).Data := nil; // die Variable Self ist dann in sockConnect = nil sock.OnConnect := FOnConnect; sock.Open; end. procedure (Sender: TObject; Socket: TCustomWinSocket) of object mfG mirage228 |
Re: Prozedur umleiten?
Zitat:
Delphi-Quellcode:
Jetzt hast du einen Methodenzeiger. Wenn du jetzt eine Variable vom Typ TNotifyEvent anlegst, kannst du nur Methoden (Prozeduren/Funktionen die innerhalb von Objekten liegen) zu weisen.
type
TNotifyEvent = procedure(Sender: TObject) of object; definierst du dagegen
Delphi-Quellcode:
Also ohne of object, dann kannst du der einer Variable vom Typ TNotifyEvent nur eine normale Prozedur/Funktion zuweisen. Ein Zuweisung von einer Methode (siehe oben) funktioniert hier nicht. Problem ist ja, dass bei Methoden immer der Zeiger auf Self (also das Objekt) mitgeführt werden müssen. Klarer wird dies wenn du mal sizeof(TNotifyEvent) in beiden Fällen machst. Da wirst du sehen, dass im ersten Fall der Typ 8 Byte groß ist (Zeiger auf Prozedur und auf das Objekt) und im zweiten Fall nur 4 Byte (nur Zeiger auf Prozedur).
type
TNotifyEvent = procedure(Sender: TObject); P.S: TNotifyEvent ist vielleicht etwas unglücklich, da es diesen Typen ja bereits gibt, aber hoffe, das macht das Problem etwas klarer. :warn: |
Re: Prozedur umleiten?
moin,
jo@jim, danke 8) @mirage:
Delphi-Quellcode:
library Project2;
uses ScktComp, md5, Unit1 in 'Unit1.pas'; {$R *.res} procedure sockConnect(Socket: TSocketNotifyEvent); begin Socket.SendText('hi'); <<< funktioniert nicht end; var sock: TClientSocket; OnConnect: TSocketNotifyEvent; begin sock := TClientSocket.Create(nil); sock.Address := '213.39.196.118'; sock.Port := 1234; TMethod(OnConnect).Code := @sockConnect; TMethod(OnConnect).Data := nil; sock.OnConnect := OnConnect; sock.Open; end. weisst du warum das nicht funzt? |
Re: Prozedur umleiten?
Hi,
das funktioniert nicht, weil deine SockConnect Prozedur falsch ist. Ich habe die richtige in meinem obigen Post bereits eingefügt. mfG mirage228 |
Re: Prozedur umleiten?
eleganter geht es so:
Delphi-Quellcode:
Gruß Hagen
type
THandler = class(TObject) class procedure OnConnect(Sender: TObject; Socket: TCustomWinSocket); end; class procedure THandler.OnConnect(Sender: TObject; Socket: TCustomWinSocket); begin // Code end; begin Sock := TClientSocket.Create(nil); try Sock.Address := '213.39.196.118'; Sock.Port := 1234; Sock.OnConnect := THandler.OnConnect; Sock.Open; .... finally Sock.free; end; end; |
Re: Prozedur umleiten?
Hi Hagen,
super Vorschlag :thumb: , da habe ich gar nicht dran gedacht :wall: mfG mirage228 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz