Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TClientSocket: Problem bei Eventzuweisung (https://www.delphipraxis.net/98123-tclientsocket-problem-bei-eventzuweisung.html)

Nils_13 21. Aug 2007 21:20


TClientSocket: Problem bei Eventzuweisung
 
Hi,

ich bin der Meinung, dass man nur dann eine GUI benötigt, wenn sie wirklich nötig ist, ansonsten tut es auch eine Konsolenanwendung.

GUI:
Client auf die Form, Port und Host eingestellt, am Ende noch Open aufgerufen und im OnConnect nachgefragt, ob die Verbindung geklappt hat. Kein Problem.

Konsolenanwendung:
Eigene Klasse erstellt, Events werden NICHT zugewiesen. Warum ?

Delphi-Quellcode:
type
  TClient = class
    constructor Create;
  public
    Cli : TClientSocket;
    procedure ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
  end;

constructor TClient.Create;
begin
  Cli := TClientSocket.Create(nil);
  with Cli do
  begin
    // Einstellungen
    Address := '209.85.129.104';
    Port   := 80;
    // Standardzuweisungen setzen
    OnConnect   := ClientConnect;
    OnDisconnect := ClientDisconnect;
    OnError     := ClientError;
    // Öffnen
    Open;
  end;
end;

procedure TClient.ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  if Socket.Connected then
    WriteLn('Verbindung erfolgreich')
  else
    WriteLn('Verbindung fehlgeschlagen');
end;

Muetze1 21. Aug 2007 21:35

Re: TClientSocket: Problem bei Eventzuweisung
 
Zitat:

Zitat von Nils_13
Konsolenanwendung:
Eigene Klasse erstellt, Events werden NICHT zugewiesen. Warum ?

Wer sagt dir denn das die Events nicht zugewiesen werden? Ist es nicht wahrscheinlicher das sie nicht ausgelöst werden?

Nils_13 21. Aug 2007 21:44

Re: TClientSocket: Problem bei Eventzuweisung
 
Ok, aber warum werden sie nicht ausgelöst ? Sie müssten *eigentlich*.

sirius 21. Aug 2007 21:46

Re: TClientSocket: Problem bei Eventzuweisung
 
Was fehlt dir denn? Also ich bekomme ein ErrorEvent=eeConnect in deine ClientError-Methode mit Errorlevel=10060.
Edit: Meine natürlich Errorcode :drunken:
Edit2: Hey: Und mit deiner IP krieg ich sogar ein "Verbindung erfolgreich" (warum habe ich auch erst die IP verändert :wall: )

Nils_13 22. Aug 2007 18:13

Re: TClientSocket: Problem bei Eventzuweisung
 
Hast du auch wirklich die Klasse genommen und erstellt ?

:twisted: Wieso funzt bei allen anderen immer alles und bei mir nicht :twisted:

sirius 22. Aug 2007 18:30

Re: TClientSocket: Problem bei Eventzuweisung
 
Na klar. Warte ich zeigs gleich. Muss ihn nur nochmal erstellen.

Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}

uses windows,scktcomp;

type
  TClient = class
    constructor Create;
  public
    Cli : TClientSocket;
    procedure ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
//    procedure ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
  end;

constructor TClient.Create;
begin
  Cli := TClientSocket.Create(nil);
  with Cli do
  begin
    // Einstellungen
    Address := '209.85.129.104';
    Port   := 80;
    // Standardzuweisungen setzen
    OnConnect   := ClientConnect;
 //   OnDisconnect := ClientDisconnect;
    OnError     := ClientError;
    // Öffnen
    Open;
  end;
end;

procedure Tclient.ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  writeln('Error: ',errorcode);
end;
procedure TClient.ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  if Socket.Connected then
    WriteLn('Verbindung erfolgreich')
  else
    WriteLn('Verbindung fehlgeschlagen');
end;


var client:Tclient;
    msg:Tmsg;
begin
  client:=tclient.create;
  while getmessage(msg,0,0,0) do dispatchmessage(msg);

  client.free; //kommt jetzt eh nie hierher ;-)

end.

Nils_13 22. Aug 2007 18:59

Re: TClientSocket: Problem bei Eventzuweisung
 
Hm...es liegt definitiv an dieser Zeile:
Delphi-Quellcode:
while getmessage(msg,0,0,0) do dispatchmessage(msg);
Warum funktioniert es mit ihr, im Vergleich zu meiner ?

sirius 22. Aug 2007 19:21

Re: TClientSocket: Problem bei Eventzuweisung
 
Ich kenne deine "Zeile" nicht.

Funktionieren ist etwas übertrieben, man muss wahrscheinlich daran noch etwas ändern, damit auch der Rest des Programmes weiterläuft.

Nils_13 22. Aug 2007 19:29

Re: TClientSocket: Problem bei Eventzuweisung
 
Delphi-Quellcode:
var Client : TClient;
    line  : String;
begin
  WriteLn('blabla');

  Client := TClient.Create;

  ReadLn(line);
  if line = '...' then
  begin
    // ...
  end else
  begin
    Client.Free;
    Exit;
  end;
end.

sirius 22. Aug 2007 19:36

Re: TClientSocket: Problem bei Eventzuweisung
 
ReadLn auf der Konsole und Messageabarbeitung, geht zugleich nicht wirklich. Da musst du dir wahrscheinlich deine eigene Readln-Methode basteln.

Nils_13 22. Aug 2007 19:45

Re: TClientSocket: Problem bei Eventzuweisung
 
Könnte dein dazu gezeigtes Beispiel nicht hilfreich sein ? (Variable msg)

Muetze1 22. Aug 2007 20:23

Re: TClientSocket: Problem bei Eventzuweisung
 
Die VCL hat doch einen Thread um die Nachrichten zu verarbeiten. Warum hier nicht gleiches versuchen?

sirius 22. Aug 2007 20:54

Re: TClientSocket: Problem bei Eventzuweisung
 
Irgendwie so vielleicht:
Delphi-Quellcode:
function readkey:char;
var buf:input_record;
    ret:cardinal;
begin
  result:=#0;
  GetNumberOfConsoleInputEvents(inputhandle,ret);
  if ret>0 then
  begin
    readconsoleinput(inputhandle,buf,1,ret);
    if buf.EventType=key_event then
    begin
      if buf.Event.KeyEvent.bKeyDown then
        result:=buf.Event.KeyEvent.AsciiChar;
    end;
  end;
end;

procedure readln(var x:string);
var key:char;
    msg:tmsg;
begin
  x:='';
  repeat
    while peekmessage(msg,0,0,0,PM_remove) do begin
      translatemessage(msg);
      dispatchmessage(msg);
    end;
    key:=readkey;
    if key <>#0 then
    begin
      write(key);
      if key<>#13 then x:=x+key;
    end;
  until (key=#13);
end;
mit
Delphi-Quellcode:
inputhandle:=getstdhandle(STD_INPUT_HANDLE); //DWORD
Man muss allerdings noch besser auf die Tasten reagieren. Und ob das die optimale Lösung ist?
Als alternativen fallen mir (neben der normalen VCL-GUI-Anwendung) noch ein:
-nonVCL-GUI
-TClient in Thread setzen (wie mütze sagt)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:28 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