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 :

Dans un DBGrid, modifier la police d'une ligne en fonction d'un champ [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 384
    Points : 9 745
    Points
    9 745
    Par défaut Dans un DBGrid, modifier la police d'une ligne en fonction d'un champ
    Bonjour,
    Dans un dbgrid, j'affiche la liste du personnel de la société. Dans cette liste, il y a le personnel actuel et le personnel qui est parti (quelle qu'en soit la raison).
    Je n'affiche, par défaut que le personnel actuel. Mais, selon un Checkbox, je peux choisir ou non d'afficher en plus le personnel "parti".

    Je passe par un TZQuery (de Zeos) et j'ai une requête paramétrée. A chaque changement du checkbox, je fais un "disablecontrols" sur le ZQuery, je le ferme, mets à jour le paramètre, ouvre le ZQuery et fais un "enablecontrols".

    Jusque là, ça va !

    Le problème, c'est que je souhaite mettre en évidence le personnel "parti". Pour cela, je me suis dit, je vais mettre les colonnes en italique des lignes "parti".
    Pour cela je me suis dit que j'allais utilisé le "OnColumnDrawCell", modifier le "column.font.style".

    Voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure Tfrm_ChxUser.grd_UsersDrawColumnCell(Sender: TObject;
      const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
    begin
      If SQL_Userusr_statut.AsString='N' Then //Ça veut dire que la personne est "parti"
        Column.Font.Style:=[ fsItalic]
      Else
        Column.Font.Style:=[];
    end;
    Ça me provoque un affichage clignotant horrible et il y a de l'italique ou pas un peut partout...
    Je pense que je m'y prends comme un manche, mais je ne vois pas comment faire.

    Quelqu'un a une idée ?

    Merci d'avance
    JS
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

  2. #2
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 556
    Points : 3 932
    Points
    3 932
    Par défaut
    Salut

    Ca fait longtemps que je n'ai pas fait ce genre de code(et encode dans Delphi) alors j'ai dû rechercher un peu dans mes souvenirs.

    La propriété Column.Font vaut pour toute la colonne et le gestionnaire est appelé cellule par cellule, ce qui explique sans doute l'effet de clignotement et l'affichage erroné de l'italique.

    Comme tu es en cours de dessin sur le canevas quand ce gestionnaire est appelé, il est logique d'agir plutôt sur les propriétés du canevas de la grille. Ainsi, ton code doit s'écrire de préférence comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // La propriété grd_Users.DefaultDrawing vaut True
    procedure Tfrm_ChxUser.grd_UsersDrawColumnCell(Sender: TObject;
      const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
    begin
      If SQL_Userusr_statut.AsString='N' Then //Ça veut dire que la personne est "parti"
      begin
        grd_Users.Canvas.Font.Style:=[ fsItalic]
        grd_Users.DefaultDrawColumnCell(Rect, DataCol,Column, State);
      end;
    end;
    Assez curieusement, l'appel à DefaultDrawColumnCell est nécessaire pour que tout se passe bien.

    Il ne me semble pas que cela se passait comme cela dans Delphi.

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  3. #3
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Bonjour

    Eric a globalement raison, mais il me semble qu'il faut appeler DefaultDrawColumnCell dans tous les cas, pas seulement pour les lignes qu'on veut mettre en italiques, sinon quand seront dessinées les autres ?

    Il est toutefois plus simple d'utiliser OnPrepareCanvas qui permet d'obtenir le même résultat sans avoir à dessiner, juste en définissant les attributs du texte ou des cellules.
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  4. #4
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 384
    Points : 9 745
    Points
    9 745
    Par défaut
    Bonjour,

    Et merci de vos réponses.

    En fait, ça ne marche pas en utilisant UsersDrawColumnCell (avec DefaultDrawing à faux ou à vrai).
    Comme le dit Tintinux, il faut utiliser OnPrepareCanvas.

    J'ai fais ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure Tfrm_ChxUser.grd_UsersPrepareCanvas(sender: TObject;
      DataCol: Integer; Column: TColumn; AState: TGridDrawState);
    begin
      If SQL_Userusr_statut.AsString='N' Then // Ça veut dire que la personne est "parti"
        Begin
          If Not (fsItalic in grd_Users.Canvas.Font.Style) Then
            grd_Users.Canvas.Font.Style:=grd_Users.Canvas.Font.Style+[fsItalic];
        end
        Else
          If fsItalic in grd_Users.Canvas.Font.Style Then
            grd_Users.Canvas.Font.Style:=grd_Users.Canvas.Font.Style-[fsItalic];
    end;
    Et ça fonctionne nickel.

    Encore merci à vous deux.
    JS
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

  5. #5
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 556
    Points : 3 932
    Points
    3 932
    Par défaut
    Salut

    @Jon Shannow: ma solution fonctionne, je l'ai testée avec la dernière version de Lazarus et les composants ZeosDB (sur une base SqLite) car j'ai remarqué que les composant SqlDb n'ont pas toujours un bon comportement. Je peux fournir mon exemple éventuellement.

    @tintinux:après plusieurs essais j'ai retenu la solution que j'ai publié. L'appel à DefaultDrawColumnCell n'est semble-t-il pas utile pour le cas par défaut. Ce comportement est, je trouve aussi, assez bizarre. Cela m'a laissé penser que l'affichage par défaut pouvait être réalisé deux fois, il faudrait analyser en profondeur le code du composant pour obtenir la réponse.

    Je ne connaissais pas l'événement OnPrepareCanvas car je me base sur mon expérience avec Delphi7 dans laquelle cet événement n'existe pas. Ca semble plus efficace, il faudra que je teste cela.

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  6. #6
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 384
    Points : 9 745
    Points
    9 745
    Par défaut
    E-ric, la base que j'utilise est MySQL, et je suis en Lazarus 1.2.0 sous Seven 64 bits, et ta solution ne fonctionnait pas. Désolé. Par contre, ça marche nickel avec OnPrepareCanvas.
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

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

Discussions similaires

  1. Comment modifier la police d'une chaine de caractère dans un tableau excel ?
    Par cle.mentito dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/03/2015, 23h11
  2. Réponses: 2
    Dernier message: 26/04/2012, 17h20
  3. Modifier la hauteur d'une ligne dans une feuille Excel
    Par Maxence45 dans le forum Excel
    Réponses: 1
    Dernier message: 23/11/2007, 06h41
  4. Modifier la police d'une "hint"
    Par emem dans le forum Langage
    Réponses: 3
    Dernier message: 14/06/2004, 07h19

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