Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Prozedur umleiten? (https://www.delphipraxis.net/32607-prozedur-umleiten.html)

Pseudemys Nelsoni 26. Okt 2004 07:36


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.
?

jim_raynor 26. Okt 2004 07:41

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 Hier im Forum suchenMethodenzeiger ich glaube da gab es auch was, wie man einer procedure of object eine normale Procedure zuweisen kann.

P.S: Einfach mal kompilieren. Und dann mal schauen, was für Fehler kommen. Vielleicht musst du einfach eine weitere Unit miteinbinden.

mirage228 26. Okt 2004 07:43

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 Hier im Forum suchenMethodenzeiger erwartet. Das erreichst Du am Besten, indem Du Deine Prozedur in eine eigene Klasse packst.

Delphi-Quellcode:
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.
Ich hoffe das hilft Dir.

mfG
mirage228

Edit: Die Deklaration Deiner OnConnect Methode war nicht ganz korrekt.

Pseudemys Nelsoni 26. Okt 2004 07:44

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?

mirage228 26. Okt 2004 07:46

Re: Prozedur umleiten?
 
Zitat:

Zitat von Pseudemys Nelsoni
heisst das ich muss extra ein object erzeugen um eine methode umzuleiten?

Hi,

es geht auch anders:

Delphi-Quellcode:
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.
Edit: Die Deklaration von "OnConnect" sieht so aus, die Prozedur von dir war falsch :-\
procedure (Sender: TObject; Socket: TCustomWinSocket) of object

mfG
mirage228

jim_raynor 26. Okt 2004 08:23

Re: Prozedur umleiten?
 
Zitat:

Zitat von Pseudemys Nelsoni
BTW: wieso kommt denn kein "of object" mit dran?

Das of object ist nur ein Zusatz bei der Definition von Prozedur/Methodenzeigern.

Delphi-Quellcode:
type
  TNotifyEvent = procedure(Sender: TObject) of object;
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.

definierst du dagegen

Delphi-Quellcode:
type
  TNotifyEvent = procedure(Sender: TObject);
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).

P.S: TNotifyEvent ist vielleicht etwas unglücklich, da es diesen Typen ja bereits gibt, aber hoffe, das macht das Problem etwas klarer. :warn:

Pseudemys Nelsoni 26. Okt 2004 09:05

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?

mirage228 26. Okt 2004 09:07

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

negaH 26. Okt 2004 10:12

Re: Prozedur umleiten?
 
eleganter geht es so:

Delphi-Quellcode:
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;
Gruß Hagen

mirage228 26. Okt 2004 11:18

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.
Seite 1 von 2  1 2      

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