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 :

Changer la couleur (ou l'épaisseur) des VertLine et HorzLine toutes les 3 cellules


Sujet :

Composants VCL Delphi

  1. #1
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut Changer la couleur (ou l'épaisseur) des VertLine et HorzLine toutes les 3 cellules
    Est-ce faisable ?

    Si oui, comment ? Faut-il passer par les API ?

    Le pourquoi de la question:
    J'aimerais pouvoir changer, à intervalle régulier, la couleur des lignes de séparation des cellules afin de délimiter visuellement des plages carrées, sans pour autant être obligée de charger autant de StringGrid que de carrés. Comme pour une grille de SuDoku, par exemple.

    Si, par hasard, le sujet a déjà été discuté (en tout cas, je ne l'ai pas trouvé), merci de me l'indiquer.

    P.S. je suis modo sur les forum VB... alors m'en veuillez pas si ma question vous semble bébête.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 457
    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 457
    Points : 24 870
    Points
    24 870
    Par défaut
    Tu peux avoir une seule TStringGrid contenant les 81 cases ...
    Tu as GridLineWidth, mais il te faudrait effacer les zones moins epaisses, non, pas terrible, sinon tu peux tout simplement mettre un gestionnaire d'évènement dans le OnDrawCell, tu as tout ce qu'il faut ... tu peux dessiner manuellement (objet Canvas, Draw, ...)
    pour simuler un cadre plus épais, il suffit de tracer un trait à l'intérieur des cellules contigues
    Effectivement, les cellules n'auront finalement pas tout la même taille intérieure, mais pour un pixel ça devrait aller ... ainsi tu sais que tu dois mettre un trais vertical à droite aux cellule 3, 6, 9, un trais vertical gauche sur 1, 4, 7 ... même suite pour les trais horizontal
    Images attachées Images attachées  
    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

  3. #3
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Oui, bien sur que je me doutais bien que qu'on gère l'affichage du contenu des cellules (texte, dessins, couleur de fond et tout l'tintouin) avec cet événement. Mais lorsqu'on met dans les options goVertLine à True et idem pour goHorzLine, ça nous fais des linges toutes de la même couleur...

    Et en plus, je n'ai pas trouvé de propriété ayant un nom se rapprochant de près ou de loin à GridLineColor ou encore une quelconque propriété GridLines...

    J'avais un prof qui trouvais que l'aide de Delphi (7) était bien faite... Ça dépend de ce qu'on cherche (et de l'état de nos neurones, peut-être?).

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 457
    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 457
    Points : 24 870
    Points
    24 870
    Par défaut
    L'aide de Delphi 7 (moi là D6 sous les yeux), est très facile d'utilisation, en tout cas moins tortueuse que la MSDN ou celle des BSD ... mais l'aide suit la logique du langage aussi, il y a quelques habitudes à prendre ... et c'est souvent le plus difficile, l'IDE complet a une logique, c'est ce qui fait le charme de Delphi

    Pour la couleur des Trais, je n'ai jamais cherché à les changer, il est vrai, c'est en dur dans le code, c'est clSilver, si tu le changer, faudrait surcharger la TCustomGrid ou la TStringGrid et redéfinir la méthode Paint ...

    Ou alors, faut savoir, que tu peux redessiner, dans le OnDrawCell, tu as le rect pour savoir où est la cellule d'un point de vue canvas, mais tu peux très bien dessiné en dehors du Rect (genre Left - 1, Bottom + 1, ...), par exemple, redessiner un trait noir par dessus le trait gris, c'est vilain, mais cela fonctionne ...
    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

  5. #5
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    En fait, tu n'as pas le choix. Il faudra intercepter l'événement OnDrawCell (ou dériver la grille et surcharger la méthode DrawCell ) et dessiner les lignes de séparation entre les cellules toi même.
    Par contre, on n'est pas obligé de redessiner par dessus le tracé par défaut. La grille possède une propriété DefaultDrawing qui permet d'indiquer qu'on prend complètement en charge le dessin de la grille dans DrawCell, et que par conséquent, la grille ne doit pas dessiner les lignes de séparation elle même.

    Lorsqu'on dessine une cellule, on peut en effet déborder sur les cellules adjacentes. Cependant, on ne peut pas tout à fait faire ce que l'on veut. Déjà il faut bien se dire qu'après avoir dessiné la cellule X,Y la grille demandera aux cellules X+1, Y et X, Y+1 de se dessiner. Donc si on a débordé sur ces dernières, elles risquent à leur tour décraser le dessin qu'on a fait.

    Ensuite, il a un autre problème beaucoup plus vicieux : La grille va appeler le dessin des cellules dans le cadre d'un événement windows WM_PAINT. Cet événement est déclenché lorsqu'une partie du contrôle est invalidé.
    Le problème avec les grilles, c'est qu'il est possible de n'invalider que certaines cellules de la grille et non pas la grille complète.
    Or, lorsqu'on commence à traiter un message WM_PAINT, on doit appeler la fonction système BeginPaint (c'est géré automatiquement par la VCL dans TWinControl). Et lorsqu'on appelle BeginPaint, Windows définit automatiquement une région de clipping pour restreindre le dessin à la zone qui a été invalidée.
    Donc si on a invalidé uniquement la cellule X,Y et qu'au moment de dessiner cette cellule, on doit déborder sur la cellule X+1, Y on va sortir de la région de clipping définie par Windows. Donc notre dessin sera coupé et seule la portion à l'intérieur de la cellule X,Y sera réellement redessinée .

    Dans certains cas, ça donne un effet assez désagréable. La dernière fois que j'ai eu le problème, j'ai été obligé d'invalider la grille complète, alors que je n'avais que quelques cellules à redessiner.

  6. #6
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    @ ShaiLeTroll
    Aide Delphi: Oui, ce doit être un problème de logique vu que je manque de sommeil, ces temps-ci. Il est vrai que, ayant d'abord programmé en VB et me soyant habituée à chercher dans MSDN, les habitudes ne sont effectivement pas les mêmes. Vous savez ce qu'on dit des habitudes... qu'elles reviennent au galop... bien, c'est vrai!

    J'avais pensé aussi à ajouter une ligne en bordure de la cellule, mais ça modifie l'aspect de l'alignement (centré) du texte (un chiffre, vous l'aurez deviné). Et ceci après m'être battue (au sens figuré, bien sur) avec le fameux DrawCell (et le DefaultDrawing que j'avais oublié à True... soupir)... Je n'avais pas programmé en Delphi depuis deux ans (au moins) et mes neurones ont subi quelques formatage de table d'allocation depui... Je ne vous parle pas du MBR matinal...

    @ Franck SORIANO
    Ce que tu me dis confirme ce que je pensais, finalement. Le StringGrid (bien que issu du DrawGrid) porte bien son nom et permet d'afficher facilement des informations contenues dans un tableau (ou une table de donnée). Mais pour les fantaisies graphiques, c'est une autre histoire.

    @ tous les deux
    Merci beaucoup pour vos réponses.

    J'ai finalement opté pour une couleur de fond différente selon qu'on est dans tel groupe (impair) ou tel autre groupe (pair).

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

Discussions similaires

  1. Changer la couleur du texte dans des labels sous condition
    Par Liloo14 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 13/12/2023, 15h59
  2. Réponses: 2
    Dernier message: 23/12/2010, 15h43
  3. Changer la couleur de la barre des menus
    Par ptinavir dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 02/11/2010, 10h46
  4. [TinyMCE] Changer la couleur de la bande des titres de popup dialog dans l'éditeur tinyMCE
    Par Alexandrebox dans le forum Bibliothèques & Frameworks
    Réponses: 2
    Dernier message: 10/05/2009, 12h16
  5. Réponses: 3
    Dernier message: 10/07/2008, 01h14

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