Instanciation composant existant (TClientSocket)

Résolu
figoleparigo Messages postés 8 Date d'inscription jeudi 17 juillet 2008 Statut Membre Dernière intervention 29 juin 2011 - 27 juin 2011 à 13:53
figoleparigo Messages postés 8 Date d'inscription jeudi 17 juillet 2008 Statut Membre Dernière intervention 29 juin 2011 - 29 juin 2011 à 09:33
Mon but est de créer une appli client de tests qui va ouvrir des centaines de Socket vers un serveur.

Je suis en train de lire qq tuto sur le sujet (instanciation dynamique), mais je ne suis pas très familié (pour ne pas dire une grosse quiche ...) avec la POO (Prog. orienté objet). D'où ma préférence pour la sélection de composant sur la palette de l'IDE Delphi 6, qui me simplifie grandement la tâche. Je m'en rends encore plus compte maintenant...

Les docs parlent de création de composant, alors que moi je veux juste appeler un composant existant. Ça devrait être moins compliqué normalement, non?

Bref, je voudrais un petit exemple de code qui "appelle" un composant existant, de la même manière que si on avait ajouté le bloc dans la Form, sans vouloir modifier de propriété, ou ajouter des fonctions... Je veux juste utiliser l'existant, mais pouvoir aussi l'instancier des centaines de fois...

D'avance merci,

4 réponses

figoleparigo Messages postés 8 Date d'inscription jeudi 17 juillet 2008 Statut Membre Dernière intervention 29 juin 2011
28 juin 2011 à 11:43
Je te remercie pour l'info, mais je ne veux pas "créer" un composant, mais juste utiliser l'existant. Ca veut peut-être dire la même chose au final, vu le code...
J'ai trouvé mon bonheur avec ces qq lignes, je les mets pour répondre à la question...

var
  ListeSockets: array[1..100] of TClientSocket;

procedure TClientForm.ClickConnexion(Sender: TObject);
var
  idx : cardinal;
begin
  for idx:=1 to 100 do
  begin
    if not Assigned(ListeSockets[idx]) then
    begin
      ListeSockets[idx] := TClientSocket.Create(self);
      ListeSockets[idx].Host := 'localhost';
      ListeSockets[idx].Port := 1024;
      ListeSockets[idx].ClientType := ctNonBlocking;
      ListeSockets[idx].OnRead := OnReadSock1;   // Fonction de lecture des données reçues du serveur
      ListeSockets[idx].Open;
      sleep(200);
    end;
  end;


Pour l'instant, la seconde partie dont tu parles "Form1.Components[i]...", je ne m'en sers pas, mais c'est bon à savoir.
Merci.
3
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
27 juin 2011 à 20:51
Si j'ai bien compris ce que tu voulais faire, c'est une création dynamique de composant:

var NewCompo : TCompo;

for i := 0 to 99 do NewCompo := TCompo.Create(Self);


Ensuite, tu peux faire référence à chaque compo créé en tant que compo indexé du TForm:

for i := 0 to Form1.ComponentCount-1 do if Form1.Components[i] is TCompo then (Form1.Components[i] as TCompo)...




_______________________________________
Soutenez Wikimédia France aujourd'hui : http://dons.wikimedia.fr
0
Utilisateur anonyme
28 juin 2011 à 12:02
Salut

Caribensila te propose non pas de créer tes composants en designtime mais en runtime et il a raison parce que si tu dois déposer 100 TClientSocket sur ta form ca va faire lourd .

Sinon fais attention ou tu mets les pieds : Il va y avoir les évènements à gérer derrière .
0
figoleparigo Messages postés 8 Date d'inscription jeudi 17 juillet 2008 Statut Membre Dernière intervention 29 juin 2011
29 juin 2011 à 09:33
Merci pour cette précision, mais j'ai encore du mal avec ces notions de "DesignTime" et "RunTime".
Si j'ai bien compris:
DesignTime : Création d'un composant avec une unité dédiée et un fichier BPL et un nouvel icône sur la palette...
RunTime : 'Création' d'un objet "composant" à l'exécution du programme... Sans ajouter de bloc sur la Form.

Dans mon exemple, j'ai donné le nom de la fonction directement à l'événement:
ListeSockets[idx].OnRead := OnReadSock1;

Pour les centaines de composants créés à la volée, ça fonctionne bien, tous les sockets appellent cette fonction pour les messages reçus du serveur.
De toute façon, c'est un code qui sert juste pour des tests de faisabilité. Seule la partie Serveur servira en prod.
0
Rejoignez-nous