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 :

[DBGrid] Changer la couleur de toutes les lignes sélectionnées


Sujet :

Composants VCL Delphi

  1. #1
    Membre confirmé
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Points : 453
    Points
    453
    Par défaut [DBGrid] Changer la couleur de toutes les lignes sélectionnées
    Bonjour !
    En consultant la FAQ, j'ai pu modifier la couleur de la ligne sélectionnée de ma DBGrid en renseignant l'évenement OnDrawColumnCell comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      //Application des couleurs à la sélection
      If  (gdSelected In State) Then
      Begin
        TDBGrid(Sender).Canvas.Brush.Color := SelectColor; //Nouvelle Propriété
        TDBGrid(Sender).Canvas.Font.Color  := SelectColorFont;
        TDBGrid(Sender).DefaultDrawColumnCell(rect,datacol,column,state);
      End;
    Hélas, lorsque la DBGrid est en option MultiSelect
    uniquement la ligne enCours (Focusée) est de la bonne couleur, toutes les autres sont de couleurs de base windows pour la sélection.
    En pas à pas on s'apperçoit que seul la ligne en cours a State = [gdSelected] et uniquement la cellule en cours [gdSelected,gdFocused]. Les autres lignes sélectionnées ou pas on leur State vide []

    Doit-on passer par une autre méthode que gdSelected in State pour parvenir à coloriser TOUTES les lignes sélectionnées en multiSelect ? J'ai bien des pistes avec SelectedRows mais j'ai peur de passer à coté de quelquechose de simple et de m'embarquer dans une cuisine inutile.

    Merci d'avance !

  2. #2
    Membre averti Avatar de Soulama
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 619
    Points : 416
    Points
    416
    Apprends la science de celui qui sait, et enseigne ta science à celui qui ignore, comme ca, tu auras appris ce que tu ignores et utilisé ce que tu sais.

  3. #3
    Membre confirmé
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Points : 453
    Points
    453
    Par défaut
    Hmmm, J'ai bien lu l'article que tu proposes, hélas, je n'ai pas compris et/ou vu de piste pouvant m'aider à résoudre mon problème.

    En effet, on peut lire :

    comment Hacker la propriété Row protected d'une DBGrid, inutile dans mon cas car je créé un composant hérité d'une DBGrid (donc j'ai accès aux propriétés protected)
    Comment déplacer l'enregistrement actif du dataset en fonction de la position de la souris. (Afin de pouvoir le coloriser avec la méthode que j'utilise)

    : Donc je ne sais toujours pas comment coloriser toutes les lignes sélectionnées en cas de multiselect

    Merci quand même Soulama

  4. #4
    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 ,
    J'ai deja fait cela dans le OnDrawCell en utilisant la zone de cellule selectionnees et determinées par la " property Selection:TGridRect ".
    Si ta cellule est dans la zone tu la paint .


    bye
    Bye et bon code...

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

  5. #5
    Membre régulier

    Profil pro
    Inscrit en
    Août 2003
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 207
    Points : 91
    Points
    91
    Par défaut Wilco
    Bonjour

    Utilise l'évênement DBGrid1DrawColumnCell et places y le code suivant :


    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.DBGrid1DrawColumnCell(Sender: TObject; 
      const Rect: TRect; DataCol: Integer; Column: TColumn; 
      State: TGridDrawState); 
    begin 
     
    If DBGrid1.SelectedRows.CurrentRowSelected 
    then Begin 
         DBGrid1.Canvas.Brush.Color := clSkyBlue;  // <- Couleur fond de ligne 
         Column.Grid.DefaultDrawColumnCell(Rect, DataCol, Column, State); 
         end; 
     
    end;

    Bon courage,
    Wilco

  6. #6
    Membre confirmé
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Points : 453
    Points
    453
    Par défaut
    Merci beaucoup Wilco ta solution fonctionne à merveille ! Je l'ai adaptée pour que la ligne focusée soit aussi colorisée et ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      If (TDBGrid(Sender).SelectedRows.CurrentRowSelected) or 
         (gdFocused in State)  or 
         (gdSelected in State) then
         (...)
    Hop et un de plus de résolu !

  7. #7
    Membre confirmé
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Points : 453
    Points
    453
    Par défaut
    En fait, avec le code que j'ai posté ci dessus, la ligne focusée se confondait avec une ligne sélectionnée. Alors qu'avec la molette ou l'ascenceur on peut focuser une ligne sans la sélectionner.

    Après petite modif, on a une grille dont les lignes sélectionnées sont colorisée et on empêche Windows de coloriser la ligne focusée. (On ne voit donc que le cadre de focalisation et en dessous, blanc pour une ligne non sélectionnée, couleur pour une ligne sélectionnée)

    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
    procedure TxxDBGrid.xxDrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    begin
      //Application des couleurs à la sélection
      If (TDBGrid(Sender).SelectedRows.CurrentRowSelected) then 
      begin
        TDBGrid(Sender).Canvas.Brush.Color := SelectColor; //Nouvelle Propriété
        TDBGrid(Sender).Canvas.Font.Color  := SelectColorFont;
      end
      else
      begin
        TDBGrid(Sender).Canvas.Brush.Color := clwhite; //Pour empêcher la couleur Windows
        TDBGrid(Sender).Canvas.Font.Color  := clBlack;
      end;
        TDBGrid(Sender).DefaultDrawColumnCell(rect,datacol,column,state);
    end;

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

Discussions similaires

  1. [VI-2010] Changer couleur de toutes les shapes et sous-shapes vert
    Par heinquoi dans le forum Visio
    Réponses: 0
    Dernier message: 02/07/2013, 15h27
  2. Réponses: 3
    Dernier message: 29/05/2013, 01h45
  3. tableau : changer la couleur de toute une ligne
    Par Emcy dans le forum Mise en page CSS
    Réponses: 11
    Dernier message: 21/08/2008, 09h37
  4. [scrollbar] Changer la couleur de toutes les scrollbars
    Par Manopower dans le forum Composants VCL
    Réponses: 2
    Dernier message: 21/12/2005, 10h54
  5. Réponses: 4
    Dernier message: 11/10/2005, 15h03

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