Instanciation composant existant (TClientSocket) [Résolu]

Signaler
Messages postés
8
Date d'inscription
jeudi 17 juillet 2008
Statut
Membre
Dernière intervention
29 juin 2011
-
Messages postés
8
Date d'inscription
jeudi 17 juillet 2008
Statut
Membre
Dernière intervention
29 juin 2011
-
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

Messages postés
8
Date d'inscription
jeudi 17 juillet 2008
Statut
Membre
Dernière intervention
29 juin 2011

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.
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
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

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 .
Messages postés
8
Date d'inscription
jeudi 17 juillet 2008
Statut
Membre
Dernière intervention
29 juin 2011

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.