Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TClientSocket Eigenschaften in eigener Unit (https://www.delphipraxis.net/118645-tclientsocket-eigenschaften-eigener-unit.html)

Piro 12. Aug 2008 07:58


TClientSocket Eigenschaften in eigener Unit
 
Moin,

ich bräuchte mal eure Hilfe. Ich kenne mich nicht so doll damit aus.

Delphi-Quellcode:
unit uHostSocketAlive;

interface

function IsHostSocketAlive(Hostname: String; Port : Integer = 29979) : Boolean;

implementation

uses
  Windows,
  Forms,
  ScktComp;

var
 Client : TClientSocket;
 IsAlive : Boolean;
 Finish : Boolean;

procedure ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  IsAlive := TRUE;
  Finish := TRUE;
end;

procedure ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
 if ErrorCode > 0 then
 begin
   Client.Close;
   IsAlive := FALSE;
   ErrorCode := 0;
 end;
 Finish := TRUE;
end;

function IsHostSocketAlive(Hostname: String; Port : Integer = 29979) : Boolean;
begin
 IsAlive := FALSE;
 Finish := FALSE;
 Result := FALSE;

 //Initialisierung des Objekts (ältere Delphi-Versionen)
 Client          := TClientSocket.Create(Client);
 Client.OnConnect := ClientConnect;
 Client.OnError  := ClientError;

 try
   Client.Port := Port;
   // Remote Computer mit dem die Verbindung aufgebaut werden soll
   Client.Host:= Hostname;
   Client.Open;
 except
   //Im Fehlerfall wieder freigeben (ältere Versionen)
   Client.Free;
 end;

 while Finish = FALSE do
 begin
   Application.ProcessMessages;
 end;

 // Result setzen
 Result := IsAlive;
end;

end.
Bei der Zuweisung von Client.OnConnect und Client.OnError kommt es zum Fehler. Denn ich nicht lösen kann.

Meldermeldung:
Zitat:

E2009 Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur'
Funktioniert das überhaupt sowie ich es vorhabe? Bzw. was muss ich ändern, dass es klappt? Wollte eigentlich alles in die Funktion "IsHostSocketAlive" packen aber dazu fehlt mir das Wissen.

Als Ergebnis möchte ich gerne aus einer anderen Unit "IsHostSocketAlive" aufrufen und der Rückgabewert ist TRUE wenn die Verbindung zustande gekommen ist oder FALSE wenn es nicht geklappt hat.

Vielen Dank im voraus. Gruß, Sven

DeddyH 12. Aug 2008 08:05

Re: TClientSocket Eigenschaften in eigener Unit
 
Eine Methode ist ein Member einer Klasse. Was Du hast, sind reguläre Funktionen. Diese sind zu Events nicht kompatibel, Du musst Dir also eine Klasse schreiben, die die Funktionen besitzt, dann kannst Du sie auch zuweisen.
Delphi-Quellcode:
type TMyClass = class
private
  procedure ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
  ...
end;

...

procedure TMyClass.ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  //Code
end;

Piro 12. Aug 2008 08:35

Re: TClientSocket Eigenschaften in eigener Unit
 
So, ich habe das jetzt mal geändert aber leider noch nicht am gewünschten Ziel.

Delphi-Quellcode:
...
type
  TMyClass = class
 private
    { Private-Deklarationen }
    procedure ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
  public
    { Public-Deklarationen }
end;
...
procedure TMyClass.ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
// Code
end;

procedure TMyClass.ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
// Code
end;

function IsHostSocketAlive(Hostname: String; Port : Integer = 29979) : Boolean;
begin
 IsAlive := FALSE;
 Finish := FALSE;
 Result := FALSE;

 //Initialisierung des Objekts (ältere Delphi-Versionen)
 Client          := TClientSocket.Create(Client);
 Client.OnError  := TMyClass.ClientError;  // --> Hier kommt der Fehler
 Client.OnConnect := TMyClass.ClientConnect; // --> Hier kommt der Fehler

 ...
end;
Jetzt kommen die Fehlermedldungen:
Zitat:

E2010 Inkompatible Typen: 'TSocketErrorEvent' und 'Procedure'
Zitat:

E2010 Inkompatible Typen: 'TSocketNotifyEvent' und 'Procedure'
Was nun?

sirius 12. Aug 2008 08:45

Re: TClientSocket Eigenschaften in eigener Unit
 
Eine Methode gehört zu einer Instanz.
Delphi-Quellcode:
Client.OnError  := MyClass.ClientError;
Nur MyClass musst du eben noch erstellen.

DeddyH 12. Aug 2008 08:49

Re: TClientSocket Eigenschaften in eigener Unit
 
Du brauchst auch eine Instanz Deiner Klasse. Evtl. geht es auch mit einer Klassenmethode, sowas hab ich aber noch nie versucht.

Piro 12. Aug 2008 09:15

Re: TClientSocket Eigenschaften in eigener Unit
 
Danke euch. Hab es hinbekommen und wieder etwas dazugelernt.

Schönen Tag noch.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz