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 :

colorer les lignes d'un stringgrid


Sujet :

Composants VCL Delphi

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 246
    Points : 62
    Points
    62
    Par défaut colorer les lignes d'un stringgrid
    bsr a tous;
    je veux colorer une ligne d'une stringgrid a chaque changement d'une cellule, j'ai mis le code ci-dessous dans l'evenement OnDrawCell mais le changement de couleur s'applique que sur la cellule active et pour que le reste soit colorer je dois les selectionnees une par une, voici le code:

    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
     
    With Sender As TStringGrid Do With Canvas Do
      Begin
        If gdFixed in State
          Then Brush.Color := clBtnFace
          Else If gdSelected In State
            Then Brush.Color := clNavy
             else if Cells[4,arow]='Non' then Brush.Color := $FFE0FF
                      else Brush.Color := $FFFFE0;
        FillRect(Rect);
         If gdSelected In State
          Then Font.Color:=clWhite
          Else Font.Color:=clBlack;
        DrawText(Canvas.Handle, PChar(Cells[ACol,ARow]), -1, Rect ,
                  DT_CENTER or DT_NOPREFIX or DT_WORDBREAK );
      End;
    Merci pour vos aides.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Ton code semble cohérent, c'est celui de la FAQ Comment avoir des lignes de couleur sur un TStringGrid ?

    Es-tu en XE2 ?
    Il y a une nouvelle gestion de thème, je sais qu'il y a des subtilités à gérer pour la transparence

    Pour les anciennes versions, cela devrait fonctionner !

    OnDrawCell se produit dès que nécessaire, ce n'est pas forcément la cellule active, c'est toute cellule devant être dessiné, par exemple, si tu passe une fenêtre par dessus la grille, au moment, ou la cellule redevient visible, cela appelle OnDrawCell
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 246
    Points : 62
    Points
    62
    Par défaut
    bjr ShaiLeTroll;
    je suis en delphi 2009, t 'as raison, si je minimise la fenetre par exemple et l'activer aprés toute la ligne prend la couleur, mais mon probleme c'est que je veux en fonction d'un click sur une cellule toute la ligne prend la couleur instantanement.

    j'ai meme appele "Refresh" aprés le changement de couleur mais sans resultat

    Merci encore.

  4. #4
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,

    Pourriez vous mieux expliciter ce que vous souhaitez obtenir, car actuellement cela ne me parait pas très clair...

    Je pourrais vous dire de regarder la propriété Options de la TStringGrid qui permet de sélectionner toute la ligne, mais je ne suis pas certain que cela réponde à votre besoin !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // à paramétrer une fois ou à paramétrer à la conception
    StringGrid1.Options := StringGrid1.Options + [goRowSelect];
    --
    Philippe.
    Philippe.

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Aaaah !
    Si c'est juste avoir toute la ligne colorée, oui goRowSelect est suffisant !
    Même pas besoin de OnDrawCell

    OnDrawCell c'est pour colorer TOUTES les cellules en fonction de la donnée ou une ligne sur deux pour faciliter la lecture !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 246
    Points : 62
    Points
    62
    Par défaut
    ton idée est bonne mais pas idéal, car, toute la ligne prend la couleur si et seulement si elle est selectionnee, mais le probleme se pose tjr si on essaie de colorer une ligne non selectionnee.

  7. #7
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par messahel Voir le message
    ton idée est bonne mais pas idéal, car, toute la ligne prend la couleur si et seulement si elle est selectionnee, mais le probleme se pose tjr si on essaie de colorer une ligne non selectionnee.
    J'avais un peu de temps à perdre et j'ai repris votre bout de code sous D7 et D2006 avec une StringGrid remplie "simplement". Je ne vois pas de problème visuellement. (cf. captures d'écran avec ou sans l'option goRowSelect)...
    Donc, je repose ma question : Pouvez vous décrire plus précisément ce que vous voulez obtenir ?
    --
    Philippe.
    Images attachées Images attachées   
    Philippe.

  8. #8
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 246
    Points : 62
    Points
    62
    Par défaut
    Voici ce que je cherche:


    si je clique sur une cellule qui contient "Non" elle devient "Oui" et la ligne prend une couleur differente

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Ok, donc au clic, tu n'as que la Cellule à changer ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Grid.Cells[4, ARow] := IfThen(Grid.Cells[4, ARow] = 'Oui', 'Non', 'Oui');
    Grid.InvalidateRow(ARow);
    InvalidateRow, va réclamer le Dessin juste de la ligne concernée, un peu moins brutal que Repaint !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  10. #10
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 246
    Points : 62
    Points
    62
    Par défaut
    Merci beaucoup ShaiLeTroll et Ph. B.
    le probleme est resolu avec Grid.Invalidate.

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Attention Invalidate et InvalidateRow, c'est différent !

    Le Premier redessine tout, le second juste la ligne !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  12. #12
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 246
    Points : 62
    Points
    62
    Par défaut
    bonsoir,
    j'ai trouvé que Invalidate et pour InvalidateRow(arow) il m'affiche cette erreur:
    E2362 Impossible d'accéder au symbole protected TCustomGrid.InvalidateRow

  13. #13
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par messahel Voir le message
    Merci beaucoup ShaiLeTroll et Ph. B.
    le probleme est resolu avec Grid.Invalidate.
    Je viens de reprendre le fil et effectivement il faut indiquer à l'application que
    le composant doit être redessiné:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TStringGrid(Sender).Invalidate;
    A rajouter dans le gestionnaire d'évènement OnClick qui change le contenu de la cellule de 'Oui' à 'Non' et vice versa...

    @ShaiLeTroll : une remarque ou une question : Sous D7 ou D2006, la méthode InvalidateRow est protected donc non appelable directement, à priori elle serait devenu publique avec des versions plus récentes de Delphi, mais lesquelles ?
    --
    Philippe.
    Philippe.

  14. #14
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    C'est toujours protected même en XE2, mais "hacker" une fonction protégée c'est l'enfance de l'art

    il est toujours possible, d'appeler Windows.InvalidateRect, l'API à la main, suffit de pomper le code de InvalidateRow et InvalidateRect
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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

Discussions similaires

  1. Coloré les lignes d'un datagridview
    Par abbd dans le forum Windows Forms
    Réponses: 14
    Dernier message: 21/02/2008, 16h37
  2. Comment colorer les lignes d'un DBGrid ?
    Par k_boy dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/11/2007, 21h54
  3. Réponses: 1
    Dernier message: 04/08/2007, 18h07
  4. [VBA-E] Colorer les lignes sous-total
    Par steps5ive dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/07/2006, 18h47

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