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

Delphi Discussion :

[StringGrid] problème d'affichage


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Par défaut [StringGrid] problème d'affichage
    Bonjour monde !
    Je dispose d'un StringGrid. Je redéfinis la méthode onDrawCell afin de la remplir avec les données que je dois afficher et de le colorier une ligne sur deux (le problème ne vient pas de là). Je remplis bien ma grille et je colorie bien une ligne sur deux mais le problème c'est qu'il y a un horrible clignotement et j'ai bien l'impression que ma grille est constemment redessinée (12 cases seulement).

    Ma question est la suivante : Existe-t-il une fonction qui interdit à ma grille de se redessiner ?

    merci d'avance

  2. #2
    Membre émérite Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Par défaut
    Ça n'empêche pas de redessiner, mais ça corrige beaucoup de problèmes de clignotements :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaGrille.DoubleBuffered := true;

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Par défaut
    merci SlimJoe mais j'avais déjà mis la grille en double buffered. D'autres idées ?

  4. #4
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Par défaut
    Peux tu nous en dire un peu plus sur les propriétés de la StringGrid et sur ton code pour redessiner (onDrawCell).

    Merci.

    D'après un p'tit test perso, sans modifier les propriétés de la StringGrid et en mettant trois lignes de code pour redessiner les cases => aucun effet de "clignotement" !

  5. #5
    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,

    Peut-être qu'il n'y a dans le ondrawcell aucune modification de propriété des cellules ou de la grid.

  6. #6
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Bonsoir,

    Comme d'habitude, je pense que qq lignes de code pourraient permettre a ceux qui peuvent t'aider d'y voir plus clair...

    @ +

  7. #7
    Membre éclairé
    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
    Par défaut
    Salut
    Ton code est-il bien optimisé ?
    L'événement ondrawcell se produit à chaque fois qu'une cellule est redessinée...
    Une grille de 12 cases = l'événement ondrawcell appelé 12 fois !!!
    Je dirais aussi montre nous ton code

  8. #8
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Par défaut
    Bonjour,
    voici mon code (je doute que vous puissiez y décoder grand chose):
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    procedure TfmMain.sgTravelsListDrawCell(Sender: TObject; ACol,
      ARow: Integer; Rect: TRect; State: TGridDrawState);
    var i, j, nb_rows, som : Integer;
        flag : Boolean;
    begin
      // on règle le nombre de lignes
      nb_rows := 0;
      for i := 0 to Length(FFilteredTravels) do
        nb_rows := nb_rows + Length(FFilteredTravels[i].segments);
      if (nb_rows + 1 < paList.Height / 18) then
        sgTravelsList.RowCount := round(paList.Height / 18)
      else
        sgTravelsList.RowCount := nb_rows + 1;
      printf(IntToStr(nb_rows));
      // on règle le nombre de colonnes
      sgTravelsList.ColCount := 4;
      sgTravelsList.ColWidths[0] := 18;
      som := 19;
      j := sgTravelsList.ColCount;
      for i := 1 to sgTravelsList.ColCount - 2 do
      begin
        sgTravelsList.ColWidths[i] := 180;
        som := som + 180 + 1;
      end;
      if paList.Width - som > 0 then
        sgTravelsList.ColWidths[sgTravelsList.ColCount - 1] := paList.Width - som
      else
        sgTravelsList.ColWidths[sgTravelsList.ColCount - 1] := 0;
     
      // On remplit les lignes avec les segments
      som := 0;
      for i := 0 to Length(FFilteredTravels) - 1 do
        for j := 0 to Length(FFilteredTravels[i].segments) - 1 do
          begin
            sgTravelsList.Cells[1, som] := FFilteredTravels[i].name;
            sgTravelsList.Cells[2, som] := FFilteredTravels[i].segments[j].segmentKind;
            som := som + 1;
          end;
     
      // colorier une ligne sur deux
      if (ARow mod 2) <> 1 then
        begin
          sgTravelsList.Canvas.Brush.Color := $00F6F3EC;
          sgTravelsList.Canvas.FillRect(Rect);
        end
      else
        begin
          sgTravelsList.Canvas.Brush.Color := clWhite;
          sgTravelsList.Canvas.FillRect(Rect);
        end;
      if gdFixed in state then
        begin
          sgTravelsList.Canvas.Brush.Color := clSkyBlue;
          sgTravelsList.Canvas.FillRect(Rect);
        end;
     
    end;
    comme vous pouvez le voir je fais un gros traitement. Votre avis ?

  9. #9
    Membre éclairé
    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
    Par défaut
    Salut

    C'est bien ce que je craignais
    J'ai rapidement repéré dans ton code des modifications des propriétés de ta grille qui, pour moi, n'ont rien à y faire...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sgTravelsList.ColCount := 4;
    sgTravelsList.ColWidths[0] := 18;
    sgTravelsList.ColWidths[i] := 180;
    sgTravelsList.Cells[1, som] := FFilteredTravels[i].name;
    sgTravelsList.Cells[2, som] := FFilteredTravels[i].segments[j].segmentKind;
    Toutes ces commandes ont pour effet de redessiner toute la grille et donc d'appeler un événement ondrawcell, qui est déclenché à chaque fois que la cellule de coordonnée acol, arow est dessinée

    ..et le chien se mord le queue

    Mets ce code dans une autre procédure

  10. #10
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Par défaut
    C'est bon, c'est réglé.
    C'est moi qui aie fait mon idiot.
    Je viens de comprendre que DrawCell ça ne sert qu'à "redessiner les cellules".
    J'ai fait mon remplissage de grille dans une procédure à part et tout roule.
    Désolé tout le monde.

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

Discussions similaires

  1. [stringgrid] forcer l'affichage de la VscrollBar
    Par qi130 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 10/11/2003, 14h03
  2. Problème d'affichage avec trace
    Par WriteLN dans le forum Flash
    Réponses: 10
    Dernier message: 22/10/2003, 16h59
  3. [Kylix] problème d'affichage
    Par scalvi dans le forum EDI
    Réponses: 1
    Dernier message: 18/06/2003, 10h07
  4. Réponses: 1
    Dernier message: 06/03/2003, 11h57
  5. probléme d'affichage d'une fiche
    Par sb dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 09h43

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