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

Delphi Discussion :

WordWrap dans un TDBGrid


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de jambonstar
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 175
    Par défaut WordWrap dans un TDBGrid
    Bonjour,

    Je viens de passer pas mal de temps à chercher (sans succes) comment faire du WordWrap dans les cellules d'un TDBGrid.

    J'ai reussi à faire un Wordwrap dans un TStringGrid.
    Mais bien sur, le fonctionnement est completement different dans un TDBGrid...
    Quelqu'un aurait-il déjà eu à régler ce problème ?

    Merci d'avance pour votre aide..

  2. #2
    Membre Expert Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 553
    Par défaut
    Tu as dans la JVCL la JCVLUltimDBGrid qui a une propriété WordWrap.

  3. #3
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Citation Envoyé par jambonstar
    Mais bien sur, le fonctionnement est completement different dans un TDBGrid...
    Pas tant que ça, où est le problême ?

  4. #4
    Membre confirmé Avatar de jambonstar
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 175
    Par défaut
    Merci à vous 2 de vous intérresser à mon probleme.

    Je parviens à faire du wordwrap dans la DB Grid, grace à ce code (fourni dans un post précédent :

    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
           // La Variale doit être Passée en Var dans l'API
           RectEnVar := Rect;
     
           // Dessine avec une taille de Font Raisonnable
           TDBGrid(Sender).Canvas.Font.Size := 8; // une Fausse Font est affecté à la grille qui permet d'afficher de 2 à 5 lignes selon la largeur de la dite grille, eh oui, plus dur de redimensionner une DBGrid
           // Efface la Zone
           TDBGrid(Sender).Canvas.FillRect(Rect);
     
           TextToDrawing := Column.Field.AsString  ;
           hauteur := Windows.DrawText(
                            TDBGrid(Sender).Canvas.Handle,
                            PChar(TextToDrawing),
                            Length(TextToDrawing),
                            RectEnVar,
                            DT_WORDBREAK
                           );
    Seulement, c'est bien joli mais cela ne redimensionne pas les lignes qui contiennent un champs sur 2 ou plusieures lignes (champs wordwrapés)

    Understand ?

    Alors, disons que je me suis amusé (même si c'est un bien grand mot) à caster ma DBGrid comme si c'était un TDrawGrid simple, ce qui donne ça :

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    procedure TFmCtrlGrid.BST7DBGrid1DrawColumnCell(Sender: TObject;
      const Rect: TRect; DataCol: Integer; Column: TColumn;
      State: TGridDrawState);
    var
       RectEnVar, ARect: TRect;
       TextToDrawing: String;
       Hauteur,c,r,Arow,Acol,ColCount : Integer;
     
    begin
      if Assigned(Column.Field) then begin
     
        // Obtenir les num de colonne et de ligne en cours
        for c := 0 to TDrawGrid(Sender).ColCount - 1 do
          for r := 0 to TDrawGrid(Sender).RowCount - 1 do
          begin
            ARect := TDrawGrid(Sender).CellRect(c,r);
     
            if (ARect.Top-1 = TDrawGrid(Sender).RowHeights[0])
                and (ARect.Left-1 = TDrawGrid(Sender).ColWidths[0]) then
              fFirstCol := c;
     
            if (ARect.Top > 0) and (ARect.Left > 0) then
              ColCount := c;
     
     
            if (ARect.Top = Rect.Top) and (ARect.Left = Rect.Left) then
            begin
              ARow := r;
              ACol := c;
     
            end;
          end;
     
        if ACol = fFirstCol then fHauteur := TDrawGrid(Sender).DefaultRowHeight;
     
           // La Variale doit être Passée en Var dans l'API
           RectEnVar := Rect;
     
           // Dessine avec une taille de Font Raisonnable
           TDBGrid(Sender).Canvas.Font.Size := 8; // une Fausse Font est affecté à la grille qui permet d'afficher de 2 à 5 lignes selon la largeur de la dite grille, eh oui, plus dur de redimensionner une DBGrid
           // Efface la Zone
           TDBGrid(Sender).Canvas.FillRect(Rect);
     
           TextToDrawing := Column.Field.AsString  ;
           hauteur := Windows.DrawText(
                            TDBGrid(Sender).Canvas.Handle,
                            PChar(TextToDrawing),
                            Length(TextToDrawing),
                            RectEnVar,
                            DT_WORDBREAK
                           );
     
          if Hauteur > fHauteur then fHauteur := Hauteur;
     
     
    //        TDrawGrid(Sender).RowHeights[ARow] := fhauteur
          if (ACol = ColCount) {and (TDrawGrid(Sender).RowHeights[ARow] <= fHauteur)} then
            TDrawGrid(Sender).RowHeights[ARow] := fHauteur;
     
     
     
         end;
     
    end;
    C'est horrible, mais ça à le mérite de faire ce que je souhaite.
    Sauf que lorsque je touche à la property RowHeights, je rerentre automatiquement dans le invalidate de la TDrawGrid ( ou DBGrid) et alors la grille va mettre loooontemps à ce dessiner completement.

    Enfin essayez vous allez voir.

    Merci de votre aide.

  5. #5
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Haaaaaaa ouais.....

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 094
    Par défaut
    Tu peux voir mon exemple complet ici "http://www.developpez.net/forums/showthread.php?t=268319#7"

    Tu as oublié le plus important

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    BST7DBGrid1.Columns[1].Width := BST7DBGrid1.Width - BST7DBGrid1.Columns[0].Width - BST7DBGrid1.Columns[2].Width - (GetSystemMetrics(SM_CXVSCROLL) * 2) - 4;
         BST7DBGrid1.Font.Height := -11 * Max(5 - (BST7DBGrid1.Width div 200), 2);
    Ce code ci dessus, permet d'agrandir la font en fonction de la largeur de la grille, ainsi en 800 de width tu as 2 lignes visibles, en 200 tu en as 5 de visibles pour avoir un maximum de textes ...

    ou plus simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BST7DBGrid1.Font.size := 32
    Cela permet d'agrandir les cellules, par contre dans le Canvas tu as une plus petite font ... je l'ai utilisé, cela fonctionne très bien ...
    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

  7. #7
    Membre confirmé Avatar de jambonstar
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 175
    Par défaut
    Salut, c'est effectivement ton code que j'avais récupéré (je ne me souvenais plus), donc déjà merci.

    Par contre je ne comprends pas ou dois-je mettre ce 2° code...
    Merci

  8. #8
    Membre confirmé Avatar de jambonstar
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 175
    Par défaut
    J'ai placé ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
           BST7DBGrid1.Columns[1].Width := BST7DBGrid1.Width - BST7DBGrid1.Columns[0].Width - BST7DBGrid1.Columns[2].Width - (GetSystemMetrics(SM_CXVSCROLL) * 2) - 4;
           BST7DBGrid1.Font.Height := -11 * Max(5 - (BST7DBGrid1.Width div 200), 2);

    Dans un resize de ma fiche, et éffectivement, ca permet d'agrandir les lignes.
    On peut également le faire avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TDrawGrid(Sender).DefaultRowHeight := XXX; // où Sender et un DBGrid.
    Mais le problème c'est que ca agrandi toutes les lignes... et pas seulement les lignes qui en ont besoin.

Discussions similaires

  1. [débutante] Ajout de composant dans une TDBGrid
    Par lilo415 dans le forum Delphi
    Réponses: 9
    Dernier message: 28/02/2007, 10h13
  2. [VB6] Case à cocher dans un TDBGrid
    Par unacsed dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 11/08/2006, 09h54
  3. Boucle For dans un TDBGrid
    Par Latipolia dans le forum C++Builder
    Réponses: 28
    Dernier message: 14/06/2005, 12h12
  4. tdblookupcombobox dans un tdbgrid
    Par strofe dans le forum Bases de données
    Réponses: 1
    Dernier message: 24/05/2005, 02h19
  5. Recherche rapide dans un TDBGrid
    Par Dinytro dans le forum C++Builder
    Réponses: 5
    Dernier message: 10/03/2005, 00h29

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