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

Lazarus Pascal Discussion :

[0.9.26.2] StringGrid : Explication comportement [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut [0.9.26.2] StringGrid : Explication comportement
    Bonjour,

    Je me bats toujours avec les StringGrids de Lazarus.
    J'utilise l'IDE pour construire les colonnes de StringGrid1.

    1er code : RAS


    2ème code : Je déclare dans les évènements de la table un OnDrawCell "vide"

    Et là, les titres des colonnes n'apparaissent plus. Pourquoi ?

    StringGrid1 --> Option : DefaultDrawing := true;
    En false, avec un code identique, la table est vide (et grisée si OnDrawcell "déclaré") mais là aussi dès que OnDrawCell est déclaré les titres sont effacés.
    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
    LCLVersion = '0.9.26.2'
      object StringGrid1: TStringGrid
        Left = 16
        Height = 100
        Top = 160
        Width = 472
        ColCount = 7
        Columns = <    
          item
            Title.Caption = 'Col1'
          end    
          item
            Title.Caption = 'Col2'
          end    
          item
            Title.Caption = 'Col3'
          end    
          item
            Title.Caption = 'Col4'
          end    
          item
            Alignment = taCenter
            Title.Alignment = taCenter
            Title.Caption = 'Sel'
          end    
          item
            Title.Caption = 'Tri'
          end>
        Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goRowSelect, goAlwaysShowEditor, goSmoothScroll]
        TabOrder = 0
        OnDrawCell = StringGrid1DrawCell
      end
    Merci d'avance. Gilles
    Dernière modification par Invité ; 06/08/2009 à 11h39.

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 466
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    Tu essaies de faire quoi ? Si tu déclares une procédure pour dessiner tes cellules mais que cette procédure ne fait rien, c'est normal que rien ne s'affiche

  3. #3
    Membre émérite
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Par défaut
    Re RE

    C'est un peu normal Gilles

    La procédure que tu a vidé gère les cellules de la grilles et est appelé en permanence lors de chaque repaint du composant. A l'initialisation de ta table ton code passe pour tes cellules interne mais comme tu a viré le inherited ! le reste du code n'est pas exécuté

    @+

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Merci pour vos réponses... et je suis désolé de contester "la normalité" :

    Pourquoi est-ce que les cellules Cells[aCol,aRow] sont correctement affichées quand aCol<>0 et pas celles pour lesquelles acol=0 (cad gsFixed in state puisque FixedRows:=1; ). D'autant qu'en réalité, c'est le Columns[x].title.caption qui est effacé par le OnDrawcell... si on se réfère au seul endroit où je déclare les titres des colonnes dans l'IDE. On ne parle pas de Cells[x,0]... (cf exemple code ci-dessous).

    D'autre part, j'étais persuadé qu'un OnDrawCell "vide" n'efface rien... puisqu'elle ne fait rien ! Avec le code suivant qui définit les colonnes de la stringgrid non par l'IDE mais par programmation, cela fonctionne correctement avec onDrawCell "vide"


    Description de stringGrid1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     LCLVersion = '0.9.26.2'
      object StringGrid1: TStringGrid
        Left = 16
        Height = 100
        Top = 160
        Width = 472
        ColCount = 7
        Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goRowSelect, goAlwaysShowEditor, goSmoothScroll]
        TabOrder = 0
        OnDrawCell = StringGrid1DrawCell
      end
    Le problème c'est qu'il y a une "différence" semble-t-il entre une StringGrid avec colonnes conçues par IDE et celles conçues par programmation.

    Je travaille actuellement sur les alignements. Avec les colonnes définies par l'IDE aucun traitement par OnDrawCell n'est nécessaire pour réaliser cela. Mais j'utilise OnDrawCell pour autre chose (simulation d'un multiselect de lignes non contiguës donc colorisation des lignes).

    Mais dans le cas où la définition des colonnes est réalisée avec l'IDE, le onDrawCell efface, à mon avis de manière inexpliquée, les titres des colonnes.

    Il existe déjà un bug connu avec la propriété Columns[x].alignment (bien pratique) qui ne fonctionne pas justement si on utilise StringGrid1.Colcount:=... Mais on peut partiellement le contourner en déclarant les colonnes par StringGrid1.Columns.Add;

    Enfin bref, il y a la théorie et la pratique... Je ne demande pas qu'on m'explique la théorie mais seulement la pratique si quelqu'un sait comment contourner ce problème. Visiblement pour les StringGrids, 2 approches conceptuelles ont été réalisées (la traditionnelle "à la programmation" et une évolution avec conception par IDE) et suivant la méthode de conception retenue, une même programmation n'aboutit pas au même résultat. L'évolution "IDE" apporte une simplification du code mais... les titres de colonnes

    Cordialement. Gilles.

    PS :@Chris37
    Citation Envoyé par chris37 Voir le message
    Re RE
    comme tu a viré le inherited...
    @+
    Pourriez-vous m'expliquer ? Je suis un peu lent en ce moment : le soleil a cogné en Normandie ces 2 derniers jours et on n'est pas habitué. Déjà le OnDrawcell vide qui efface... j'ai du mal. Mais en plus, en enlevant la déclaration des colonnes du StringGrid dans l'IDE [StringGrid1-->Columns-->x items], puis en rectifiant le ColCount (qui à la supression des colonnes est revenu à 0) et enfin en déclarant les valeurs des cells[x,0] dans le Oncreate de la form, j'ai sans doute rétabli le inherited (puisque je n'ai rien changé d'autre au code)... et que cela fonctionne. C'est vraiment merveilleux... Faire de la prose sans le savoir comme M. Jourdain...
    Dernière modification par Invité ; 06/08/2009 à 18h53.

  5. #5
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 466
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    Tu es plus ou moins obligé de faire un inherited. Cette instruction veut dire que tu appelles la méthode du même nom héritée de la classe mère, or la classe mère est fort probablement TStringGrid, donc dans le OnDrawCell de ton objet TStringGrid1, tu devrais appeler le OnDrawCell de la classe TStringGrid (dont TStringGrid1 hérite).

  6. #6
    Invité
    Invité(e)
    Par défaut
    OK.

    Si le "inherited" c'est pour le cas où DefaultDrawing = false, c'est hors sujet et je le signalais à titre anecdotique. Ce que je voulais dire c'est que dans cette configuration également, il semble que le comportement soit différent pour les titres suivant la méthode de déclaration des colonnes du StringGrid... Est-ce dans ce cas normal ? Je fais confiance à Chris37 : je dois admettre que cela me dépasse. J'ai cherché vainement une doc "utile" sur les stringgrids (cf 2 demandes précédentes de ma part sur ce forum)... notamment pour envisager de travailler avec DefaultDrawing =false; http://www.developpez.net/forums/d78...d-multiselect/

    ... mais par rapport à mon problème avec la configuration retenue (DefaultDrawing = true). Le "inherited" serait sensé apporter une explication à la différence de comportement de onDrawCell sur le titre des colonnes entre la méthode qui consiste à définir les colonnes par l'IDE et les items des Columns d'une part et celle qui consiste à définir cells[x,0] d'autre part ? Je ne le crois pas. Qu'est-ce qui permet de dire qu'il a été rompu dans cette configuration ?

    Le comportement que je décris, est-ce un bug ou un défaut de méthode de ma part ? Et dans les 2 cas, comme le contourne-t-on ?

    Comme je l'ai écrit lors de ma première demande sur le sujet, je ne connaissais pas les StringGrids à la sauce Lazarus. J'utilise presque exclusivement des dbGrids quand j'utilise celui-ci. Je commence un peu à désespérer. Sur le papier, en ce qui concerne les StringGrids, il existe des fonctions qui devraient simplifier la programmation pour les tris, les alignements (fonctions que je ne connaissais pas sous Delphi... mais je ne connais pas les dernières versions)... J'ai réglé le problème du multiselect de lignes non contiguës, le tri "multi-index" croissant et décroissant, équivalent par exemple à un tri [Age DESC+Nom ASC+Prénom ASC] par clic sur l'entête de la colonne [Ages], aussi bien sur des alpha, des entiers relatifs, des réels (ou des combinaisons des 3), la suppression de lignes (en multiselect), l'insertion avec repositionnement suivant le tri engagé, le replacement 'en aveugle' après suppression d'un bloc de lignes... bref un ensemble de traitements assez complet... pour me casser la figure sur un problème qui ne devrait pas exister... Il me restait, pour remplir mon cahier des charges, l'insertion d'images dans une colonne, la [0] en l'occurrence... à vérifier si on peut le faire sur une colonne gsFixed ou s'il faut faire une "simulation"... Cela dépendra du fonctionnement du OnDrawCell à priori... Mettre des images, cela on peut, enfin c'est que j'ai lu sur les forums mais quid de la relation avec les Cells[0,y]. Si cela se présente (compte tenu de la méthode de définition des colonnes que j'ai retenue) comme avec le titre de ces dernières...

    En résumé, pour l'instant, il me reste les incantations, la divination... à défaut d'une documentation ... et j'espère le forum...

    Cordialement. Gilles
    Dernière modification par Invité ; 06/08/2009 à 23h07.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/09/2012, 22h45
  2. Réponses: 4
    Dernier message: 28/03/2011, 14h39
  3. recherche explication sur comportement partition by
    Par boutade80 dans le forum SQL
    Réponses: 5
    Dernier message: 09/12/2009, 18h07
  4. [JFrame] Explication sur une différence de comportement
    Par jems dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 06/07/2005, 09h23
  5. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18

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