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

Langage Delphi Discussion :

Sélection cellules de TStringGrid


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut Sélection cellules de TStringGrid
    Windows XP et Delphi 4 standard.

    Bonjour à tous,

    Sur ma fiche j'ai 4 TStringGrid et un TButton.

    Je voulais qu'une seule ligne d'une seule TStringGrid soit séléctionnée (donc en bleu) et non une ligne de chaque TStringGrid comme cela vient normalement. Sur les aimables et compétentes indications d'un membre expert de ce forum dont j'ai oublié l'identité j'ai donc ajouté à chaque TStringGrid une procédure OnDrawCell comme indiqué ci-dessous. Ca marche impeccablement mais lorsque je clique sur le TButton le fond bleu de la cellule sélectionnée disparait et passe en blanc alors que je voudrais qu'il reste en bleu. Il me parait clair que cela est provoqué par le fait qu'en cliquant sur le TButton la TStringGrid n'est plus focalisée ce qui fait passer la couleur de fond en blanc.

    Merci d'avance à qui pourra m'aider.


    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
    20
    21
    22
     
    procedure ComptaWGestion2Fich.SgDosPrDrawCell(Sender: TObject; ACol,
      ARow: Integer; Rect: TRect; State: TGridDrawState);
    begin
      with Sender as TStringGrid do with Canvas do
      begin
        // sélection de la couleur de fond
        if SGDosPr.Focused then
          if gdFixed in State then Brush.Color :=clBtnFace
          else if gdSelected in State then Brush.Color :=clBlue
          else Brush.Color:=clWhite
        else if gdFixed in State then Brush.Color :=clBtnFace
        else Brush.Color:=clWhite;
        // Dessin du fond
        FillRect(Rect);
        // Sélection de la couleur d'écriture
        if Brush.Color=clBlue then Font.Color:=clWhite
        else Font.Color:=clBlack;
        // Dessin du texte
        TextOut(Rect.Left,Rect.Top,Cells[ACol,ARow]);
      end;
    end;

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 859
    Points : 11 307
    Points
    11 307
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Si tu ne veux plus de différence selon la focalisation, autant faire sauter le test... A essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      Brush.Color:=clWhite;
      if gdFixed in State 
      then Brush.Color:=clBtnFace
      else begin
        if gdSelected in State 
        then Brush.Color:=clBlue;
      end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 464
    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 464
    Points : 24 888
    Points
    24 888
    Par défaut
    Citation Envoyé par Stevens.Georges Voir le message
    Je voulais qu'une seule ligne d'une seule TStringGrid soit séléctionnée (donc en bleu) et non une ligne de chaque TStringGrid comme cela vient normalement.
    Tu as donc plusieurs TStringGrid ?
    Par défaut un TStringGrid ne sélectionne qu'une seule cellule et non une ligne complète
    Si tu active Options goRowSelect cela sélectionne la ligne entière

    tu as aussi goDrawFocusSelected !

    Le DBGrid propose l'option dgAlwaysShowSelection, couplé à un TClientDataSet au lieu de faire un remplissage manuel d'un TStringGrid !
    Le TListView propose HideSelection

    Le code suivant n'affichera pas la selection si la grille n'est pas focusé
    Ainsi, si tu as plusieurs grille, une seule aura un carré bleu

    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 ComptaWGestion2Fich.SgDosPrDrawCell(Sender: TObject; ACol,
      ARow: Integer; Rect: TRect; State: TGridDrawState);
    begin
      with Sender as TStringGrid do
      begin
        if not Focused then      
        begin
           // Dessin du fond
          Canvas.FillRect(Rect);
          // Sélection de la couleur d'écriture
          Canvas.Brush.Color = Color;
          Canvas.Font.Assign(Font);
          // Dessin du texte
          Canvas.TextOut(Rect.Left,Rect.Top,Cells[ACol,ARow]);
        end;
      end;
    end;
    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

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut Sélection cellules de TStringGrid
    Merci à tous deux pour vos réponses.

    Je n'ai peut-être pas été assez clair.

    Oui j'ai 4 TStringGrid et je veux que la cellule sélectionnée reste avec fond bleu lorsque je clique sur le bouton. Actuellement elle vire au blanc ; j'ai tout lieu de penser qu'en cliquant sur le bouton je défocalise le TStringGrid ce qui dans la procedure OnDrawCell associée fait apparaitre le fond en blanc. C'est précisément ce que je voudrais éviter pour laisser la cellule en bleu.

    Merci d'avance.

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 464
    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 464
    Points : 24 888
    Points
    24 888
    Par défaut
    Ce que tu décris en le comportement normal sans OnDrawCell avec goDrawFocusSelected à true dans Options !

    un autre coupable c'est if SGDosPr.Focused thenSi tu ne voulais pas ce comportement pourquoi l'avoir écrit ainsi ? ?
    Focused indique justement si l'on la Grille est focalisé ou pas

    ton code est tellement mal indenté comment veux tu t'y retrouver

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    if SGDosPr.Focused then
      if gdFixed in State then
         Brush.Color :=clBtnFace
      else
         if gdSelected in State then 
           Brush.Color :=clBlue
         else 
           Brush.Color:=clWhite
    else 
      if gdFixed in State then
        Brush.Color :=clBtnFace
      else
        Brush.Color:=clWhite; // c'est celui ci !
    Dans tes 4 TStringGrid, combien de cellule peuvent être Bleu ?
    1 seule ? voir plus bas
    1 dans chaque donc 4 ? c'est le comportement normal

    Pour n'avoir qu'une seule cellule, comme une selection exclusive !

    Focused n'effectivement pas la bonne solution, il te faudrait une variable qui mémorise quelle est la TStringGrid contient la seule cellule, c'est lors du OnEnter que tu changes cette variable, lorsque tu cliqueras sur le bouton, cela conservera la dernière grille cliquée, mais ce n'est pas très élégant !

    tu peux aussi faire que si l'on modifie Selection dans une TStringGrid, cela affecte -1,-1 dans les 3 autres, cela fera comme si il n'y avait rien de sélectionner

    Met goDrawFocusSelected à true dans Options
    Affecte l’évènement StringGridAllSelectCell aux 4 grilles

    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
    20
    21
    22
    23
    24
     
    procedure ExclusiveSelection(SelectedGrid: TStringGrid; OtherGrid: TStringGrid);
    var
      myRect: TGridRect;
    begin
      if (SelectedGrid <> OtherGrid) then
      begin    
        myRect.Left := -1;
        myRect.Top := -1;
        myRect.Right := -1;
        myRect.Bottom := -1;
        OtherGrid->Selection := myRect;  
      end;
    end;
     
    procedure  TVCLManipForm.StringGridAllSelectCell(Sender: TObject; ACol, ARow: Longint;
        var CanSelect: Boolean)
    begin
      ExclusiveSelection(Sender as TStringGrid, StringGrid1);
      ExclusiveSelection(Sender as TStringGrid, StringGrid2);
      ExclusiveSelection(Sender as TStringGrid, StringGrid4);
      ExclusiveSelection(Sender as TStringGrid, StringGrid3);
    end;
    //---------------------------------------------------------------------------
    Lors du FormCreate, il faut appeler aussi ExclusiveSelection pour initialiser Selection à -1 sur les 4 StringGrid
    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
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut Re Cellules de TStringGrid
    Merci ShaiLeTroll pour tes indications avec lesquelles j'espère arriver à résoudre mon problème.

    Deux remarques:

    1/ Mon code n'est en fait pas le mien mais très exactement celui que m'avait communiqué un membre expert du forum dont, comme je l'ai écrit plus haut, je n'ai pas conservé l'identité.

    2/ En effet je veux avoir une seule cellule sélectionnée dans une seule TStringGrid, ce qui diffère en effet du comportement normal.

    Merci encore

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 464
    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 464
    Points : 24 888
    Points
    24 888
    Par défaut
    Le code fourni fait donc exactement ce que tu veux
    Je l'ai testé en C++Builder, je te l'ai traduit en Delphi, je pense pas avoir fait de coquilles
    4 TStringGrid, une seule ayant la selection (après le premier clic dans l'une d'elle)
    StringGridAllSelectCell est le gestionnaire commun de OnSelectCell des 4 StringGrid !

    Pense à mettre goDrawFocusSelected dans Options
    Évidemment retire le OnDrawCell !

    Citation Envoyé par Stevens.Georges Voir le message
    1/ Mon code n'est en fait pas le mien ... je n'ai pas conservé l'identité.
    Tu devrais mettre un lien vers le sujet d'origine lorsque tu récupères des sources !
    Personnellement, c'est ce que je fais, quand j'ai eu un soucis, je conserve dans le code une référence vers l'article m'ayant dépanné !
    Parfois, je télécharge même la discussion au complet pour conserver la démarche ayant abouti à telle ou telle solution
    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

  8. #8
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 859
    Points : 11 307
    Points
    11 307
    Billets dans le blog
    6
    Par défaut
    Personnellement, c'est ce que je fais, quand j'ai eu un soucis, je conserve dans le code une référence vers l'article m'ayant dépanné !
    Parfois, je télécharge même la discussion au complet pour conserver la démarche ayant abouti à telle ou telle solution
    En fait de Troll, Shaï est un Wiki à lui tout seul

    Seule traduction restante, pê :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    OtherGrid->Selection := myRect;
    // en 
    OtherGrid.Selection := myRect;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut Re TStringGrid cellule
    Un grand merci à tous les deux.

    N'étant pas d'une grande compétence votre aide m'est précieuse.

    A noter qu'apparemment StringGridAllSelectCell n'existe pas avec Delphi 4, mais je pense quand même arriver à me débrouiller.

    Merci encore.

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 464
    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 464
    Points : 24 888
    Points
    24 888
    Par défaut
    Citation Envoyé par Stevens.Georges Voir le message
    A noter qu'apparemment StringGridAllSelectCell n'existe pas avec Delphi 4, mais je pense quand même arriver à me débrouiller.



    StringGridAllSelectCell c'est un gestionnaire d'évènement, tu n'as pas vu que c'était le nom de la fonction fournie dans ma réponse
    Il te faut l'affecter aux OnSelectCell des 4 StringGrids !
    Au lieu d'avoir StringGrid1SelectCell, StringGrid2SelectCell ... je mets All pour indiquer qu'il est partagé !

    Faut que tu prennes un peu de repos !

    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. Sélection cellule Excel
    Par qltmi dans le forum VBA Access
    Réponses: 2
    Dernier message: 24/02/2008, 11h35
  2. Sélection cellule word
    Par jepac dans le forum VBA Word
    Réponses: 2
    Dernier message: 18/01/2008, 22h56
  3. sélection cellules en auto dans pivot table
    Par ulysseus13 dans le forum Excel
    Réponses: 1
    Dernier message: 13/06/2007, 21h20
  4. Sélection Cellule StringGrid
    Par Vodkha dans le forum Delphi
    Réponses: 3
    Dernier message: 04/09/2006, 14h25
  5. [Delphi7] Multi-sélection dans une TStringGrid
    Par dino_xrc dans le forum Delphi
    Réponses: 1
    Dernier message: 30/08/2006, 10h42

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