Chat program vha. INDY
Halløjsa derude..Jeg sidder og nørkler lidt for sjov med INDY og "chat" muligheden som den tilbyder.. og jeg har nogle spørgsmål omkring disse komponenter..
1. kan det passe at indy ikke holder styr på hvor mange clients der er connectet?
2. hvis det kan lade sig gøre - hvordan pokker tilgår man dette antal, deres treads og navne fra klientens side?..
min hensigt er at lade de enkelte klienter se hvem der er på chatserveren samt at kunne lade dem skrive "privat" til hinanden.
..nedenfor er min kode for klienten.. jeg opfordrer iøvrigt alle til at anvende min kode så meget som muligt til inspiration. Fordi eksemplet som medfølger med INDY til klienten bruger en "beskridt" løkke - endda en løkke som låser programmet såfremt at .readln er "tom"... så alt i alt er eksemplet fra indy's side elendigt - i hvert tilfælde efter min mening.!
unit ClientUnit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, StdCtrls;
type
TReadThread = class(TThread)
public
constructor Create(IndyClient: TIdTCPClient);
private
FIndyClient: TIdTCPClient;
FMessage: String;
procedure DisplayString;
protected
procedure Execute; override;
end;
TForm1 = class(TForm)
IdTCPClient1: TIdTCPClient;
Memo1: TMemo;
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
procedure Button1Click(Sender: TObject);
procedure IdTCPClient1Connected(Sender: TObject);
procedure IdTCPClient1Disconnected(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
private
tr: TReadThread;
public
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{ TReadThread }
constructor TReadThread.Create(IndyClient: TIdTCPClient);
begin
FIndyClient := IndyClient;
inherited Create(false);
end;
procedure TReadThread.DisplayString;
begin
Form1.Memo1.Lines.Add(FMessage);
end;
procedure TReadThread.Execute;
begin
while not Terminated and FIndyClient.Connected do
begin
FMessage := FIndyClient.ReadLn('');
Synchronize(DisplayString);
end;
end;
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
IdTCPClient1.Host := '62.243.120.105';
IdTCPClient1.Port := strtoint(Edit3.Text);
IdTCPClient1.Connect;
IdTCPClient1.WriteLn(edit2.Text);
end;
procedure TForm1.IdTCPClient1Connected(Sender: TObject);
begin
Memo1.Lines.Add('[Connected]');
tr := TReadThread.Create(IdTCPClient1);
end;
procedure TForm1.IdTCPClient1Disconnected(Sender: TObject);
begin
if IdTCPClient1.ClosedGracefully then
Memo1.Lines.Add('[Disconnected gracefully]')
else
Memo1.Lines.Add('[Disconnected abruptly]');
tr.Free;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if (key = #13) then
begin
IdTCPClient1.Writeln(Edit1.Text);
edit1.Clear;
end;
end;
end.
