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 :

StringGrid et événement OnDrawCell


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut StringGrid et événement OnDrawCell
    Bonjour à tous,

    Je sais que cette question a été posée une multitude de fois, mais je ne comprends toujours pas trop le concept de fonctionnement ...

    Je dispose d'un StringGrid avec l'option goEditing à true.
    Lorsqu'une case de mon StringGrid possède un nombre négatif, celui-ci doit se mettre en rouge, dans le cas contraire, je garde la couleur de texte initiale.

    Mon problème (pour ne pas dire mes ...) est que je n'arrive pas à faire en sorte d'appliquer cette couleur rouge uniquement aux nombres négatifs ! Dès que j'ai un nombre négatif, il est bien en rouge, mais toutes les autres valeurs de ma StringGrid se mettent également en rouge.

    Dans un premier temps, j'ai essayé ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    begin
     if  AnsiContainsStr(StringGrid1.Cells[ACol,ARow],'-') then
     begin
       StringGrid1.Font.Color:=clRed;
       StringGrid1.Brush.Color:=clWhite;
       StringGrid1.Canvas.FillRect(Rect);
       StringGrid1.Canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[ACol,ARow]);
     end;
    end;
    Celà me met tout en rouge dès qu'un nombre négatif est trouvé.

    J'ai donc essayé celui ci :

    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
    procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    begin
     if  AnsiContainsStr(StringGrid1.Cells[ACol,ARow],'-') then
     begin
       StringGrid1.Font.Color:=clRed;
       StringGrid1.Brush.Color:=clWhite;
       StringGrid1.Canvas.FillRect(Rect);
       StringGrid1.Canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[ACol,ARow]);
     end
     else
     begin
       StringGrid1.Font.Color:=ClBlack;
       StringGrid1.Brush.Color:=clWhite;
       StringGrid1.Canvas.FillRect(Rect);
       StringGrid1.Canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[ACol,ARow]);
     end;
    end;
    Là, le StringGrid se rafraichi sans cesse sans pour autant faire ce changement de couleur! (scintillement ...)
    Quelque chose m'échappe dans la logique de programmation, mais je ne sais pas quoi

    J'espère que vous pourrez m'expliquer mon soucis et aussi me guider afin de bien (mieux) maîtriser cet événement !

    Merci à tous

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    Le 2ème code me parait OK (il faudra ultérierement traiter le "state"),

    Est-ce bien celui testé ou des instructions ont elles été enlevées dans la discussion ?

  3. #3
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Bonsoir Graffito,

    Tout le code est là, rien n'a été enlevé! Je teste juste de petit exemple afin de bien cerner le fonctionnement de l'évément.

    Je regarde du coté du State voir ce que je pourrai faire.

    Merci pour cette piste et d'avoir validé mon second code!

    [EDIT]

    Je viens de regarder dans l'aide de Delphi pour le State, et je m'apercois que celà ne correspond pas à mon soucis

    Je n'arrive pas à faire en sorte de saisir dans une cellule un nombre négatif sans pour autant que toutes les autres valeurs se mettent en rouge!

    Merci

  4. #4
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    As-tu testé eb debug si :
    - on passe parfois dans le else,
    - on passe dans let hen sans "-".

    sinon changer le test par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if pos('-',StringGrid1.Cells[ACol,ARow])>=0

  5. #5
    Membre éclairé Avatar de MelkInarian
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Par défaut
    Voici dans la FAQ un sujet de NONO40 intitulé:
    Comment centrer le texte d'un TStringGrid ?à l'aide des 3 valeurs pouvant êtres prises pas TGridDrawState il y a, je pense de quoi trouver ton bonheur.

    TGridDrawState représente l'information d'état de la cellule d'une grille qui est en cours de restitution. Il s'agit d'un ensemble comprenant 0 ou plus de :
    gdSelected La cellule est actuellement sélectionnée.
    gdFocused La cellule détient la focalisation de saisie.
    gdFixed La cellule est dans une région fixe de la grille. }
    http://www.developpez.com/delphi/faq/?page=stringgrid

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 596
    Billets dans le blog
    65
    Par défaut
    []Scintillement[] me met la puce à l'oreille
    le DefaultDrawing de ton Stringgrid est-il := false ?


    j'ai trouvé dans un vieux fichier d'aide ces codes
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    Q:  How do I make characters in a string in a TStringGrid different colors?
     
    A:
     
    unit Strgr;
     
    interface
     
    uses
      SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
      Forms, Dialogs, Grids, StdCtrls, DB;
     
    type
      TForm1 = class(TForm)
        StringGrid1: TStringGrid;
        procedure StringGrid1DrawCell(Sender: TObject; Col, Row: Longint;
          Rect: TRect; State: TGridDrawState);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.DFM}
     
    procedure TForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Longint;
      Rect: TRect; State: TGridDrawState);
    const
      CharOffset = 3; {Keep away from the edge of the rect.}
    begin
      with StringGrid1.canvas do
      begin
        font.color := clMaroon;
        textout(rect.left + CharOffset, rect.top + CharOffset, 'L');
        font.color := clNavy;
        textout(rect.left + CharOffset + TextWidth('L'), rect.top + CharOffset, 'loyd');
     
      end;
    end;
     
    end.
     
    { This code came from Lloyd's help file! }
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      i: integer;
    begin
      stringGrid1.DefaultDrawing := false;
      with StringGrid1 do
      begin
        colCount := 26;
        RowCount := 99;
        for i := 1 to 20 do
          cells[i, 0] := chr(i + 64);
        for i := 0 to 99 do
          cells[0, i + 1] := IntToStr(i);
      end;
    end;
     
    procedure TForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Longint;
      Rect: TRect; State: TGridDrawState);
    begin
      if (stringGrid1.cells[col, row][1] = '1') and (Col = 0) then
      begin
        stringGrid1.canvas.brush.color := clMaroon;
        stringGrid1.canvas.font.color := clWhite;
      end
      else
      begin
        stringGrid1.canvas.brush.color := clWhite;
     
        stringGrid1.canvas.font.color := clMaroon;
      end;
      stringGrid1.canvas.fillRect(rect);
      stringGrid1.canvas.TextRect(Rect, Rect.Left + 3, Rect.Top + 3, StringGrid1.cells[col, row]);
    end;
     
    { This code came from Lloyd's help file! }

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

Discussions similaires

  1. [Flash Pascal] Stringgrid et événement opérationnel
    Par Archimède dans le forum Flash Pascal
    Réponses: 4
    Dernier message: 28/04/2013, 18h01
  2. [Lazarus] Tutoriel sur le StringGrid : méthode onDrawCell
    Par Jazz77 dans le forum Lazarus
    Réponses: 3
    Dernier message: 16/04/2013, 20h47
  3. Notion d'événement et OnDrawCell
    Par Simicro dans le forum Débuter
    Réponses: 12
    Dernier message: 17/08/2012, 16h25
  4. Réponses: 2
    Dernier message: 01/07/2011, 22h37
  5. StringGrid et événement SelectedCell
    Par Nzs26 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/06/2008, 11h00

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