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 :

Changement de couleur d'une ligne d'un stringgrid/D7 perso


Sujet :

Composants VCL Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 187
    Points : 69
    Points
    69
    Par défaut Changement de couleur d'une ligne d'un stringgrid/D7 perso
    Bonjour,

    Je cherche à changer la couleur d'1 ligne d'1 stringgrid aprés avoir au préalable selectionné la ligne concernée et clické sur un bouton.

    Je pense qu'il faut utiliser l'évènement OnDrawCell, mais je n'arrive pas à le mettre en application.

    Merci d'avance.

    Jer

  2. #2
    Membre habitué
    Avatar de Leobaillard
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2004
    Messages
    313
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 313
    Points : 171
    Points
    171
    Par défaut
    Déjà il faut que le mode OwnerDraw soit activé et que tu utilise le Canvas, je pense que c'est une piste, mais je peux pas plus t'aider...:S J'ai utilisé quelque chose comme ça pour une ListBox. Mais si la procédure t'intéresse, je te la donne. Va voir ici : http://www.developpez.net/forums/viewtopic.php?t=437169
    /// ( : Léo : ) \\\
    ---C'est parce que la vitesse de la lumière est supérieure à celle du son, que certains paraissent brillants avant d'avoir l'air con---
    http://leobaillard.org (Hébergement gratuit, prog, forums, et autres)

    -------------------------

    L'orbe du temps (Zelda like 2D en Delphi) : Le Site

  3. #3
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    salut

    Pour pouvoir utiliser l'événement DrawCell, tu dois préalablement mettre la propriété DefaultDrawing à False. Cependant, ça t'obligeras à gérer tout ce qui doit être dessiné y compris le texte.

  4. #4
    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 jer64

    L'événement ondrawcell est effectivement celui que tu dois gérer
    En n'oubliant pas qu'il se déclenche à chaque fois qu'une cellule est redessinée...
    Si ta grid comporte 10 colonnes et 20 lignes, cet événement sera appelé 10x20=200 fois !
    A toi de tester à l'aide des propriétés acol et arow si c'est bien la cellule sur laquelle tu veux intervenir qui est en train d'être redessinée...
    Inutile d'exécuter 200 fois le même code
    Si tu veux forcer la mise à jour de l'affichage, utilise la méthode repaint

    Bonne prog
    Choisir, c'est renoncer...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 187
    Points : 69
    Points
    69
    Par défaut
    Effectivement avec repaint cela fonctionne mais lorsque je change la couleur d'une cellule je ne vois plus le texte qui était dans la cellule au préalable et c'est plutot la couleur des caractéres se trouvant dans les cellules d'une ligne selectionnée d'un striggrid que je voudrais modifier.

    Merci d'avance.

  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
    Pour modifier la couleur du texte d'une cellule, si c'est bien ce que tu veux faire, utilise les méthodes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaStringGrid.Canvas.font.color
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaStringGrid.Canvas.TextOut
    Si tu utilises la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaStringGrid.Canvas.Fillrect
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaStringGrid.Canvas.Polygon
    c'est normal que le contenu de la cellule disparaisse, puisque tu demandes son remplissage (avec la couleur de brush pour polygon et pen pour fillrect - je crois, à vérifier dans l'aide)
    Bonne prog
    Choisir, c'est renoncer...

  7. #7
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Tout à fait. Tu dois réécrire avec Canvas.Textout...

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 187
    Points : 69
    Points
    69
    Par défaut
    J'utilise la méthode avec fillrect, mais je ne sais pas comment refaire apparaître le contenu de mes cellules et je voudrais que l'instruction porte sur une ligne que je selectionne avant.

    Merci d'avance.

  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
    Utilise les méthodes fillrect et textout, dans cet ordre
    Le paramètre texte de la méthode textout peut être la propriété cells[acol,arow], acol et arow représentant les coordonnées de la cellule cliquée
    Bonne nuit 8)
    et bonne prog
    Choisir, c'est renoncer...

  10. #10
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    744
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 744
    Points : 500
    Points
    500
    Par défaut
    salut ,
    un tit 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
     
    procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    begin
        with StringGrid1.Canvas do
        begin
            if Arow=0 then brush.color:=clred;
            if Arow=1 then brush.color:=cllime;
            if Arow=2 then brush.color:=clblue;
            fillrect(rect);
            brush.Style:=BsClear;
            textout(rect.left+2,rect.top+2,StringGrid1.cells[Acol,Arow])
        end;
    end;
    bye.
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  11. #11
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut
    Pourquoi ne pas regarder dans la FAQ ?
    http://delphi.developpez.com/faq/?pa...leurstringgrid

    Une adaptation serait d'avoir une variable de ta fiche qui te permet de savoir si oui ou non il faut colorier la ligne en cours, cà donne ceci (non testé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    begin
      With Sender As TStringGrid Do With Canvas Do
      Begin
        FillRect(Rect);
        If gdSelected and PeutColorier In State //PeutColorier est un booléen
          Then Font.Color:=clWhite
          Else Font.Color:=clBlack;
        { Dessin du texte }
        TextOut(Rect.Left,Rect.Top,Cells[ACol,ARow]);
      End;
    end;
    sur le clic du bouton tu peux avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PeutColorier := not PeutColorier
    et tu initialises PeutColorier à False par exemple....

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 187
    Points : 69
    Points
    69
    Par défaut
    Bonjour,

    Je vous remercie pour votre aide précieuse, concernant les caractéres cela marche, mais je n'arrive pas à appliquer mon instruction sur une ligne selectionnée au préalable, sachant que mon instruction doit être permanente sauf instruction contraire.

    Voici mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    for i:=1 to stringgrid1.Row-1 do
     
    if arow in [i] then
     begin
     
        stringgrid1.canvas.brush.color := clred;     
        stringgrid1.canvas.fillrect (rect);       
       stringgrid1.canvas.TextOut(Rect.Left,Rect.Top,stringgrid1.Cells[ACol,ARow]);
     
    end;
    Je ne fais que colorer les lignes avant ma sélection.

    Merci d'avance.

    Jer

  13. #13
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    744
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 744
    Points : 500
    Points
    500
    Par défaut
    salut ,
    Les deux exemples decris ci-dessus doivent resoudre ton probleme.
    (Ainsi que le liens de la Fac que t'a indiqué Giovanny Temgoua).
    ils permettent tout les deux de changer la couleur de une ou plusieurs lignes en fonction d'un etat de la ligne.

    Ou se trouve ton bout de procedure ? dans le OndrawCell ? ...

    Explique nous en détail ce que tu veux faire , peut etre y a t il une subtilité que j'ai mal compris ton soucis .

    bye
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 187
    Points : 69
    Points
    69
    Par défaut
    Bonjour,

    Ma procédure se trouve dans ondrawcell.

    En fait je veux selectionner une ligne de mon stringgrid, puis clicker sur un bouton pour changer la couleur de cette ligne.

    Pour le bouton j'utilise 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
    17
     
     
    procedure TFlistfact.Button3Click(Sender: TObject);
    Begin
     
    if (stringgrid1.Selection.Left>=stringgrid1.FixedCols) and (stringgrid1.Selection.Right>(stringgrid1.ColCount-1)) then
    begin
    if stringgrid1.Row > 0 then
    begin
    p:=1;
    stringgrid1.Repaint;
     
     
    end;
    end;
     
    end;
    p étant un integer déclarer au départ et initialiser à 0.

    Ensuite je place mon code dans ma procédure ondrawcell mais là c'est faut:

    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
    18
    19
     
     
    if p=1 then
     
    begin
     
     
    for i:=1 to stringgrid1.Row-1 do
     
    if arow in [i] then
     begin
     
        stringgrid1.canvas.brush.color := clred;  
        stringgrid1.canvas.fillrect (rect);  
        stringgrid1.canvas.TextOut(Rect.Left,Rect.Top,stringgrid1.Cells[ACol,ARow]);
     
    end;
     
    end;
    Voilà, si quelequ'un peut m'aider???

    Merci d'avance.

    Jer.

  15. #15
    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 jer64
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (stringgrid1.Selection.Left>=stringgrid1.FixedCols) and (stringgrid1.Selection.Right>(stringgrid1.ColCount-1)) then
    begin
    A mon avis, la condition
    stringgrid1.Selection.Right>(stringgrid1.ColCount-1)
    n'est jamais vraie puisque Selection.Right prend au maximum la valeur ColCount-1

    Et oui...
    Dans une grille à 10 colonnes on a :
    colcount=10
    des colonnes "indiciées" 0 à 9
    Donc la cellule la plus à droite d'une sélection ne peut pas être 10, mais au maximum 9
    A la sortie de ta procedure TFlistfact.Button3Click, p est toujours nul

    Je ne sais pas si c'est la le pb

    Bonne prog
    Choisir, c'est renoncer...

  16. #16
    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
    Re-salut

    Toujours selon moi, la condition
    if (stringgrid1.Selection.Left>=stringgrid1.FixedCols)
    est toujours vraie puisqu'il est impossible de sélectionner une colonne "fixed" et donc selection.left ne peut jamais être inférieure à la propriété fixedcols
    Dans 1 grille qui comporte 3 colonnes fixes on a :
    fixedcols=3 (colonnes 0,1 et 2)
    selection left=3 ou 4 ou 5...

    Bonne prog
    Choisir, c'est renoncer...

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 187
    Points : 69
    Points
    69
    Par défaut
    non, non, je n'ai aucun problême sur cette intruction, p est une variable qui me permet de vérifier si la condition est vrai pour lancer mon évènement ondrawcell.

  18. #18
    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
    As-tu bien vérifié que la ligne
    de procedure TFlistfact.Button3Click(Sender: TObject); est exécutée ?

    Si c'est le cas y'a qqchose qui m'échappe !!!!!!!!!
    Choisir, c'est renoncer...

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 187
    Points : 69
    Points
    69
    Par défaut
    Je ne veux changer la couleur que de la ligne que je selectionne.

    Selectionner une ligne : c'est OK

    Vérifier si la ligne est selectionnée: c'est ok

    Changer la couleur de la ligne selectionnée : c'est pas ok

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 187
    Points : 69
    Points
    69
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    stringgrid1.Repaint;
    Fonctionne parfaitement

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/02/2014, 01h34
  2. Changement de couleur d'une ligne dans un Memo
    Par andreditdd dans le forum Composants VCL
    Réponses: 8
    Dernier message: 19/08/2008, 13h47
  3. [DataGridView] Bug dans le changement de couleur d'une ligne
    Par AsPrO dans le forum Windows Forms
    Réponses: 8
    Dernier message: 22/07/2008, 23h38
  4. Réponses: 9
    Dernier message: 12/08/2002, 07h38
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23

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