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 :

TDBGrid : ajustement automatique de RowHeights sur des contenus multilignes [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Invité
    Invité(e)
    Par défaut TDBGrid : ajustement automatique de RowHeights sur des contenus multilignes
    Bonjour,

    Si cela peut vous être utile, comme je n'ai pas trouvé de code sous Lazarus réglant ce problème, je me suis basé sur la résolution d'un problème identique que j'ai rencontré récemment sur des TStringGrids. Petites vidéos win.avi et nux.avi.
    Le code
    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
     
    uses
     [...] 
     Grids, LCLIntf {DrawText},  LCLType {DT_CALCRECT or DT_WORDBREAK};
     
    type
     [...]
     TPublicCustomGrid = class(TCustomGrid);  
     
    procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    var
      aRect, bRect : TRect;
      sTmp : String;
      iRow : Integer;
    begin
     if Column.FieldName = 'vodesign' then begin   //Colonne concernée
      sTmp := column.Field.DataSet.FieldByName('vodesign').AsString;
      iRow := DBGrid1.DataSource.DataSet.RecNo;
      with (Sender as TDBGrid) do begin
       Canvas.FillRect(Rect);
       Canvas.FillRect(bRect);
       bRect := Rect;
       DrawText(Canvas.Handle, PChar(sTmp), length(sTmp), bRect,
                DT_CALCRECT or DT_WORDBREAK);
       if (bRect.Bottom - bRect.Top) > DBGrid1.DefaultRowHeight then
        TPublicCustomGrid(DBGrid1).RowHeights[iRow] := bRect.Bottom - bRect.Top
       else
        TPublicCustomGrid(DBGrid1).RowHeights[iRow] := DBGrid1.DefaultRowHeight;
       aRect := Rect; {Can't assign values to const variable}
       DrawText(Canvas.Handle, PChar(sTmp), length(sTmp), aRect, DT_WORDBREAK);
      end;
     end;
    end;
    Le principe est le même que pour la TStringGrid. Seul le Rect étant défini comme constante m'a obligé à utiliser une variable aRect.

    Cordialement. Gilles
    Testé sous Win 32 (Seven) : lazarus 0.9.31-31448 fpc-2.4.4-20110629 et Ubuntu 32 (10 & 11.04) : lazarus 0.9.31.31827 fpc 2.4.5-110730 i386
    Dernière modification par Invité ; 03/08/2011 à 14h48. Motif: Orthographe

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

    Problème : Ma DbGrid d'essai était associée à un Dataset.RecordCount = TCustomDbGrid(DbGrid1).VisibleRowCount. Sur une table plus importante (RecordCount > VisibleCount), si on descend dans la partie non visible de la dbGrid j'ai une erreur avec le iRow : List index (16) out of bounds qui est à associer aux 15 lignes visibles (+1 ligne FixedCol).

    TPublicCustomGrid(DbGrid1).VisibleRowCount --> Renvoie 15
    TPublicCustomGrid(DbGrid1).RowCount --> Renvoie 16 ? (RecordCount --> 3003)
    TPublicCustomGrid(DbGrid1).TopRow --> Renvoie 1 quelque soit le contenu de la ligne 1 donc quelque soit la position du scrollbar?

    Une tentative de modification par codage du TPublicCustomGrid(DbGrid1).RowCount en l'associant au Dataset.RecordCount par exemple entraîne des plantages "divers". Il semble que les propriétés TCustomGrid(DbGrid1) ou TCustomDBGrid(DbGrid1) soient complètement déconnectées du Dataset qui l'alimente sous Lazarus. Plus exactement, chaque Row de la DbGrid semble être plutôt associée à un (RecNo mod VisibleRowCount) ?? Bref, la partie avec les propriétés protégées fonctionne un peu comme une StringGrid de taille fixe (15 lignes dans mon cas) dans laquelle "coulisserait" les enregistrements du Dataset.

    Des exemples de codes que j'ai trouvés sous Delphi semblent être très différents au niveau de ce comportement... Je ne dispose pas de Delphi pour vérifier. Est-ce le cas ? Et dans le cas contraire, quel est intérêt de ces propriétés protected et plus généralement de cette approche ?

    Cordialement. Gilles
    Dernière modification par Invité ; 09/08/2011 à 23h50.

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

    Suite à une petite discussion avec les "gens" de Lazarus, j'ai compris le problème rencontré. Donc, je l'ai réglé en créant un composant dérivé de la dbGrid. Je peux le mettre à disposition sachant que je ne le maintiendrai pas : je n'ai pas pu résoudre avec les chaînes Zconnect --> dbGrid les mises à jour sous Thread.

    Par contre, j'ai réglé ce problème en créant une "dbStringGrid" : je peux y charger une partie d'une table en SELECT... LIMIT puis l'autre partie en Thread en SELECT OFFSET rendant ainsi l'utilisation de la Form quasi immédiate même avec un nombre d'enregistrements important. Ceci permet également un Refresh de la Grid en tâche de fond sans perturber l'utilisation de la Form par l'opérateur. La chaîne est réduite alors à un Connecteur+Dataset+dbStringGrid.

    Cordialement. Gilles

  4. #4
    Membre habitué Avatar de stfanny31
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 254
    Points : 163
    Points
    163
    Par défaut
    salut
    je trouve magnifique ce que vous arrivé a faire avec les colonne
    cela fait plusieurs mois que je essaye de faire que mes ligne soit ajuster automatiquement au contenu comme dans votre vidéo mais j'y arrive pas vraiment
    si vous pouvez m'aidé
    merci bcp

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

    Désolé pour cette réponse tardive. Je m'étais interdit de "toucher" à Lazarus pendant 3 semaines pour ne pas "polluer" ma découverte de FMX durant cette période. Je réinstalle donc aujourd'hui la dernière release de Lazarus... en attendant, peut-être, la cross-compilation Linux avec Delphi.

    J'ai bien incorporé ces fonctions d'ajustement dans des composants mais je ne diffuse pas ceux-ci parce qu'ils sont incomplets puisque seulement adaptés à mes besoins.

    Mais je peux, si vous le désirez, implanter dans un TyourStringGrid un embryon des propriétés et méthodes que vous évoquez (ie telles que je les utilise actuellement). Il reste à préciser les besoins exacts (par la messagerie du forum peut-être).

    Cordialement. Gilles.
    Dernière modification par Invité ; 09/05/2012 à 13h01. Motif: Amélioration syntaxe

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

Discussions similaires

  1. Désactiver l'ajustement automatique du texte sur mobile
    Par titipucca1 dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 14/06/2014, 15h06
  2. [XL-2010] Filtrer sur des contenus de cellules en vba
    Par drabmol dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/03/2013, 14h38
  3. Réponses: 1
    Dernier message: 14/07/2011, 18h39
  4. [AC-2007] Ajuster automatiquement une impression sur 1 page
    Par Lionel69260 dans le forum IHM
    Réponses: 1
    Dernier message: 19/10/2010, 22h09
  5. Réponses: 2
    Dernier message: 24/02/2010, 10h26

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