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

Bases de données Delphi Discussion :

DBGrid, comment dessiner dans les titres des colonnes


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de dleu
    Profil pro
    Inscrit en
    Août 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 169
    Par défaut DBGrid, comment dessiner dans les titres des colonnes
    Bonjour,

    Je reviens avec mon problème (qui n'est toujours pas résolu malgré toutes mes recherches) : Comment dessiner une flèche à côté du titre d'une colonne d'un dbGrid lorsque l'on clique sur ce titre ?

    Un stringGrid a un évènement OnDrawCell qui permet de redessiner n'importe quelle cellule de la grille, y compris les cellules fixes. Par contre, un dbGrid ne possède pas cet évènement mais un autre, OnDrawColumnCell, qui lui n'autorise que le dessin dans les cellules non fixes(les titres en sont exclus). En fait, la propriété Rect du Canvas du dbGrid voit son 0,0 au niveau de la première cellule non-fixe et donc impossible par ce moyen d'atteindre le canvas de la cellule fixe.

    Je repose donc ma question, en espérant que quelqu'un parmi vous sera inspiré : Comment fait-on pour dessiner quelque chose dans un titre d'un dbGrid ?

    Merci à vous tous de vous pencher sur ce problème.

    dleu

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 266
    Par défaut
    Salut,

    Tu peux intercepter le message windows WM_PAINT dans un descendant de TDBGrid.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure WMPAINT (var message: TMessage); message WM_PAINT;
    Dans l'implementation de la procedure, il faut que tu retrouves les coordonnées de tes cellules d'en-tete pour dessiner sur le canvas.

    @+

  3. #3
    Membre confirmé Avatar de dleu
    Profil pro
    Inscrit en
    Août 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 169
    Par défaut
    Donc, si je comprends bien, il faut que je crée ma propre grille; un descendant de dbGrid.

    Pas simple tout ça !

    Comment puis-je m'y prendre ?

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 266
    Par défaut
    Oui, tu crees un descendant de TdbGrid avec ta propre gestion du message WM_PAINT.

    Declaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TDBMonGrid = class (TDBGrid)
    private
      procedure WMPAINT (var message: TMessage); message WM_PAINT;
      procedure DrawHeader;
    public
    end;
    Implementation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TDBMonGrid.DrawHeader;
    begin
      // a toi de jouer!!!
    end;
     
    procedure TDBMonGrid.WMPAINT (var message: TMessage);
    begin
      inheriteh; // voir remarque
     
      DrawHeader;
    end;
    remarque
    si tu n'herite pas le traitement du message ton grid ne ce dessinera plus.

    @+

  5. #5
    Membre confirmé Avatar de dleu
    Profil pro
    Inscrit en
    Août 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 169
    Par défaut
    Ok, je vais voir ce que je peux faire avec ça.

    Ca reste quand même très nébuleux. Je ne vois pas très bien ce que je vais mettre à la place de '// à toi de jouer !!! '. Ca ne me donne pas plus accès au canvas des headers. De plus l'aide de Delphi n'est pas très bavarde là-dessus.

    Je vais fouiller le net.

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 266
    Par défaut
    re,

    J'utilise regulierement cette solution. Le canvas du TDBGrid couvre tout le grid.

    tu peux essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TDBMonGrid.DrawHeader;
    begin 
      Canvas.Pen.color := clred;
      Canvas.MoveTo(20,0);
      Canvas.LineTo (10,10);
    end;
    Ce code dessinne une diagonal rouge dans le header de ton grid.

    @+

  7. #7
    Membre confirmé Avatar de dleu
    Profil pro
    Inscrit en
    Août 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 169
    Par défaut
    Merci, ça c'est génial.

    Juste encore une question : Comment puis-je faire, puisque le canvas couvre tout le grid, pour récupérer les coordonnées du header de chaque colonne ?

    Merci encore pour ton aide.

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 266
    Par défaut
    tu peux utiliser :
    property RowHeights[Index: Longint]: Integer;
    et
    property RowWidth[Index: Longint]: Integer;

    ainsi : RowHeights[0] ==> hauteur de l'en-tete
    ...

    tu peux essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TmyDBGRid.DrawHeader;
    var
      ltot, i: integer;
    begin
      ltot := 0;
      Canvas.Pen.color := clred;
     
      for i := 0 to pred(ColCount) do
        begin
          Canvas.MoveTo(ltot,0);
          ltot := ltot + ColWidths [i];
          Canvas.LineTo (ltot,RowHeights [0]);
        end;
    end;
    @+

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 266
    Par défaut
    rien, j'ai posté par erreur
    @+

  10. #10
    Membre confirmé Avatar de dleu
    Profil pro
    Inscrit en
    Août 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 169
    Par défaut
    Ok

    Merci pour ton aide, je m'y attelle tout de suite.

    à+

    dleu

Discussions similaires

  1. Comment fusionner les titres des colonnes d'un Jtable?
    Par briant dans le forum Composants
    Réponses: 2
    Dernier message: 17/12/2009, 18h40
  2. Aligner les titres des colonnes dans un datagrid
    Par bonnet85 dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 02/04/2008, 16h01
  3. recuperer les titres des colonnes
    Par oscar.cesar dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/02/2008, 08h36
  4. Probleme d'affichage dans les titres des fenetres
    Par pierrot10 dans le forum Windows XP
    Réponses: 4
    Dernier message: 24/01/2008, 09h01
  5. [dbGrid]Image dans le titre des colonnes d'un dbGrid
    Par dleu dans le forum Bases de données
    Réponses: 1
    Dernier message: 31/08/2004, 18h01

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