Avatar billede refpsych Nybegynder
18. november 2002 - 17:37 Der er 8 kommentarer og
1 løsning

Konsol/TCP

Jeg har et konsolprogram som skal være en TCPserver...Men hvordan laver jeg Events i mit konsolprogram? Jeg skal jo bruge onExecute, onConnect OSV. Hvordan får jeg dem bygget ind? (Dem der er i sourcen herunder virker ikke!)


program fserver;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  IdTCPServer,
  IdThreadMgrDefault,
  IdStatus, Sockets;

var
TCP : TIdTCPServer;
ITMgr : TIdThreadMgrDefault;
port : integer;
sendbuffer, cmdline : string;
AThread2: TIdPeerThread;

procedure TCPConnect(AThread: TIdPeerThread);
begin
writeLn('Client Connected...');
readLn;
end;

procedure TCPDisconnect(AThread: TIdPeerThread);
begin
writeLn('Client Disconnected...');
readLn;
end;

procedure TCPExecute;
var
AThread : TIdPeerThread;
begin
  begin
    writeLn(AThread.Connection.readLn(#0));
    AThread.Connection.writeLn(sendbuffer+#0);
  end;
end;

procedure TCPStatus(axSender: TObject;
  const axStatus: TIdStatus; const asStatusText: String);
begin
writeLn(asStatusText);
end;

procedure TCPIntercept;
Begin
WriteLn('interceptet');
end;

procedure readline(line: String);
begin
if (line = 'quit') then
begin
exit;
end;
readLn(cmdLine);
readline(cmdLine);
end;

begin
WriteLn('-------------------------------');
WriteLn(' Server');
WriteLn('-------------------------------');
WriteLn('');
Write('Server Port: ');
Readln(port);
TCP := TIdTCPServer.Create(nil);
TCP.DefaultPort := port;
TCP.TerminateWaitTime := 5000;
TCP.Active := true;
WriteLn('');
WriteLn('Server Running');
readLn(cmdLine);
readline('cmdline');
end.
Avatar billede borrisholt Novice
18. november 2002 - 17:42 #1
Du opretter en klasse med Metoderne på :

//Det er MEGET vigtigt klassen hedder noget med hest.
Type
  THest = class
  Public
  procedure OnExecute(AThread: TIdPeerThread);
  end;

HUSK er oprette din kalsse ! Du ved Create finden ....

Og så er det blot at mappe det op :
  TCP.OnExecute := Execute etc
Jeg vil anbefale du laver en klasse til at styre logikken
Avatar billede refpsych Nybegynder
18. november 2002 - 17:57 #2
Okay det hjalp da lidt, men nu får jeg fejlen: [Error] fserver.dpr(14): Unsatisfied forward or external declaration: 'TTCPclass.onExecute'

...Når sourcen ser sådan ud: (Mon der er for lidt hest??? :D )

program fserver;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  IdTCPServer,
  IdThreadMgrDefault,
  IdStatus, Sockets;

Type
  TTCPclass = class
  Public
  procedure onExecute(AThread: TIdPeerThread);
  end;

var
TCP : TIdTCPServer;
ITMgr : TIdThreadMgrDefault;
port : integer;
sendbuffer, cmdline : string;
TCPclass : TTCPclass;

procedure TCPConnect(AThread: TIdPeerThread);
begin
writeLn('Client Connected...');
readLn;
end;

procedure TCPDisconnect(AThread: TIdPeerThread);
begin
writeLn('Client Disconnected...');
readLn;
end;

procedure TCPExecute;
var
AThread : TIdPeerThread;
begin
  begin
    writeLn(AThread.Connection.readLn(#0));
    AThread.Connection.writeLn(sendbuffer+#0);
  end;
end;

procedure TCPStatus(axSender: TObject;
  const axStatus: TIdStatus; const asStatusText: String);
begin
writeLn(asStatusText);
end;

procedure TCPIntercept;
Begin
WriteLn('interceptet');
end;

procedure readline(line: String);
begin
if (line = 'quit') then
begin
exit;
end;
readLn(cmdLine);
readline(cmdLine);
end;

begin
TCPclass := TTCPclass.Create;
WriteLn('-------------------------------');
WriteLn(' Server');
WriteLn('-------------------------------');
WriteLn('');
Write('Server Port: ');
Readln(port);
TCP := TIdTCPServer.Create(nil);
TCP.DefaultPort := port;
TCP.TerminateWaitTime := 5000;
TCP.Active := true;
WriteLn('');
WriteLn('Server Running');
readLn(cmdLine);
readline('cmdline');
TCPclass.Free;
end.


program fserver;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  IdTCPServer,
  IdThreadMgrDefault,
  IdStatus, Sockets;

Type
  TTCPclass = class
  Public
  procedure onExecute(AThread: TIdPeerThread);
  end;

var
TCP : TIdTCPServer;
ITMgr : TIdThreadMgrDefault;
port : integer;
sendbuffer, cmdline : string;
TCPclass : TTCPclass;

procedure TCPConnect(AThread: TIdPeerThread);
begin
writeLn('Client Connected...');
readLn;
end;

procedure TCPDisconnect(AThread: TIdPeerThread);
begin
writeLn('Client Disconnected...');
readLn;
end;

procedure TCPExecute;
var
AThread : TIdPeerThread;
begin
  begin
    writeLn(AThread.Connection.readLn(#0));
    AThread.Connection.writeLn(sendbuffer+#0);
  end;
end;

procedure TCPStatus(axSender: TObject;
  const axStatus: TIdStatus; const asStatusText: String);
begin
writeLn(asStatusText);
end;

procedure TCPIntercept;
Begin
WriteLn('interceptet');
end;

procedure readline(line: String);
begin
if (line = 'quit') then
begin
exit;
end;
readLn(cmdLine);
readline(cmdLine);
end;

begin
TCPclass := TTCPclass.Create;
WriteLn('-------------------------------');
WriteLn(' Server');
WriteLn('-------------------------------');
WriteLn('');
Write('Server Port: ');
Readln(port);
TCP := TIdTCPServer.Create(nil);
TCP.DefaultPort := port;
TCP.TerminateWaitTime := 5000;
TCP.Active := true;
WriteLn('');
WriteLn('Server Running');
readLn(cmdLine);
readline('cmdline');
TCPclass.Free;
end.
Avatar billede refpsych Nybegynder
18. november 2002 - 18:01 #3
Ups! Doppelt source :)
Avatar billede borrisholt Novice
18. november 2002 - 18:02 #4
Du skal implemtere din Metode :-)

Jens B
Avatar billede borrisholt Novice
18. november 2002 - 18:03 #5
Det går ikke så godt for blå hold i aften :-)
Avatar billede refpsych Nybegynder
18. november 2002 - 18:06 #6
implemtere? *g* Ja, nu spørg jeg nok dumt...Men hvordan gør jeg det...

Et hvert hold ville tape med maven fuld af hestekød...!? Så er det lige meget om de er blå...
Avatar billede borrisholt Novice
18. november 2002 - 18:12 #7
Hvis du have dit TTcpServer på en form så ville du gå i din Object Inspector, og så ville du skrive noget kode i OnExecute. Hvis altså det er det event du ønsker at implementere ....

Det samme kode skriver du i

  TTCPclass.onExecute();

Jens B
Avatar billede refpsych Nybegynder
18. november 2002 - 18:21 #8
Nu er jeg sq ikke helt med mere...
Jow, altså hvis du mener at der skal skrives noget kode i proceduren...
Men ellers har jeg sq ik helt fatten det...du kunne vel ik prøve at skrive hele koden ud i et...?
Avatar billede refpsych Nybegynder
18. november 2002 - 19:10 #9
Okay...nu har jeg forenklet kode så meget jeg ku, men jeg får stadig fejl...

[Error] Project2.dpr(50): Incompatible types: 'TIdServerThreadEvent' and 'procedure, untyped pointer or untyped parameter'
[Error] Project2.dpr(14): Unsatisfied forward or external declaration: 'TTCPclass.onExecute'



program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  IdTCPServer,
  IdThreadMgrDefault,
  IdStatus, Sockets;

Type
  TTCPclass = class
  Public
  procedure onExecute(AThread: TIdPeerThread); <-- Fejl her!!!
  end;

var
TCP : TIdTCPServer;
ITMgr : TIdThreadMgrDefault;
port : integer;
cmdline : string;
TCPclass : TTCPclass;
myThread : TIdPeerThread;

Procedure onExecute(AThread: TIdPeerThread);
begin

end;

procedure readline(line: String);
begin
if (line = 'quit') then
begin
exit;
end;
readLn(cmdLine);
readline(cmdLine);
end;

begin
TCPclass := TTCPclass.Create;

Write('Server Port: ');
Readln(port);

TCP := TIdTCPServer.Create(nil);
TCP.DefaultPort := port;
TCP.TerminateWaitTime := 5000;
TCP.Active := true;
TCP.OnExecute := TCPclass.onExecute(myThread);  <-- Fejl Her

WriteLn('Server Running');

readLn(cmdLine);
readline('cmdline');

TCPclass.Free;
end.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester