Creation d'un chat

cs_kitana Messages postés 1 Date d'inscription mercredi 7 mai 2003 Statut Membre Dernière intervention 5 juin 2004 - 5 juin 2004 à 23:03
picolo5 Messages postés 31 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 18 décembre 2006 - 12 janv. 2006 à 10:48
bonjour, je fais un chat pour mon exam de lundi :s à partir d'un exemple d'un livre de delphi et je n'arrive pas à faire la partie deconnexion : je veux que qd l'utilisateur, se deconnecte , la liste des utilisateurs soit reinitialisée en
supprimant le nom de celui qui vient de se deconnecter.
voici les sources

serveur

type
st200 = String[200];
TForm1 = class(TForm)
IdTCPServer1: TIdTCPServer;
procedure IdTCPServer1Connect(AThread: TIdPeerThread);
procedure IdTCPServer1Execute(AThread: TIdPeerThread);
procedure FormActivate(Sender: TObject);

private
{ Déclarations privées }
public
{ Déclarations publiques }
end;

var
Form1: TForm1;
repWin : String;
Th : array[1..100] of TIdPeerThread; //utilise pour stocker le thread des clients
Pseudo : array[1..100] of String; //memorise les pseudos des clients
NbThread : Integer; //nombre de threads connectes au serveur

implementation

{$R *.dfm}

procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread); //activee losqu'un client se connecte au serveur
begin
NbThread:=NbThread+1; //le nombre de thread est mis à jour
Th[NbThread]:=AThread; { Mémorisation du Thread }

AThread.Connection.Writeln('Connexion avec le serveur chat établie...');
end;

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var s, va,nom : String;
i,j : Integer;
begin
While Athread.Connection.Connected do //jusqu'a la deconnexion du client
begin
s:=AThread.Connection.Readln; //lecture de la chaine envoyee par le client puis stockage dans la variable
if s[1]='#' then //lorsque le premier caractere c'est #
begin
Pseudo[NbThread]:=s; //le pseudo est memorise dans le tableau Pseudo

for i:=1 to NbThread do //lorsque quelqu'un vient de se connecter ce dernier doit reinitialiser la liste des utilisateurs connectes
begin
{ Avertissement d'émission des pseudo }
Th[i].Connection.Writeln('#'); //indique qu'une liste de pseuod va suivre

{ Emission des pseudo }
for j:=1 to NbThread do //parcours de la liste des pseudos et les envoies aux clients connectes
Th[i].Connection.WriteLn(Pseudo[j]);

end
end
else for i:=1 to NbThread do //si la chaine recue n'est pas precedee d'un # l est acheminee vers tous les cleints
Th[i].Connection.WriteLn(s);
end;

end;

procedure TForm1.FormActivate(Sender: TObject); //activee dès le lancement du serveur
begin
NbThread:=0; { Aucun Thread pour l'instant }
end;

end.

client

procedure TForm1.ConnexionClick(Sender: TObject);
var
Pseudoexist:string;
begin
if (Form1.pseudo.Text='')
// le pseudo doit etre entre pour que la connexion soit etablie
then ShowMessage('Vous devez entrer un pseudo...')

else
with IdTCPClient1 do
begin
Host:=hote.Text;
Port:=StrToInt(Port1.Text);
Connect;
Connexion.Enabled:=False; //bouton connecter desactive
ReceptionThread:=TReceptionThread.Create(False); //le thread est instancie
IdTCPClient1.Writeln('#'+Pseudo.text);{commnunication du pseudo le # insdique au pseudo qu'il ne sagit pas d'un message mais du pseudo de l'utilisateur}

end;
end;
procedure TForm1.DeconnexionClick(Sender: TObject);
var s:string;
i:integer;
begin
s:='';
idTCPClient1.Disconnect;
Connexion.Enabled:=True; //bouton connecter reactive apres la deconnexion de l'utilisateur
i:= NomConnectes.Items.IndexOf(pseudo.text);
for i:=1 to form1.NomConnectes.Count
if form1.NomConnectes.Items(i).Objects =.text
then NomConnectes.Items.Delete(i);
end;
end;
ShowMessage('Vous n''êtes plus connecté');

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
IdTCPClient1.WriteLn(Pseudo.Text + '> ' + Message.Text); //envoie le message au destinataire

Message.Text:=''; //la zone de texte est reinitialisee
end;

procedure TForm1.MessageKeyPress(Sender: TObject; var Key: Char); //appelee lorsque la touche ENTREE est pressee code ASCII #13
begin
if (key=#13) then
begin
IdTCPClient1.WriteLn(Pseudo.Text + '> ' + Message.Text); //envoie le message au destinataire
Form1.Chat.Lines.Add(Pseudo.Text + '> ' + Message.Text); //affiche le message envoye
Message.Text:=''; //la zone de texte est reinitialisee
end;
end;
procedure TReceptionThread.Execute;
var
s:String;
i:integer;
begin
while not Terminated do //tant que terminated n'a pas ete initialisee à true
begin
s:= ' ';
try
s:= Form1.IdTCPClient1.Readln; //lecture des données issues du serveur
except
Terminate; //initialisation de terminate à true
end;
if (s='#') then Form1.NomConnectes.Clear //apres analyse des donnees recues, lorsque le serveur recoit un # la liste des pseudo doit etre vidée
else if (s[1]='#') and (length(s)>1) //si la chaine commence par # mais ne comporte pas qu'un seul caractere alors
then Form1.NomConnectes.Items.Add(S) //il est ajoute à la liste des pseudos
else Form1.Chat.lines.Add(S); //si elle ne commence pas par :# c un message donc il est affiche dasn le memo
end;
if terminated then i:=Form1. NomConnectes.Items.IndexOf(s);
if i >= 0 then Form1. NomConnectes.Items.Delete(i);
Form1.NomConnectes.Items.Clear(S);

end;

procedure TForm1.testClick(Sender: TObject);
var s:string;
begin

end;

merci d'avance

3 réponses

taye78 Messages postés 106 Date d'inscription mardi 18 juin 2002 Statut Membre Dernière intervention 13 janvier 2007
6 juin 2004 à 16:40
salut,
une petite observation superficielle:

NbThread:= NbThread+1; peut être remplacé par
inc(NbThread);

Sinon pour ton problème de déconnexion, tu veux juste retirer un item de ta ListBox ?
Tu peux, comme tu l'as dis ci-dessus réinitialiser la liste en supprimant son contenu et en réecrivant ce qui y était avant la suppression sans le pseudo de la personne qui vient de déconnecter. Ou, plus simplement faire un:

for i : = NomConnectes.Count downto 0 do
begin

(*
code de la condition qui verifie si l'item actuel est égale au pseudo de la personne qui vient de déconnecter. Et si c'est le cas il le supprime. Je te donne ce code de tête et comme je ne me souviens plus par coeur des noms des méthodes du controle ListBox pour supprimer un Item et pour récuperer une valeur de l'un de ses items je ne peux compléter le code. Désolé, mais le principal est là. Faire un FOR avec DOWNTO et non pas avec TO dû aux type de listes gerées par Delphi.
*)

end;

-wG-
0
anthony69330 Messages postés 1 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 3 juin 2005
3 juin 2005 à 11:50
jaimerais creer un chat
0
picolo5 Messages postés 31 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 18 décembre 2006
12 janv. 2006 à 10:48
salu, as tu fini/reussi a developper ton chat ??
peut tu me mailer tes sources ?? :) merci

picolo5@hotmail.com
0
Rejoignez-nous