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

Composants VCL Delphi Discussion :

TStringGrid: comment sélectionner les cellules à dessiner?


Sujet :

Composants VCL Delphi

  1. #1
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut TStringGrid: comment sélectionner les cellules à dessiner?
    Bonjour à tou(te)s

    Dans une stringgrid, je mets à jour les cellules par des méthodes fillrect, textout...
    Et on aperçoit des disgracieux balayages vidéo que je voudrais supprimer.
    Une méthode exit après test sur les valeurs acol et arow de la procédure drawcell ne semble pas opérer, on dirait que toutes les cellules sont toujours redessinées
    Comment éviter des balayages vidéo?
    Si quelqu'un a une soluce...

    Merci

  2. #2
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    Salut

    Ton problème vient-il du redessin de ta stringgrid ?

    Evite de la redessiner complètement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    StringGrid1.Invalidate:
    et travaille avec la méthode CellRect(ACol,ARow:Longint):TRect et la procedure InvalidateRect de Windows.

    Ainsi tu limiteras le redessin à la portion suffisante de ta grille.

    J'espère que c'est la bonne piste.

    e-ric

  3. #3
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut
    Salut e-ric
    En fait, j'avais choisi de mettre à jour ma stringgrid dans la procédure ondrawcell, faute d'avoir trouvé où le faire ailleurs
    Si j'ai bien compris (aide Delphi 6)
    Invalidate informe un contrôle que la totalité de sa surface doit être redessinée. L'appel de la méthode Invalidate empêche le scintillement dû à une série de nouveaux dessins partiels. Les performances ne sont pas dégradées par plusieurs appels d'Invalidate avant que le contrôle ne soit effectivement redessiné.
    je dois écrire mes méthodes fillrect, textout... dans une autre procédure (hors ondrawcell) et ensuite lancer un grid.invalidate pour forcer le dessin ?

  4. #4
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    par hasar tu as mis defautdraw a false?

  5. #5
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    STOP !!!!

    Le gestionnaire OnDrawCell a pour but la personnalisation du dessin de la grille. C'est exactement là que tu dois placer ton code pour personnaliser le dessinb de tes cellules. T'as pas le choix alors pas touche !

    Par contre, Invalidate va forcer la grille à se redessiner et celle-ci va déclencher, s'il est défini l'événement, OnDrawCell.
    La méthode que je te proposais a uniquement pour but de limiter le redessin au strict nécessaire et non pas toute la grille (c'est un petite optimisation).

    Ton problème se ramène donc à savoir quand ta grille devient invalide (au sens de Windows). Regarde les appels de méthode Refresh, Repaint...

    Rem : Ces méthodes sont des habillage du fonctionnement interne de Windows.

    e-ric

  6. #6
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut
    Salut Edam
    J'utilise en fait un composant TKStringGrid pour lequel la propriété defaultdrawing n'est pas disponible!

  7. #7
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut
    Pour e-ric:
    Je viens de remplacer toutes les méthodes grid.repaint par grid.invalidate
    Il y a toujours ces vilains "balayages vidéo"...
    Ca veut dire qu'il n'y pas d'autre solution que invalidaterect?
    Je ne vois d'ailleurs rien dans l'aide sur cette méthode...

  8. #8
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    Citation Envoyé par e-ric
    Salut

    Ton problème vient-il du redessin de ta stringgrid ?

    Evite de la redessiner complètement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    StringGrid1.Invalidate:
    et travaille avec la méthode CellRect(ACol,ARow:Longint):TRect et la procedure InvalidateRect de Windows.

    Ainsi tu limiteras le redessin à la portion suffisante de ta grille.

    J'espère que c'est la bonne piste.

    e-ric
    Je t'ai proposé d'utiliser InvalidateRect (aide SDKWindows) couplé avec la méthode TStringGrid.CellRect pas StringGrid.invalidate. Applique cette méthode une fosi que tu as modifié le contenu des cellules dont le contenu est modifié.
    Attention: ne modifie pas le contenu des cellules dans OnDrawCell parce cela risque de faire une jolie boucle infinie.

    Est-ce que ton code est de grande taille (plus d'un octet ;-)), pourrais-tu nous le montrer ?

    cdlt

    e-ric

  9. #9
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut
    Merci e-ric pour tes conseils
    Mon code est très long... je ne veux pas t'infliger une prise d'aspirine à dose massive quasi-inévitable !
    Je viens de découvrir la méthode invalidatecell dans l'aide mais qui déclenche une erreur
    [Erreur] pal1.pas(942): Identificateur non déclaré : 'invalidatecell'
    à la compilation...
    Je manque de temps...
    On verra ça + tard
    Salut !

  10. #10
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut Re: TStringGrid: comment sélectionner les cellules à dessine
    Citation Envoyé par OutOfRange
    Comment éviter des balayages vidéo?
    Essaye de mettre la propriété DoubleBuffered à True dans le OnCreate de la fiche.

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

Discussions similaires

  1. [TStringGrid] Comment sélectionner la cellule suivante ?
    Par secretman dans le forum Composants VCL
    Réponses: 2
    Dernier message: 10/05/2008, 21h33
  2. Réponses: 5
    Dernier message: 22/03/2007, 12h52
  3. [TStringGrid] Comment sélectionner une cellule ?
    Par zidenne dans le forum Composants VCL
    Réponses: 1
    Dernier message: 18/11/2005, 10h45
  4. Comment sélectionner les données non dupliquées
    Par Dnx dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/10/2005, 11h43

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