IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Web & réseau Delphi Discussion :

Recommandations ou suggestions pour mon petit mini projet de chat


Sujet :

Web & réseau Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Inscrit en
    Juin 2011
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 227
    Points : 51
    Points
    51
    Par défaut Recommandations ou suggestions pour mon petit mini projet de chat
    Salut tous le monde je veux que vous me donniez votre avis aussi vos recommandations ou suggestions sur cette petite application de chat afin de l'optimiser et la rendre robuste et efficace. J'utilise le composant Indy version 9.00.10.

    Voila le code source de client et serveur

    Client
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
      IdTCPClient, StdCtrls, XPMan, IdAntiFreezeBase, IdAntiFreeze;
     
    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Label1: TLabel;
        Label2: TLabel;
        Edit2: TEdit;
        Button1: TButton;
        Button2: TButton;
        IdTCPClient1: TIdTCPClient;
        Shape1: TShape;
        Memo1: TMemo;
        Timer1: TTimer;
        Label3: TLabel;
        Edit4: TEdit;
        Edit3: TEdit;
        Button3: TButton;
        XPManifest1: TXPManifest;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure Edit3KeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    IdTCPClient1.Port:= strtoint(edit2.text);
    IdTCPClient1.Host:=Edit1.Text; 
     
    if (edit1.Text<>'') and (edit2.Text<>'') and (edit4.Text <>'') then
    begin
    IdTCPClient1.connect; 
    Shape1.Brush.Color := clblue;
    button1.Enabled:=false;
    button2.Enabled:=true;
    button3.Enabled:=true;
    edit3.Enabled:=true;
    edit3.SetFocus;
    end;
     
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    IdTCPClient1.Disconnect; 
    Shape1.Brush.Color := clred;
    button1.Enabled:=true;
    button3.Enabled:=false;
    edit3.Enabled:=false;
     
    end;
     
    procedure TForm1.Button3Click(Sender: TObject);
    begin
    IdTCPClient1.WriteLn(edit4.text+': '+edit3.Text); 
    memo1.Lines.Append('Moi: '+edit3.Text);
    edit3.Text:='';
    edit3.SetFocus;
    end;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
     
     
        if idtcpclient1.connected= true then
        if IdTCPClient1.InputBuffer.Size=0 then
        begin
         IdTCPClient1.ReadFromStack(True,0,False);
         while IdTCPClient1.InputBuffer.Size > 0 do
         memo1.Lines.Append(IdTCPClient1.ReadLn+chr(13));
     
    end;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    memo1.Clear;
    end;
     
    procedure TForm1.Edit3KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
    if (Key=VK_return) then
    begin
    IdTCPClient1.WriteLn(edit4.text+': '+edit3.Text); 
    memo1.Lines.Append('Moi: '+edit3.Text);
    edit3.Text:='';
    edit3.SetFocus;
    end;
    end;
     
    end.
    Serveur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, IdBaseComponent, IdComponent, IdTCPServer, ExtCtrls, StdCtrls,
      XPMan;
     
    type
      TForm1 = class(TForm)
        Label1: TLabel;
        Edit1: TEdit;
        Label2: TLabel;
        Edit2: TEdit;
        Button1: TButton;
        Button2: TButton;
        Shape1: TShape;
        IdTCPServer1: TIdTCPServer;
        Memo1: TMemo;
        Button3: TButton;
        Edit3: TEdit;
        XPManifest1: TXPManifest;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure IdTCPServer1Execute(AThread: TIdPeerThread);
        procedure Button3Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure Edit3KeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    IdTCPServer1.DefaultPort:= strtoint(edit1.Text);
    IdTCPServer1.Active := true; 
    Shape1.Brush.Color := clblue;
    button2.Enabled:=true;
    button1.Enabled:=false;
    button3.Enabled:=true;
    edit3.Enabled:=true;
    edit3.SetFocus;
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    IdTCPServer1.Active := false; 
    Shape1.Brush.Color := clred;
    button2.Enabled:=false;
    button1.Enabled:=true;
    button3.Enabled:=false;
    edit3.Enabled:=false;
    end;
     
     
     
    procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
    var text:string;
    begin
    text :=athread.Connection.readln();
     
    memo1.Lines.add(text);
    end;
     
    procedure TForm1.Button3Click(Sender: TObject);
    var
      Count: Integer;
      List : TList;
    begin
     List := IdTCPServer1.Threads.LockList;
        try
          for Count := 0 to List.Count -1 do
               begin
     
                    TIdPeerThread(List.Items[Count]).Connection.WriteLn(edit2.text+': '+edit3.Text+chr(13));
                end;
     
        finally
            IdTCPServer1.threads.UnlockList;
            memo1.Lines.add('Moi: '+edit3.Text);
            edit3.Text:='';
            edit3.SetFocus;
    end;
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    memo1.Clear;
    end;
     
    procedure TForm1.Edit3KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
       var
      Count: Integer;
      List : TList;
    begin
    if (Key=VK_return) then
     begin
     List := IdTCPServer1.Threads.LockList;
        try
          for Count := 0 to List.Count -1 do
               begin
     
                    TIdPeerThread(List.Items[Count]).Connection.WriteLn(edit2.text+': '+edit3.Text+chr(13));
                end;
     
        finally
            IdTCPServer1.threads.UnlockList;
            memo1.Lines.add('Moi: '+edit3.Text);
            edit3.Text:='';
            edit3.SetFocus;
    end;
     
     end;
    end;
     
    end.
    Merci à toute l'équipe de forum Developpez de Delphi.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    • Ne pas utiliser un TTimer et passe par des Threads côté Client
    • Indenter ton code, c'est utile pour la lisibilité
    • Renommer les composants ne laisse pas Button1, Button2, Button3 mais plutôt btnConnect, btnDisconnect, btnSend ...
    • Isoler la partie IHM de la partie Communication


    Ton code est extrêmement court, que veux-tu que l'on améliore ?
    La partie échange de texte du Chat n'a pas un grand intérêt, c'est le basique fourni dans n'importe quelle démo,
    cela devient intéressant lorsque tu traiteras la partie Commande façon IRC


    Pour Indy, je ne peux pas juger, j'ai toujours utiliser TServerSocket et TClientSocket en mode NotBlocking (Event) sous D6 et en mode Blocking (Thread) sous XE2
    J'ai fait des programmes qui tourne 24/24 pendant des semaines sans aucun soucis au niveau de la communication malgré les 50 000 messages par heure

    Dans un sujet similaire au tien : Création d'un système de chat en Pascal, j'ai fourni ma classe TSLTRemoteMessenger
    Elle a évolué dans le Temps, TServerSocket, puis TTcpServer, j'ai eu une version TIdTcpServer mais au final, je suis revenu au TServerSocket en mode thread

    Sinon, les exemples D7 contient un exemple NetChat en Indy

    Enfin pour conclure Défi Pascal 2010 - Un système de chat : projet de mick605
    Tu y trouveras le code complet d'un Chat en Indy 10 qui pourra t'inspirer en Indy 9
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre du Club
    Homme Profil pro
    Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Inscrit en
    Juin 2011
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 227
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Ne pas utiliser un TTimer et passe par des Threads côté Client
    J'ai utilisé un TTimer parce que je sais pas vraiment comment crée et utiliser un Thread, je sais même pas où mettre son code est ce que dans un Événement où autre chose, c'est pour ça que j'ai mis cette discussion parce que je sais que mon code n'est pas vraiment optimal malgré qu'il fonctionne bien. Pour le moment je l'ai tester avec quatre personne et il n y a pas de problème il continue à fonctionner normalement mais j'ai aussi penser au cas s'il y aura beaucoup de personne dans un autre environnement (Dans le cas où je vais mettre cette application dans une WorkStation avec une connexion par fibre optique). Donc j'aimerais bien que tu m'explique comment créer le thread et où le mettre, pour l'amélioration proposer moi quelque idées. Je vous remercie une autre fois ShaiLeTroll parce que je vous tien vraiment un grand respect.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Je n'ai plus de code version Indy, je n'ai pas aimé l'utilisation de ce composant

    Regarde dans le code de Défi Pascal 2010 - Un système de chat : projet de mick605
    Unité UChatV6_3_Communication
    cherche TReceptionThread.Execute et TReceptionThread.Create
    Cela devrait t'apprendre l'utilisation des Threads

    Il n'y a pas grande différente entre le OnTimer et le Execute d'un Thread
    Il faut juste utiliser Synchronize pour manipuler la Form depuis le Thread

    Par contre, le thread a l'avantage de pouvoir lire sans se bloquer.
    Dans ta fenêtre, si tu ajoutes un MainMenu ou un PopupMenu, lorsqu'ils sont ouverts, cela peu bloquer le traitement du Timer.

    Je vais essayer de reprendre ton code
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre du Club
    Homme Profil pro
    Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Inscrit en
    Juin 2011
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 227
    Points : 51
    Points
    51
    Par défaut
    Merci ShaiLeTroll je vais essayer de voir les deux procédures et je vais essayer de les intégrer dans mon code si je serais bloqué je vais poser le problème.

  6. #6
    Membre du Club
    Homme Profil pro
    Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Inscrit en
    Juin 2011
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 227
    Points : 51
    Points
    51
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      TReceptionthread = class(TThread)
      protected
        IdClient : TIdTCPClient;
        FRecept : string;         //pour le synchronize
        FOnReception : TSimpleReception;
        procedure Execute; override;
        procedure DoOnReception;
      public
        property OnReception : TSimpleReception read FOnReception write FOnReception;
      end;
    Je voulais poser ce code dans la partie type il m'a retourne un erreur dans cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TReceptionthread = class(TThread)
    l'erreur dit qu'il manque : avant = puis j'ai posé le code avant la déclaration du type Form il m'a retourner l'erreur suivante TSimpleReception non déclaré ! alors que dois je faire ? Et est ce que TSimpleReception fait partie du composant TIdtcpclient ?

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    J'ai repris ton code, sans vérifier si la partie Indy est bonne, ni vérifier la syntaxe, cela devrait t'aider

    Je note que ton dernier message contient tout ce qu'il faut déjà

    TSimpleReception c'est un event je pense
    Dans le code que j'ai fourni c'est TThreadClientReceiveLineEvent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
      IdTCPClient, StdCtrls, XPMan, IdAntiFreezeBase, IdAntiFreeze;
     
    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Label1: TLabel;
        Label2: TLabel;
        Edit2: TEdit;
        Button1: TButton;
        Button2: TButton;
        IdTCPClient1: TIdTCPClient;
        Shape1: TShape;
        Memo1: TMemo;
        Timer1: TTimer;
        Label3: TLabel;
        Edit4: TEdit;
        Edit3: TEdit;
        Button3: TButton;
        XPManifest1: TXPManifest;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure Edit3KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
      private
        { Déclarations privées }
        FThread: TThread;
        procedure ThreadClientReceiveLineEventHandler(Sender: TObject; const ALine: string);
      public
        { Déclarations publiques }
        destructor Destroy(); override;
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    type
      TThreadClientReceiveLineEvent = procedure(Sender: TObject; const ALine: string) of object;
     
      TThreadClient = class(TThread)
      private
        FIdTCPClient: TIdTCPClient;
        FCurrentLine: string;
        FOnReceiveLine: TThreadClientReceiveLineEvent;
     
        procedure DoReceiveLine();
      protected
        // Méthodes redéfinies
        procedure Execute(); override;
      public
        // Constructeurs Publiques
        constructor Create(AFIdTCPClient: TIdTCPClient; AOnReceiveLine: TThreadClientReceiveLineEvent);
     
        property OnReceiveLine: TThreadClientReceiveLineEvent read FOnReceiveLine write FOnReceiveLine; 
      end;
     
     
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin  
      if Assigned(FThread) then
        FThread.Terminate();
     
      IdTCPClient1.Disconnect();
      IdTCPClient1.Port:= StrToInt(edit2.text);
      IdTCPClient1.Host:= Edit1.Text; 
      IdTCPClient1.Connect();
     
      FreeAndNil(FThread);
      FThread := TThreadClient.Create(IdTCPClient1, ThreadClientReceiveLineEventHandler);
     
      if (edit1.Text<>'') and (edit2.Text<>'') and (edit4.Text <>'') then
      begin
        Shape1.Brush.Color := clblue;
        button1.Enabled:=false;
        button2.Enabled:=true;
        button3.Enabled:=true;
        edit3.Enabled:=true;
        edit3.SetFocus;
      end;
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      IdTCPClient1.Disconnect; 
      Shape1.Brush.Color := clred;
      button1.Enabled:=true;
      button3.Enabled:=false;
      edit3.Enabled:=false;
    end;
     
    procedure TForm1.Button3Click(Sender: TObject);
    begin
      IdTCPClient1.WriteLn(edit4.text+': '+edit3.Text); 
      memo1.Lines.Append('Moi: '+edit3.Text);
      edit3.Text:='';
      edit3.SetFocus;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      memo1.Clear;
    end;
     
    destructor TForm1.Destroy(); 
    begin
      FreeAndNil(FThread); // Arrete, attend puis détruit le thread
     
      inherited Destroy();
    end;
     
    procedure TForm1.Edit3KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin
      if Key = VK_return then
      begin
        IdTCPClient1.WriteLn(edit4.text+': '+edit3.Text); 
        memo1.Lines.Append('Moi: '+edit3.Text);
        edit3.Text:='';
        edit3.SetFocus;
      end;
    end;
     
    procedure TForm1.ThreadClientReceiveLineEventHandler(Sender: TObject; const ALine: string);
    begin
      memo1.Lines.Append(ALine);
    end;
     
     
     
    // -------
     
    constructor TThreadClient.Create(AFIdTCPClient: TIdTCPClient; AOnReceiveLine: TThreadClientReceiveLineEvent);
    begin
      inherited Create(False);
     
      FIdTCPClient := AFIdTCPClient;
      FOnReceiveLine := AOnReceiveLine;
    end;
     
    procedure TThreadClient.Execute();
    begin
      while not Terminated and FIdTCPClient.Connected do
      begin 
        if FIdTCPClient.InputBuffer.Size = 0 then
        begin
           FIdTCPClient.ReadFromStack(True, 0, False);
           FCurrentLine := '';
           while FIdTCPClient.InputBuffer.Size > 0 do
             FCurrentLine := FIdTCPClient.ReadLn + Chr(13);
           if FCurrentLine <> '' then
             Synchronize(DoReceiveLine()); 
        end;
      end;
    end;
     
     
    procedure TThreadClient.DoReceiveLine(); 
    begin
      if Assigned(FOnReceiveLine) then
        FOnReceiveLine(Sender, FCurrentLine);
    end;
     
     
     
    end.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Membre du Club
    Homme Profil pro
    Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Inscrit en
    Juin 2011
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Tutulaire d'un Master Academique en Réseaux et Systèmes repartis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 227
    Points : 51
    Points
    51
    Par défaut
    merci ShaiLeTroll je vrais prendre le code et l'essayer et je vais poser les problèmes s'il y on a.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Quel langage pour mon petit projet?
    Par StyveA dans le forum Développement 2D, 3D et Jeux
    Réponses: 5
    Dernier message: 07/12/2011, 14h13
  2. Quel hébergeur pour mon petit site ?
    Par Goldensnake dans le forum Hébergement
    Réponses: 3
    Dernier message: 16/05/2007, 17h53
  3. Quelle carte mère pour mon petit proc
    Par jc_cornic dans le forum Composants
    Réponses: 11
    Dernier message: 02/01/2007, 14h40
  4. Pour mon petit jeux de voiture en php
    Par schtek2 dans le forum Jeux web
    Réponses: 3
    Dernier message: 15/08/2006, 18h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo