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 :

DBGrid : hauteur de ligne variable [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 44
    Points : 38
    Points
    38
    Par défaut DBGrid : hauteur de ligne variable
    Bonjour,

    J'utilise un DBGrid s'appuyant sur des données présentes dans un fichier DBF. Une colonne de ce fichier est de type ftMemo.

    Pour l'afficher convenablement dans mon DBgrid j'ai eu recours à DrawColumnCell et PrepareCanvas.
    J'arrive donc à afficher le contenu du mémo dans la cellule du DBGrid avec retour à la ligne et à colorer une ligne entière en fonction de la valeur d'une colonne.

    Je bloque sur la hauteur de la ligne. J'aimerais la faire varier en fonction du contenu de la colonne mémo.
    Mais impossible de déterminer comment agir sur cette hauteur. J'ai pensé à cela :
    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
    procedure Tf_menu.grid_demandePrepareCanvas(sender: TObject; DataCol: Integer;
      Column: TColumn; AState: TGridDrawState);
    var
      grid_style: TTextStyle;
      t_comment: String;
      h_comment_mini, h_comment, nb_car_ligne,
        h_ligne, nb_lignes:integer;
     
    begin
      t_comment := '';
      nb_car_ligne := 75;
      h_comment_mini := 20;
      h_ligne := 20;
     
      t_comment := grid_demande.DataSource.DataSet.FieldByName('descriptio').AsString;
      nb_lignes := Ceil( Length( t_comment ) / nb_car_ligne );
      h_comment := nb_lignes * h_ligne;
      if h_comment < h_comment_mini then
         h_comment := h_comment_mini;
     
      // Hauteur de ligne adaptée au mémo
      grid_demande.Canvas.Height := h_comment;
     
      // Word wrap dans celulle MEMO
      grid_style := grid_demande.Canvas.TextStyle;
      grid_style.SingleLine := false;
      grid_style.Wordbreak := true;
      grid_demande.Canvas.TextStyle := grid_style;
     
      // Ligne grisée si demande soldée
      if grid_demande.DataSource.DataSet.FieldByName('etat').AsString = 'Soldée' then
      begin
        grid_demande.Canvas.Brush.Color := clGray;
        grid_demande.Canvas.Font.Color := clWhite;
      end;
    end;
    La propriété DBGrid.Canvas.Height est protected, et pas de méthode SetHeight ...

    Avez-vous une idée sur comment faire ?

    D'avance merci

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    voir ma réponse sur l'autre fil de discutions
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 44
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Anapurna
    il existe dans l’ancêtre du TdbGrid une propriété en protected qui se nome RowHeights

    il existe une astuce pour acceder au propriété protected d'un composant

    dans l'unité ou tu as besoin d’accéder a cette propriété de déclarer un nouveau type genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TAccesDbGrid = Class(TDBGRID);
    Là ou tu veut l'utiliser par exemple dans la méthode de dessin tu fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TAccesDbGrid(sender).Rowheigts[row] := maNouvelleValeur
    Merci Je vais creuser cela.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 44
    Points : 38
    Points
    38
    Par défaut
    Cela fonctionne nickel.

    Pour ceux que cela intéresse voici mon code :
    En tête de l'unité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    type
      type_grid = Class(TDBGrid);
     
      { Tf_menu }
     
      Tf_menu = class(TForm)
    Puis la procédure qui fait le job :
    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
    procedure Tf_menu.RefreshDbgrid();
    var
      h_ligne, h_comment_mini, nb_car_ligne, nb_lignes,
        h_comment, i : integer;
      t_comment:String;
    begin
      i := 0;
      h_ligne := 17;
      nb_car_ligne := 65;
     
      grid_demande.DataSource.DataSet.First;
      while not grid_demande.DataSource.DataSet.EOF do
      begin
        i := i+1;
        t_comment := grid_demande.DataSource.DataSet.FieldByName('descriptio').AsString;
        nb_lignes := Ceil( Length( t_comment ) / nb_car_ligne );
        h_comment := nb_lignes * h_ligne;
        if nb_lignes = 1 then h_comment := h_ligne;
     
        type_grid(grid_demande).RowHeights[i] := h_comment;
     
        grid_demande.DataSource.DataSet.Next;
      end;
      grid_demande.DataSource.DataSet.First;
    end;
    J'ai fait un code un peu à l'arrache pour calculer la hauteur de mes lignes, mais c'est assez propre au final ...

    Comme je suis bourrin et pas patient, je fais appel à cette procédure partout où j'agis sur les filtres du DataSet.

    Encore merci Anapurna !

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

Discussions similaires

  1. [AC-2003] Hauteur de ligne variable dans un état
    Par dvdbly dans le forum IHM
    Réponses: 1
    Dernier message: 26/08/2013, 12h20
  2. [XL-2007] Hauteur de ligne d'un tableau variable
    Par Mairequimby dans le forum Excel
    Réponses: 2
    Dernier message: 22/03/2010, 08h34
  3. [FPDF] [phpToPDF] Tableau avec \n et hauteur de ligne variable
    Par doudoustephane dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 08/01/2009, 12h25
  4. Hauteur de ligne dans une DBGRID
    Par Atrebate62 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 23/03/2006, 11h27
  5. hauteur de ligne dans un DBGrid
    Par mustang-gx dans le forum Bases de données
    Réponses: 9
    Dernier message: 15/03/2004, 20h27

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