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

Delphi Discussion :

Remplir un StringGrid avec beaucoup de données


Sujet :

Delphi

  1. #1
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 207
    Points : 161
    Points
    161
    Par défaut Remplir un StringGrid avec beaucoup de données
    Salut,

    Je rempli un StringGrid avec le contenu d'une base de donnée (cette base contient une liste de médias - mp3, avi, etc) au contenu assez important.

    1er problème: lorsque je lis ma base, le contrôle clignote. Pas trop grave, si ce n'est au niveau esthétique. J'ai bien passé le paramètre doublebuffer a true et je tente de forcer le réaffichage (méthode Repaint), ça améliore les choses mais c'est pas encore ça!

    2nd problème: lorsque je rempli mon contrôle, le gestionnaire d'événement est bloqué et ne réagit plus aux click de souris etc. Pour le moment, vu que je n'ai qu'une centaine d'enregistrements dans ma base, l'attente n'est pas trop longue. Par contre, je voudrais qu'en clickant sur un bouton, la procédure de lecture stoppe. Or, si le gestionnaire n'est pas capable de voir l'événement, je ne peut rien arrêter...

    Comment puis-je résoudre ces deux problèmes? Pour le deuxième point, je me doute qu'un passage par thread se fait sentir, mais si je peux éviter cette manip, alors autant faire simple!

    Merci

  2. #2
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 292
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 292
    Points : 1 944
    Points
    1 944
    Par défaut
    Pour le blocage, ajouter dans la boucle un Application.ProcessMessage.

    Sinon, l'affichage, je rends la stringgrid invisible le temps du remplissage, avec un message Veuillez Patienter. Ca qui me fait gagner pas mal de temps.

  3. #3
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Pour le premier problème, on peut mettre la propriété du TstringGrid à false pendant le remplissage.

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2002
    Messages : 245
    Points : 154
    Points
    154
    Par défaut
    Je crois que dans ce genre de situation, l'ideal serait d'afficher un splashscreen (indiquant un chargement de donnees) ou mieux: une forme avec un progressBar si tu connais la taille ou le nombre de donnees a charger.

  5. #5
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    1- Si tu as une version entreprise ou > tu peux utiliser un dbgrid plutot que de le remplir toi même tu gagneras pas mal de temps.
    Sinon rend le invisible et affiche le quand c'est fini de le remplir.

    2- Si tu as version entreprise ou >, tu n'as plus la question a te poser du remplissage c'est instantané :p

    Sinon, il faut que tu rajoutes un Application.procressMessages dans ta boucle de remplissage du StringGrid.

    Après il te faut une variable booléenne globale que tu passes a false quand on presse sur un bouton, ce qui entrainera l'arret de ta boucle qui vérifie a chaque passage si cette varaible est à vrai.

    Exemple :

    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
     
    var
    // En global
     
      bContinuerlaboucle : Boolean = True;
     
     
    For i := 0 to 1000000 do
    begin
      if  not bContinuerlaboucle then
        break; // ou exit selon le traitement que tu veux faire
     
    // traitement normal de remplissage
     
      Application.procressMessages;
     
    end;
    Code dans le bouton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bMContinuerlaboucle := False;

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 156
    Points : 106
    Points
    106
    Par défaut
    Une petite remarque au passage : pourquoi être négatif dans sa programmation ?

    au lieu d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if not ContinuerLaBoucle
    il faudrait écrire : et dans le clic du bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArreterLaBoucle := true
    Ca ne change rien (ou si peu) au fonctionnement, je sais, mais je préfère rester positif. La petite différence : l'expression not continuerlaboucle fait deux calculs : trouver la valeur de continuerlaboucle, puis en calculer l'opposé avec le not. Dans ma solution on n'en fait qu'un. Bon, les processeurs sont tellement rapides, qu'on n'est pas capable de chronométrer la différence.... sauf si on répète ce test un très grand nombre de fois.

  7. #7
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 207
    Points : 161
    Points
    161
    Par défaut
    Bonjour et merci à tous pour ces précieux conseils!!!

    En vrac, pour répondre aux différentes question:
    - J'utilise Delphi 6 perso, donc les dbGrid, c'est pas possible . J'espère uniquement que Borland sortira un jour une version perso en pensant à ceux qui comme moi désire manipuler les bases de données... En attendat, j'utilise les recordset avec les composants d’accès aux données de Microsoft (MDAC TYP) en m'inspirant du tutoriel de Thierry AIM (trés bien fait au passage!).

    - Pour le problème de rafraichissement, une solution consiste à insérer plusieurs lignes/cellules à la fois plutôt qu'une par une. Le problème, c'est que je ne connais pas à l'avance le nombre d'enregistrment à insérer lorsque je fais une recherche récursive de fichiers sur les disques dur. Sinon, pour la lecture de la table, on peut obtenir le nombre de ligne du recordset, donc affichage instantané (c'est déjà ça!). Pour la recherce de fichier, j'envisage de passer par un buffer de 10 données, comme ça j'espère réduire l'effet de clipping.

    - Enfin, pour le Application.ProcessMessages, c'est exactement ce que je recherchais!!! Pour arrêter ma recherche de fichier, pas d'inquiétude, j'ai déjà la solution (en fait, je migre un logiciel de LabWindows/CVI - en C - vers Delpih -> + rapide à l'exécution, plus joli graphiquement et plus puissant pour la manipulation de BDD etc...)

    Merci encore à tous!!!

  8. #8
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 207
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par Graffito
    Bonjour,

    Pour le premier problème, on peut mettre la propriété du TstringGrid à false pendant le remplissage.

    De quelle propriété parlez-vous???

  9. #9
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Oups,

    propriété Visible invisible ...

  10. #10
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 207
    Points : 161
    Points
    161
    Par défaut
    OK, merci

    Pour le moment, je désactive seulement les scrollbar de mon StringGrid, ça suffit amplement à éviter les effets visuels désagréables!

    Merci encore à tous!

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/05/2010, 11h58
  2. Réponses: 4
    Dernier message: 11/03/2010, 18h14
  3. Réponses: 15
    Dernier message: 16/06/2009, 22h05
  4. [Cookies] Fonctionnement avec beaucoup de données
    Par Arkolos dans le forum Langage
    Réponses: 2
    Dernier message: 11/05/2009, 20h30
  5. JTable avec beaucoup de données
    Par nicotine002 dans le forum Composants
    Réponses: 2
    Dernier message: 10/10/2007, 16h19

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