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 :

Bord de couleur pr une cellule StringGrid ou AdvStringGrid


Sujet :

Composants VCL Delphi

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 74
    Points : 48
    Points
    48
    Par défaut Bord de couleur pr une cellule StringGrid ou AdvStringGrid
    Bonjour,

    je travaille sur une AdvStringGrid (StringGrid en mieux) où chaque cellule contient une image différente.

    Je voudrais que lorsque l'on clique sur un bouton, cela mets les bords d'une cellule en couleur. Attention, l'image de la cellule doit toujours être visible mais avec des bords de couleur.

    J'ai essayé avec ondrawcell, les bords d'une cellule sont bien d'une couleur mais l'image de la cellule n'est plus présente.(peut être une histoire de premier plan, je ne sais pas)

    Merci beaucoup. J'attends vos solutions avec impatience

  2. #2
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    tu a peut être utilisé une fonction graphique qui colorie le bord ETl'interieur de ta cellule

    OU

    tu n'appelles pas la fonction native de dessin de la cellule avant d'avoir dessiné ton bord style 'DefaultDrawColumnCell(...)'

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 74
    Points : 48
    Points
    48
    Par défaut
    Très bonne remarque pour l'histoire du DefaultDraw. Cela me permet de lancer cet evenement quand je le désire.

    Mais j'ai encore un problème c'est que je lance cette evenement pour dessiner les bords d'une cellule cela dessine à la place de mon image contenue dans la cellule et pas par dessus.

    Voici ma procedure:


    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
    sgMain:TStringrid;
     
     
     
    procedure TFrmMain.sgMainDrawCell(Sender: TObject; ACol, ARow: integer;Rect: TRect; State: TGridDrawState);
    var
      format:integer;
    begin
      sgMain.Canvas.fillRect(Rect);
      format:=0;
      case (ARow) of
        0..3:
          begin
            format:=DT_CENTER;
            sgMain.canvas.font.color:=clBlue;
            sgMain.canvas.font.Style:=[fsBold];
            if (ACol=0) then begin
              sgMain.canvas.Brush.Color:=clYellow;
              sgMain.Canvas.Rectangle(Rect.Left,Rect.Top,Rect.Right,Rect.bottom);
            end;
          end;
        4:
          begin
            FORMAT:=DT_LEFT;
            sgMain.canvas.Font.color:=clRed;
            sgMain.canvas.font.Style:=[fsBold,fsItalic];
     
          end;
      end;
      DrawText(sgMain.canvas.Handle,PChar(sgMain.Cells[ACol,ARow]),-1,Rect,format);
    end;

    J'attends votre solution avec impatience, merci

    [Modération]Merci d'utiliser les balises [code], NoisetteProd[/Modération]

  4. #4
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    1. Enleve le FillRect

    2. Enleve le Rectanble

    3. remplace le DrawText par le DefaultDraw...

    ca fait pas ce que tu veux ?

    Visiblement, tu ne fait que changer le style de fonte et modifier le fond de tes cellule,

    Donc modifie tes propriétés du canvas et canvas.font avant l'appel du DefaultDraw...

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 74
    Points : 48
    Points
    48
    Par défaut
    J'ai enlevé ce que vous avez dit mais maintenant cela ne me mets plus rien.

    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
    procedure TFrmMain.sgMainDrawCell(Sender: TObject; ACol, ARow: integer;Rect: TRect; State: TGridDrawState);
    var
    format:integer;
    begin
     
    format:=0;
    case (ARow) of
    0..3:
    begin
    format:=DT_CENTER;
    sgMain.canvas.font.color:=clBlue;
    sgMain.canvas.font.Style:=[fsBold];
    if (ACol=0) then begin
    sgMain.canvas.Brush.Color:=clYellow;
     
    end;
    end;
    4:
    begin
    FORMAT:=DT_LEFT;
    sgMain.canvas.Font.color:=clRed;
    sgMain.canvas.font.Style:=[fsBold,fsItalic];
     
    end;
    end;
     
     
    end;
    Je voudrais juste avoir des cellules avec un bord de couleur mais je n'arrive qu'a avoir soit un rectangle de couleur soit rien!!

    Si vous avez une solution... Je pense qu'on y arrive

    Encore merci beaucoup

    [Modération]Merci d'utiliser les balises [code], NoisetteProd[/Modération]

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 74
    Points : 48
    Points
    48
    Par défaut
    Désolé, par la suite, j'utiliserais les balises de commentaires

  7. #7
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    et le DefaultDraw il est ou ? il faut le mettre à la fin, pour qu'il dessine ton texte, avec les attributs définis au dessus

  8. #8
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Et avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sgMain.Canvas.FrameRect(Rect);
    (Rectangle vide=Cadre=Frame in English)

    à la place de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sgMain.Canvas.Rectangle(Rect.Left,Rect.Top,Rect.Right,Rect.bottom);
    (Rectangle rempli)

    : : : : : :

  9. #9
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    760
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 760
    Points : 499
    Points
    499
    Par défaut
    salut ,

    Je crois que que comme dit WasKol FrameRect devrai aussi marcher . autrement voila une solution qui marche ..
    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
     
    procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    begin
         with StringGrid1.Canvas do
         begin
            if (Acol=1) and (Arow=1) then
            begin
            //1er rectangle de fond plein
            brush.style:=BsSolid;
            brush.Color:=clred;
            rectangle(Rect.left,Rect.Top,rect.Right,rect.Bottom);
     
            //1er rectangle vide plein
            Pen.Color:=cllime;
            brush.style:=BsClear; //<= evite de remplir ton rectangle
            rectangle(Rect.left,Rect.Top,rect.Right,rect.Bottom);
            end;
         end;
    end;
    bye

  10. #10
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 74
    Points : 48
    Points
    48
    Par défaut
    Merci beaucoup pour toutes ces réponses. La solution de petitcoucou31 est très interressante et répond à ma question.

    Mais avec ça rajoute une question:

    Au départ, l'evenement ondrawcell colorie tous les fonds de ma grille comme je l'ai programmé. Ensuite je voudrais que lorsque l'on clique sur une case cela mets les bords de la case en couleur.

    Je pensais rediriger l'evenement ondrawcell vers une procedure du type:

    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 TForm1.StringGrid1DrawCellBis(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    begin
     
     with StringGrid1.Canvas do
         begin
            if (Acol=1) and (Arow=1) then
            begin
     
            //1er rectangle vide plein
            Pen.Color:=cllime;
            brush.style:=BsClear; //<= evite de remplir ton rectangle
            rectangle(Rect.left,Rect.Top,rect.Right,rect.Bottom);
            end;
         end;
    end;
    Le truc c'est que je ne sais pas du tout quoi mettre pour state et rect ??

    Avez vous une idée pour remplir cette procedure?

    Merci beaucoup pour tout ce que vouz avez deja fais !!



    [Modération]Merci d'utiliser les balises [code], NoisetteProd[/Modération]

  11. #11
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 74
    Points : 48
    Points
    48
    Par défaut
    euh c'est surtout pour l'appel de procedure que je ne sais pas quoi mettre comme parametre

  12. #12
    Expert éminent 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
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Quand tu cliques tu as le focus et tu recupoères l'info dans le paramètre "State" du ondrawcell. A partir de là, tu peux faire une bordure spéciale.

  13. #13
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 74
    Points : 48
    Points
    48
    Par défaut
    Mon problème c'est comment reexecuter l'evenement ondrawcell, une fois qu'il a deja ete executé??? (sans utiliser repaint)


    Merci

Discussions similaires

  1. Modifier la couleur du texte dans une cellule StringGrid
    Par Jotomaticen dans le forum C++Builder
    Réponses: 3
    Dernier message: 22/09/2009, 22h42
  2. changer de couleur dans une cellule stringgrid
    Par popy1970 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 24/04/2006, 20h21
  3. Changer la couleur d'une cellule specifique d'une stringgrid
    Par jamah dans le forum Composants VCL
    Réponses: 5
    Dernier message: 26/01/2006, 17h13
  4. mettre de la couleur dans une cellule
    Par Jiraiya42 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 03/06/2005, 10h16
  5. Récupérer la couleur d'une cellule excel par Delphi
    Par teamsebracing dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 05/06/2003, 14h50

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