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

  1. #1
    Membre à l'essai

    Inscrit en
    août 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : août 2004
    Messages : 33
    Points : 22
    Points
    22
    Par défaut Comment créer dynamiquement 1000 composants sans ralentissement ?
    Bonjour à tous...

    Bon, j'ai un problème à résoudre : Je créé des composants à foison sur mon applications... En fait, il s'agit d'un logiciel de recherche et lorsqu'il trouve quelque chose de bien, il créé plusieurs labels, plusieurs images, disons une dizaine de composants par résultats, et il peut trouver jusque 5000 voir 10000 résultats...

    Je créé mes composants ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var
    composant:Tcomposant;
    begin
     
    composant := tcomposant.create(formX);
    composant.name := 'Moncomposant';
    composant.
     
    ...
    et je les vide avec un Free...

    TOUT CELA EST EXCESSIVEMENT LENT ! Si quelqu'un sait comment faire pour accèlérer la création de composants dynamiques et de leur destruction... Je suis preneur !!! Tout ce qui peut bosster est bon même si c'est un dixième de seconde !!!

    Merci

    DeeTOX.

  2. #2
    Membre actif Avatar de declencher
    Inscrit en
    mai 2003
    Messages
    437
    Détails du profil
    Informations forums :
    Inscription : mai 2003
    Messages : 437
    Points : 251
    Points
    251
    Par défaut
    Et comment fais tu pour afficher ces dizaines de composants ? Je pense qu'il faut que tu revois la conception de ton soft, car tu n'as pas choisi la solution la plus adaptée.

  3. #3
    Membre averti
    Avatar de Hauwke
    Inscrit en
    septembre 2005
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : septembre 2005
    Messages : 329
    Points : 393
    Points
    393
    Par défaut
    Bonjour,
    +1 avec Declencher... Si ton soft se contente d'afficher des éléments que je suppose provenir de recherche sur le net, alors je crois que tu es un peu "à coté de la plaque" ;-)
    Les pistes que tu pourrais explorer:
    • Dérivation d'un composant TDBCtlgrid (adjonction d'un TDBImage) et utilisation d'une base de donnée.
      Création d'une frame et instanciation multiple (attention au niveau des ressources avec cette solution).
      Création d'un "super composant" et utilisation de TobjectDataSet (voir faq et tutos).

    Il y en a encore 1000 autres...
    Chaque cheminement aura ses avantages et ses inconvénients... A toi de voir, tu n'en dis pas assez sur ton soft pour nous permettre d'être plus précis.
    Cordialement,
    Hauwke

  4. #4
    Membre à l'essai

    Inscrit en
    août 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : août 2004
    Messages : 33
    Points : 22
    Points
    22
    Par défaut
    Plus de précision :

    Il s'agit d'un programme qui exploite google desktop, il télécharge donc une page xml avec plein d'informations, ensuite, j'ai un code qui me permet de "sortir" les infos que m'interesse de ce xml ( nom de fichier, chemin, image... ) et au final, j'ai fait une fonction qui affiche la totalité des résultats. Pour chaque résultat, j'ai :

    un panel
    une image icone
    plusieurs labels pour les infos ( qui contiennent des évènements )
    un apercu du fichier ( dans un timage )

    et celà beaucoup beaucoup de fois !!!

    Moi ce que je veux, c'est que ca aille plus vite parce que là,c'est ultra lent... Je ne m'y connais pas terrible en affichage, et le problème,c'est que je vois pas comment, si ce n'est pas cette méthode, créer une masse de composants "réactifs" donc avec évènements...

    Je suis sans doute "a côté de la plaque" oui... Mais je demande qu'à savoir comment faire ! lol

    Si vous avez des idées... Je vais déjà voir du côté de ce que vous me dites...

    DeeTOX.

  5. #5
    Membre actif Avatar de declencher
    Inscrit en
    mai 2003
    Messages
    437
    Détails du profil
    Informations forums :
    Inscription : mai 2003
    Messages : 437
    Points : 251
    Points
    251
    Par défaut
    Par exemple :

    Une seule instance de chaque composant sur ta fiche, et avec des boutons "voir suivant" et "voir précédent", tu affiches l'éléments suivant ou l'éléments précédent, un peu comme dans le parcours des résultats renvoyé par une requête sql. ça devrait fonctionner pour ton besoin ça non ?

    si le besoin c'est de voir en un seul coup d'oeil toutes les informations, regardes du côté du TStringGrid pour afficher le texte ou des TDrawGrid pour des affichages plus complexes.

  6. #6
    Membre averti
    Avatar de Hauwke
    Inscrit en
    septembre 2005
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : septembre 2005
    Messages : 329
    Points : 393
    Points
    393
    Par défaut
    Bonjour,
    1 table, 1 composant grille de la jvcl (qui gére les champs image) et un thread.
    Au lancement de l'appli:
    • Le thread va commencer à remplir la table (peu importe le format de la table pourvu qu'elle gére les images).
      Au bout de 25 ou 50 enregistrements (une possibilité de paramétrage ici te permettra d'offrir la souplesse à ton utilisateur), le thread envoi une requête en lecture seule sur la table ce qui va afficher les premières infos sur la grille de donnée (A ce niveau d'infos, l'affichage sera quasi instantané).
      Pendant la consultation des premières infos par l'utilisateur le thread va continuer à remplir la table.

    Cette solution n'est, certes, pas la plus "propre" mais elle te présente l'avantage du "temps masqué". En effet même si ton appli affichait toutes les infos "d'un coup" l'utilisateur serait dans l'impossibilité d'en prendre connaissance en une fois compte tenu des limitations des outils "humains" de perception. Pour le rafraichissement de ton affichage pense aux bookmarks sur le dernier enregistrement lu par l'utilisateur ou la dernière ligne active de la grille afin que la requête ne recommence pas au début.
    Tu trouveras dans la Faq, les tutots et les sources tout ce dont tu as besoin pour mettre en oeuvre trés facilement. La réactivité sera obtenu par les événements sur la grille qui permet de faire pratiquement n'importe quoi en récupérant le champ sélectionné par l'utilisateur...
    Enfin, n'oublie pas une chose:
    Lorsque un moteur de recherche nous dit "il y a 115 0000000" de réponses à votre recherche" il n'a fait que réupérer les entêtes des pages (il a créé un tableau de pointeur d'adresse) et c'est seulement lorsque tu veux afficher la page qu'il récupére "réellement" les infos ;-)
    Bonne prog
    Cordialement,
    Hauwke

  7. #7
    Membre à l'essai

    Inscrit en
    août 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : août 2004
    Messages : 33
    Points : 22
    Points
    22
    Par défaut ok ! J'vais ca me plait ! ;)
    Vos idées me plaisent bien... J'ai jamais mis le nez dans le thread et j'avoue que je reculais l'échéance mais là, j'vais m'y mettre : je trouve ca hyper interessant !

    Merci beaucoup ! Je vais voir ca !

    DeeTOX.

Discussions similaires

  1. Comment créer un nouveau composant visuel ?
    Par souadmaa dans le forum Débuter
    Réponses: 1
    Dernier message: 22/10/2007, 13h57
  2. [VB.Net] Comment créer dynamiquement un contrôle bouton ?
    Par robert.michel9 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 19/01/2006, 14h49
  3. Comment créer dynamiquement un alias BDE pour Access ?
    Par colorid dans le forum Bases de données
    Réponses: 2
    Dernier message: 25/10/2005, 15h20
  4. [Hibernate] Comment créer dynamiquement un fetching plan
    Par mauvais_karma dans le forum Hibernate
    Réponses: 15
    Dernier message: 08/08/2005, 10h40

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